1. 程式人生 > >c語言與彙編混編寫法

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來實現出、入棧操作而苦惱了。

參考該文獲得