C语言调用汇编 |
您所在的位置:网站首页 › c语言使用汇编 › C语言调用汇编 |
程序的入口是main,在main里调用汇编的函数。 首先要解决怎么定义函数的问题 在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。 在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数名开始的段 例子是一个六个数相加的函数。 C语言: #include extern int sum(int a,int b,int c,int d,int e,int f); int main(){ int result = sum(1,2,3,4,5,6); return 0; }汇编代码: AREA EXAMPLE,CODE,READONLY EXPORT sum ENTRY sum ADD R0,R0,R1 ADD R2,R2,R3 ADD R0,R0,R2 LDR R4,[SP] LDR R5,[SP,#4] ADD R4,R4,R5 ADD R0,R4,R0 BX LR END其实关键的问题是参数和返回值。 我们能看到,C里面调用这个函数,C给里面传参数。 汇编是怎么接受这些参数的呢? 4个以内的参数,直接存放在R0~R3 这4个寄存器里面。 4个以后的参数放在堆栈里。 如果函数有返回值,那么返回值放在R0里。 Debug看看编译器是怎么处理的,我们就怎样把参数取出来。 还是比较易懂 首先是 R0 =6 R1=5 R2=3 R3=4 然后把R1的值放在堆栈里,R13=5,然后R1=2 然后吧R0的值放在堆栈的下一个位置,R13+4=6,然后R0=1. 之后就是: R0=1,R1=2,R2=3,R3=4 堆栈里面: 所以取参数的时候就是: LDR R4,[SP];R4=5 LDR R5,[SP,#4];R5=6把相加的结果放在R0,然后BX LR返回 可以看到: 可以验证的确R0是存放返回值的。 原文链接 参考文章 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |