第六章 atpcs介紹
在彙編編譯器中使用-apcs選項。
6.1.2暫存器使用規則
子程式使用r0~r3來傳遞引數。用r4~r11來儲存區域性變數,thumb使用r4~r7。r12記作ip,呼叫scratch暫存器。r13記作sp,用作資料堆疊指標。r14記作lr,用作儲存子程式的返回位址。r15記作pc,是程式計數器。
6.1.3資料棧使用規則
有四種堆疊方向:
fd、fa、ed、ea
atpcs規定使用fd
6.1.4引數傳遞規則
1、引數可變:引數不超過4,使用r0~r3,超過則將多的引數送到資料棧中儲存
2、引數固定:第乙個引數,通過r0~r3,其他引數使用資料棧。
3、結果返回:結果為32位整數,使用r0;結果為64位,使用r0和r1;結果為浮點,使用f0、d0或者s0;
第七章 arm和thumb混合程式設計
狀態切換指令:
blx 、bx 目標位址
ldr、ldm及pop 向pc暫存器賦值
area addreg ,code ,readonly
entry
main
adr r0,thumbprog+1 ;儲存單元的位址肯定是偶數,也就是最低位肯定是0,但arm與thumb之間的切換是
;通過rn的最低位來判斷的,1為thumb,0為arm
bx r0 ;跳轉到thumbpro,並且程式切換到thumb狀態
code16
thumbprog
mov r2,#2
mov r3,#3
add r2,r2,r3
adr r0,armprog
bx r0 ;跳轉到armprog,並且切換到arm狀態
code32
armprog
mov r4,#4
mov r5,#5
add r4,r4,r5
stop
mov r0,#0x18
ldr r1,=0x20026
swi 0x123456
end//c程式呼叫匯程式設計序
#include
extern void strcopy(char *d,const char *s) ; //使用關鍵字extern宣告外部函式,即呼叫的匯程式設計序
int main(void)
const char *srcstr="source string";
char dststr="destination string";
printf("before copying :/n");
printf("%s/n %s/n",srcstr,dststr);
strcopy(dststr,srcstr);
printf("after copying :/n");
printf("%s/n %s/n",srcstr,dststr);
return 0;
;匯程式設計序
area strcopy ,code,readonly
export strcopy //使用export偽操作宣告匯程式設計序
strcopy
ldrb r2,[r1],#1 //暫存器r1中存放第srcstr位址
strb r2,[r0],#1
cmp r2,#0
bne strcopy
mov pc,lr
end;匯程式設計序呼叫c程式
int sum(int a,int b,int c,int d, int e)
return a+b+c+d+e;
export callsum
area f ,code ,readonly
import sum ;使用import 宣告c程式sum()
callsum
str lr,sp! ;儲存返回位址
add r1, r0,r0 ;假設進入程式時r0=i,設r1=2i
add r2,r1,r0
add r3,r1,r2
str r3,[sp,#-4] ! ;第五個引數通過資料棧傳遞
add r3,r1,r1
bl sum
add sp,sp,#4 ;調整資料棧指標,準備返回
ldr pc,[sp],#4 ;返回
end
ARM體系結構與程式設計
arm處理器的7中執行模式 usr fiq irq svc abt und sys。arm處理器共37個暫存器 31個通用暫存器 未備份暫存器r0 r7,在全部模式下指的都是同乙個物理暫存器 備份暫存器r8 r12,每乙個暫存器相應兩個不同的物理暫存器。對於r13 sp 和r14 lr 來說,每乙個...
ARM體系結構與程式設計學習(五)
ldr rd,label 示例 字串複製 example 2.7 顯示了用乙個字串覆蓋另乙個字串的 arm 例程。該例程使用ldr偽指令從乙個資料節中載入兩個字串的位址。有以下幾點需要特別注意 dcb dcb指令定義乙個或多個儲存位元組。除了整數值之外,dcb還接受帶引號的字串。字串的每個字元均存放...
ARM體系結構與程式設計學習(六)
adr偽指令例項 設定本段程式的名稱及屬性 area adrlabel code,readonly entry start 跳轉到子程式func執行 bl func 呼叫angel swireason reportexception arm semihosting swi stop mov r0,0...