c語言與彙編混編寫法
R13 (stack pointer)
R14 (Link Register)
R15 (program counter)
c語言中內嵌彙編的規則:
內嵌彙編器與armasm的區別:
訪問全域性變數:
unsigned char LDRB/ STRB
unsigned short LDRH/STRH
unsigned int LDR/STR
char LDRB/STRB
short LDRH/STRH
B 位元組操作
H 雙位元組操作
c語言調用匯程式設計序
在彙編中使用EXPORT 偽指令宣告本子程式,使其他程式可以呼叫該子程式
在c語言中使用extern來宣告外部函式
彙編程式
特別注意其中R0,R1 為預設的第一個引數和第二個引數
函式名稱只是一個標號而已,而其中的引數通過R0,R1來傳輸。
彙編中呼叫c語言
其中一個存在4個引數
彙編中呼叫方法
首先有一個import
然後將引數通過r0,r1,r2,r3,以及堆疊來傳遞資料
STR R3, [SP, #-4]!
滿遞增:
通過增大暫存器的地址向上增長, 堆疊指標指向內含有效資料項的最高地址
LDMFA/STRFA
空遞增
通過增大暫存器的地址向上增長,堆疊指標直線堆疊上的第一個空位置
LDMED/STRED
空遞減和空遞增與上面的意思相對。
以入棧後SP的值是增加還是減少為依據,可將堆疊型別劃分為遞增堆疊(向上生長)和遞減堆疊(向下生長);
STMFD SP!, {R1-R7, LR};將R1-R7以及LR,入棧滿遞減堆疊(FA 代表滿),至於為何叫做遞減???...疑問...
資料塊傳送 | 堆疊操作 | 說明 |
儲存 | 壓棧 | |
STMDA | STMED | 空遞減 |
STMIA | STMEA | 空遞增 |
STMDB | STMFD | 滿遞減 |
STMIB | STMFA | 滿遞增 |
資料塊傳送 | 堆疊操作 | 說明 |
載入 | 出棧 | |
LDMDA | LDMFA | 滿遞增 |
LDMIA | LDMFD | 滿遞減 |
LDMDB | LDMEA | 空遞增 |
LDMIB | LDMED | 空遞減 |
第二列中的ED、EA、FD、FA分別表示empty descend(空遞減)、 empty ascend(空遞增)、 full descend(滿遞減)、 full ascend(滿遞增),其含義是說,如果你採用的是空遞減(空遞增、滿遞減、滿遞增)堆疊的話,入棧操作則使用指令STMED(STMEA、STMFD、STMFA),出棧操作則使用指令LDMED(LDMEA、LDMFD、LDMFA)。從此你再也不會為你應該使用ia、ib、da還是db來實現出、入棧操作而苦惱了。
參考該文獲得