打开MDK或者keil软件,点击Project,点击New uVision Project:
选择项目路径,设置工程名称:
选择STM32103ZE
选择CMSIS下的CORE和Device下的Startup(本次实验也可不添加):
添加main.c文件
#include2.2func.sextern void Init_1(void); int main(){ Init_1(); return 0; }
AREA MY_FUNCTION,CODE,READonLY EXPORT Init_1 ; 与在c文件中定义的Init_1函数关联起来 ; 高级语言中的声明和使用变量其实是对板子寄存器的使用,所以我们只需要直接使用寄存器即可 Init_1 MOV R1,#0 ; 设R1寄存器为i MOV R2,#0 ; 设R2寄存器为j LOOP ; 写在最左边的是程序段的段名,执行跳转程序时用到 CMP R1,#10 ; 比较R1和10的大小 BHS LOOP_END ; 如果R1大于等于10,则跳转到LOOP_END程序段,反之忽略该语句,直接执行下面的语句 ADD R2,#1 ; j++ ADD R1,#1 ; i++ B LOOP ; 循环 LOOP_END NOP END ; 必须空格后再写END,不然会被认为是段名,表示程序结束三、C语言调用汇编 3.1无参数调用 3.1.1修改debug参数
选择魔法棒,点击Debug,勾选Use Simulator,将左下角DIalog DLL中内容改为DARMSTM.DLL,将Parameter内容改为*-pSTM32F103C8*:
按F9设置5个断点:
运行结果:
debug后点击run to cursor line(运行到光标行)观察R1R2值
此时R1大于10则跳出循环LOOP END
可看到R1和R2成功有0加到10
main.c:
# includeextern int Init_1(int x); int main(){ int xx = Init_1(10); printf("%d", xx); return 0; }
Func.s:
AREA MY_Function,CODE,READonLY EXPORT Init_1 ; 与在c文件中定义的Init_1函数关联起来 ; 高级语言中的声明和使用变量其实是对板子寄存器的使用,所以我们只需要直接使用寄存器即可 Init_1 ADD R0,#100 ; 将传入的值+100 MOV PC,LR ; 返回R0 LOOP ; 写在最左边的是程序段的段名,执行跳转程序时用到 CMP R1,#10 ; 比较R1和10的大小 BHS LOOP_END ; 如果R1大于等于10,则跳转到LOOP_END程序段,反之忽略该语句,直接执行下面的语句 ADD R2,#1 ; j++ ADD R1,#1 ; i++ B LOOP ; 循环 LOOP_END NOP END ; 必须空格后再写END,不然会被认为是段名,表示程序结束3.2.2编译调试
在ARM中,子函数的参数值传递按顺序存放在R0,R1,R2,R3里,超过4个参数值传递放栈帧里。因此Init_1(10)传入的10放到R0,由MOV PC,LR返回110。
修改代码后记得设置断点。
编译并调试:
可发现此时,xx的值为0x6E,即110,调用成功。
AREA MY_Function,CODE,READonLY EXPORT Init_1 ; 与在c文件中定义的Init_1函数关联起来 import get5 ; 声明get5 为外部引用 ; 高级语言中的声明和使用变量其实是对板子寄存器的使用,所以我们只需要直接使用寄存器即可 Init_1 MOV R1,#0 ; 设R1寄存器为i MOV R2,#0 ; 设R2寄存器为j LOOP ; 写在最左边的是程序段的段名,执行跳转程序时用到 CMP R1,#10 ; 比较R1和10的大小 BHS LOOP_END ; 如果R1大于等于10,则跳转到LOOP_END程序段,反之忽略该语句,直接执行下面的语句 ADD R2,#1 ; j++ ADD R1,#1 ; i++ BL get5 ; 调用get5,返回的值传入R0 B LOOP ; 循环 LOOP_END NOP END ; 必须空格后再写END,不然会被认为是段名,表示程序结束4.1.2main.c
# include4.2断点设置extern void Init_1(void); int get5(void); int main(){ printf("Begin...n"); Init_1(); return 0; } int get5(){ return 5; }
编译并调试:
执行get5后,R0变成了5,即成功调用
STM32下C语言与汇编语言混合编程
C语言嵌套汇编语言



