STM32的C与汇编语言混合编程

前言:本文内容提示

在上一次博客–ARM汇编程序调试——基于STM32汇编程序的编写基础上,继续学习Keil下STM32的C与汇编语言混合编程。任务:
1. 参考资料,完成C语言调用汇编函数;
2. 修改代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。请编程实现,并仿真跟踪调试;
3. 如果要求在汇编函数中调用一个 C语言写的函数,应该如何修改汇编代码?

一、C语言调用汇编函数

  1. 新建一个项目
    新建项目的步骤详见上次博客——ARM汇编程序调试——基于STM32汇编程序的编写中的一、新建项目

在目录下添加main.c和Func.s文件,具体如下:

请添加图片描述
请添加图片描述

建好的目录如下:

请添加图片描述

  1. 分别写入代码:

main.c

#include<stdio.h>
extern void Init_1();
int main(){
    
    
	Init_1();
	return 0;
}

Func.s

	AREA My_Function,CODE,READONLY ;固定格式
	EXPORT Init_1
		
Init_1
	MOV R1,#0
	MOV R2,#0
	
LOOP 
	CMP R1,#10
	BHS LOOP_END
	ADD R2,#1
	ADD R1,#1
	B LOOP
LOOP_END
	NOP
	
	END
  1. 仿真调试:

请添加图片描述

C语言调用汇编语言成功!

二、函数功能改为传入一个整型数x

修改代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。请编程实现,并仿真跟踪调试。

(一)ARM中参数是如何传递和使用的

我们先看看大佬博客中写的ARM中参数是如何传递和使用的:

  1. C语言调用函数传递参数的方法

C语言调用函数时,在32位程序中使用栈传递,而在64位程序中,传递方式和参数个数有关,当参数个数小于等于6个时,参数会使用寄存器被传递,当参数大于6个时,6个寄存器被分配后,会利用栈来传递多余的参数,且参数的传递都是从右到左压栈或是存入寄存器。
验证过程参考:https://blog.csdn.net/m0_55708805/article/details/117388229

  1. ARM中寄存器用法
  1. r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。—如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。
  2. r4-r11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。r11 是栈帧指针 fp。
  3. r12 是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。
  4. 寄存器 r13 是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。
  5. 寄存器 r14 是链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复
  6. 寄存器 r15 是程序计数器 pc。它不能用于任何其它用途。

利用寄存器传递参数时,参数值按顺序放在寄存器R0,R1,R2,R3中,当参数大于4个时,超过的参数值利用栈传递,函数返回时,若有返回值会利用寄存器R0存储返回。

原文链接:https://blog.csdn.net/qq_45659777/article/details/120651310

(二)实验实现

  1. 修改代码:

main.c

#include<stdio.h>

extern int Init_1(int x);

int main(){
    
    
	
	Init_1(10);
	
	return 0;
}

Func.s


    AREA My_Function,CODE,READONLY
	EXPORT Init_1
    ENTRY
		
Init_1
    ADD R0,R0,#100
	
	BX LR
	
	END
  1. 仿真调试:

请添加图片描述

  1. 经过仿真调试,可以看到R0寄存器的与推出的值一样。

三、汇编函数中调用C语言

汇编函数中调用一个C语言写的函数

  1. 修改代码
    main.c
#include<stdio.h>
extern int sum(int a,int b);
int sum(int a,int b){
    
    
  int c;
	a=15;
	b=14;
	c=a+b;
	return c;
}

Func.s

 AREA MYDATA, DATA
	IMPORT sum
 AREA MYCODE, CODE
	ENTRY
	EXPORT __main

__main

    BL sum
	
	BX LR
	
	END
  1. 仿真调试:结果与预算一致,c函数被成功调用

请添加图片描述

小小的总结

第一点C语言调用汇编函数 中是 C语言无参数调用汇编函数,第二点函数功能改为传入一个整型数x是C语言有参数调用汇编函数;汇编函数调用C语言其实和C语言调用汇编函数过程是差不多的。

参考文献

STM32的C与汇编语言混合编程

猜你喜欢

转载自blog.csdn.net/YouthBlood9/article/details/120709110