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