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

2021-06-13 09:13:44 字數 2990 閱讀 2831

adr偽指令例項

;設定本段程式的名稱及屬性

area   adrlabel ,code,readonly

entry

start

;跳轉到子程式func執行

bl  func

;呼叫angel_swireason_reportexception

;arm semihosting swi

stop

mov  r0,#0x18                  ;將0x18賦值給r0,0x18立即數對應巨集angel_swireason_reportexception

;正常退出

swi   0x123456                 ;結束程式,將控制權交給偵錯程式

;定義乙個資料緩衝區,用於生成位址標號相對於pc的偏移量

ltorg

func

;下面的偽指令adr被彙編成:sub  r0,pc ,#offset to start

adr  r0,start

;下面的偽指令adr被彙編成:add  r1,pc,#offset to dataarea

adr  r1,dataarea

;下面的偽指令adr彙編時錯誤,因為第二個運算元不能用dataarea+4300表示

;         adr  r2,dataarea+4300

;下面的偽指令adrl被彙編成兩條指令:

;          add  r2 ,pc,#offset1

;            add  r2,r2,#offset2

adrl   r3 ,dataarea+4300

;從子程式func返回

mov  pc,lr

;從當前位置起儲存8000位元組儲存單元

;並將其初始化為0

dataarea     space    8000

;結束彙編

end利用跳轉表實現程式跳轉例項

;設定本段程式的名稱和屬性

area  jump  ,code,readonly

;跳轉表中的子程式個數

num   equ   2

;程式執行的入口點

entry

start

;設定3個引數,然後呼叫子程式arithfunc,進行算術運算

mov  r0,#0

mov  r1,#3

mov  r2 ,#2

;呼叫子程式arithfunc

bl  arithfunc

stop

;呼叫angel_swireason_reportexception

;arm semihosting swi

;從應用程式中退出

mov  r0,#0x18

ldr   r1,=0x20026

swi  0x123456

;子程式arithfunc入口點

arithfunc

;判斷選擇子程式的引數是否在有效範圍內

cmp  r0,#num

movhs  pc, lr

;讀取跳轉表的基位址

adr  r3,jumptable

;根據引數r0的值跳轉到相應的子程式

ldr  pc,[r3,r0,lsl#2]

;跳轉表jumptable中儲存了各個子程式的位址

;在這裡有兩個子程式doadd和dosub

;當引數r0為0時選擇doadd

;當引數r0為1時選擇dosub

jumptable

dcd  doadd

dcd  dosub

;子程式doadd執行加法操作

doadd

add  r0 ,r1,r2

mov  pc,lr

;子程式dosub執行減法操作

dosub

sub  r0,r1,r2

mov pc,lr

;結束彙編

end偽指令ldr的用法例項

;設定本段程式的名稱及屬性

area    ldrlabel  ,code,readonly

;程式執行的入口點

entry

start

;跳轉到子程式func1及func2執行

bl   func1

bl   func2

;呼叫巨集angel_swireason_reportexception

;arm semihosting swi

;從應用程式中退出

mov   r0,#0x18

ldr    r1,=0x20026

swi   0x123456

func1

;下面偽指令被彙編成:ldr  r0,[pc,#offset to litpool1]

ldr  r0,=start

;下面偽指令被彙編成:ldr r1,[pc,#offset to litpool1]

ldr  r1,=darea+12

;下面偽指令被彙編成:ldr r2,[pc,#offset to litpool1]

ldr  r2,=darea+6000

;程式返回

mov  pc ,lr

;字元緩衝區literal pool 1

ltorg

func2

;下面的偽指令被彙編成:ldr  r3,[pc,#offset to litpool 1]

;共有前面的字元緩衝區

ldr  r3,=darea+6000

;下面的偽指令如果不注釋掉,彙編時會出錯

;因為字元緩衝區litpool 2 超出了被偽指令可以到達的範圍

;ldr r4,=darea+6004

;程式返回

mov  pc ,lr

;從當前位址開始,保留8000位元組的儲存單元

;並將其內容初始化為0

darea    space  8000

;字元緩衝區litpool2 應該從這裡開始

;它超出了前面被注釋掉的偽指令所能夠到達的範圍

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體系結構與程式設計學習(十)

第六章 atpcs介紹 在彙編編譯器中使用 apcs選項。6.1.2暫存器使用規則 子程式使用r0 r3來傳遞引數。用r4 r11來儲存區域性變數,thumb使用r4 r7。r12記作ip,呼叫scratch暫存器。r13記作sp,用作資料堆疊指標。r14記作lr,用作儲存子程式的返回位址。r15記...