码迷,mamicode.com
首页 > 编程语言 > 详细

C语言调用汇编

时间:2016-04-28 11:58:39      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

程序的入口是main,在main里调用汇编的函数。

首先要解决怎么定义函数的问题

 

在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。

在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数名开始的段

 

例子是一个六个数相加的函数。

C语言:

#include<stdio.h>

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是存放返回值的。

 

C语言调用汇编

标签:

原文地址:http://www.cnblogs.com/wzben/p/5441970.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!