ldr rd, =label 示例: 字串複製
example 2.7 顯示了用乙個字串覆蓋另乙個字串的 arm **例程。 該例程使用ldr
偽指令從乙個資料節中載入兩個字串的位址。 有以下幾點需要特別注意:
dcb
dcb
指令定義乙個或多個儲存位元組。除了整數值之外,dcb
還接受帶引號的字串。 字串的每個字元均存放在連續的位元組中。 有關詳細資訊,請參閱dcb。
ldr, str
ldr
和str
指令使用後變址定址來更新其位址暫存器。例如,指令:
ldrb r2,[r1],#1用
r1
所指向的位址的內容載入r2
,然後將r1
增加 1。
example 2.7. 字串複製
area strcopy, code, readonlyentry ; mark first instruction to execute
start
ldr r1, =srcstr ; pointer to first string(把位址載入到r1)
ldr r0, =dststr ; pointer to second string
bl strcopy ; call subroutine to do copy
stop
mov r0, #0x18 ; angel_swireason_reportexception
svc #0x123456 ; arm semihosting (formerly swi)
strcopy
ldrb r2, [r1],#1 ; load byte and update address
strb r2, [r0],#1 ; store byte and update address
cmp r2, #0 ; check for zero terminator
bne strcopy ; keep going if not
mov pc,lr ; return
area strings, data, readwrite (定義資料區)
srcstr dcb "first string - source",0
dststr dcb "second string - destination",0
end
4.6.2 arm彙編例項
;設定本段程式的名稱及屬性
area block , code , readonly
;設定將要複製的字數
num equ 20
;標識程式入口點
entry
start
;r0暫存器指向源資料區src
ldr r0,=src
;r1暫存器指向目標資料區dst
ldr r1 ,=dst
;r2指定將要複製的字數
mov r2, #num
;設定資料棧指標(r13),用於儲存工作暫存器數值(設定sp堆疊開始位址為0x400)
mov sp,#0x400
;進行以8個字為單位的資料複製
blockcopy
;需要進行的以8個字為單位的複製次數
movs r3,r2,lsr #3
;對剩餘不足8個字的資料,,跳轉到copywords,以字為單位進行複製
beq copywords
;儲存工作暫存器
stmfd sp!,
octcopy
;從源資料讀取8個字的資料,放到8個工作暫存器中,並更新目標資料區指標r0
ldmia r0!,
;將這8個字資料寫入到目標資料區中,並更新目標資料區指標r1
stmia r1!,
;將塊複製次數減1
subs r3,r3,#1
;迴圈,直到完成以8字為單位的塊複製
bne octcopy
;恢復工作暫存器值
ldmfd sp!,
copywords
;剩餘不足8個字的資料的字數(邏輯與,把r2 前7 位扔掉)
ands r2,r2,#7
;資料複製完成
beq stop
wordcopy
;從源資料讀取1個字的資料,放到暫存器r3中,並更新目標資料區指標r0
ldr r3,[r0],#4
;將這r3中資料寫入到目標資料區中,並更新目標資料區指標r1
str r3 ,[r1],#4
;將字數減1
subs r2,r2,#1
;迴圈,直到完成以字為單位的資料複製
bne wordcopy
stop
;呼叫angel_swireason_reportexception
;arm semihosting swi
;從應用程式中退出
mov r0, #0x18
ldr r1,=0x20026
swi 0x123456
;定義資料區blockdata
area blockdata, data, readonly
;定義源資料src及目標資料區dst
src dcd 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst dcd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;結束彙編
end
ARM體系結構與程式設計
arm處理器的7中執行模式 usr fiq irq svc abt und sys。arm處理器共37個暫存器 31個通用暫存器 未備份暫存器r0 r7,在全部模式下指的都是同乙個物理暫存器 備份暫存器r8 r12,每乙個暫存器相應兩個不同的物理暫存器。對於r13 sp 和r14 lr 來說,每乙個...
ARM體系結構與程式設計學習(六)
adr偽指令例項 設定本段程式的名稱及屬性 area adrlabel code,readonly entry start 跳轉到子程式func執行 bl func 呼叫angel swireason reportexception arm semihosting swi stop mov r0,0...
ARM體系結構與程式設計學習(十)
第六章 atpcs介紹 在彙編編譯器中使用 apcs選項。6.1.2暫存器使用規則 子程式使用r0 r3來傳遞引數。用r4 r11來儲存區域性變數,thumb使用r4 r7。r12記作ip,呼叫scratch暫存器。r13記作sp,用作資料堆疊指標。r14記作lr,用作儲存子程式的返回位址。r15記...