C語言調用匯編


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM