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記...