ARM體系結構與程式設計學習(十)

2021-06-13 09:13:44 字數 2325 閱讀 5091

第六章 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...