目录
一、在C语言种调用汇编语言
1)代码实现
2) 仿真调试
二、在汇编语言中调用C语言
1) 代码实现
2)仿真调试
三、总结
四、参考内容
注:这是使用的是ARMCM3 设备
一、在C语言中调用汇编语言
1)代码实现
首先创建两个分别以C语言和汇编语言为基础的代码文件: main.c 和 func.s;
汇编语言中的函数功能为:传入一个整型数x,函数运行后返回整型数 x+100
① main.c
#includeextern int init(int x); //引用外部函数 int main(void) { int x=20; init(x); //调用外部函数 return 0; }
② func.s
AREA func, CODE, READonLY ;声明代码段func为只可读 EXPORT init ;与C文件中定义的init函数关联起来 init add r0,r0, #100 ;寄存器r0的值加上100并赋给r0 bx lr ;返回主函数
编译后显示没有错误:
2) 仿真调试
首先对调试环境进行一些设置:点击如下“魔法棒”图标;
再在Debug界面下选择“use Simulator”,选择好后点击“OK”即可;
接下来进行调试;
首先查看X的值为20,转化为十六进制后为14;
再在左上角选择单步调试,得到R0的值为78(十六进制),转化为十进制为120=100+20;
二、在汇编语言中调用C语言
1) 代码实现(功能与上述相同)
首先创建两个分别以C语言和汇编语言为基础的代码文件: func.c 和 asm_main.s;
① func.c
#includeextern void asm_main(); //引入汇编函数 int init(int x) { return x+100; } int main() { asm_main(); //调用汇编函数 return 0; }
② asm_main.s
AREA asm,CODE,READonLY ;声明代码段asm import init ;引入外部函数,即C语言函数init EXPORT asm_main ;声明,以便调用 asm_main mov r0, #20 ;使寄存器r0的值等于20 BL init ;调用外部函数,即C语言函数 bx lr ;返回主函数
编译后没有错误:
2)仿真调试
环境与上述相同:
首先查看R0的值为14(十六进制),转化为十进制为20;
单步运行后,调用外部函数init,R0的值为78,转化为十进制后为120=100+20;
三、 总结
无论是在C语言当中调用汇编语言,还是在汇编语言中调用C语言,都各自有各自的好处,但相对来说,用C语言调用汇编语言的效率更高一些,代码也相对简单直观一点。
四、参考内容
(1条消息) ARM下C语言和汇编语言混合编程_diyu-CSDN博客



