ARM Cortex-M之彙編小結(1)
最近在學習ARM Cortex-M,許久沒有再使用匯編的小弟,看到一段彙編命令十分之頭疼。耗費一天時間之後,終於對這段代碼有所瞭解,作爲學習筆記記錄一下。
ldr
在ARM指令集中,ldr指令即可能是大範圍的地址讀取僞指令,也可能是內存訪問指令,當它的第二個參數之前有“=”時,表示僞指令,否則是內存訪問指令,比如 :
LDR r0,=name, 像這種帶等號的是僞指令, 而不是ARM指令。 LDR 僞指令用於加載立即數或一個地址值到指定寄存器.
- 如果name是立即數的話: LDR R0,=0x123 ;將0x123存入R0
- 如果name是個標識符: LDR R0,=name ;將name的地址存入R0
- 如果name加有[]符號的話: LDR R0,[R1] ;將R1所指向的地址存儲的值存入R0
- 如果name有[]的表達式的話: LDR R0,[R1, R2] ;將R1+R2所指向的地址存儲的值存入R0
str
把一個寄存器按字存儲到存儲器中
- str r1, [r2, #4] // 將r1的數據保存到地址爲r2+4的內存單元中
- str r1, [r2] // 將r1的數據保存到地址爲r2的內存單元中
- str r1, [r2], #4 // 將r1的數據保存到地址爲r2的內存單元中,然後r2=r2+4
b, bl, bcc
- B : 直接跳轉到制定的地方
- BL : 除跳轉外還將返回地址(bl的下一條指令的地址) 保存到lr寄存器中
- BCC: 如果標誌位C爲0的時候,就發生跳轉,否則繼續執行下一條指令. 一般會結合cmp 指令一起。
orr,
按位或,可以理解爲C 中的"|"
and
按位與,可以理解爲C 中的"&"
lsr
邏輯右移,可以理解爲C中的">>"
比如說:
lsr Rd, Rn, #4 ; Rd = Rn>>4
lsr Rd, Rn ; Rd >>= Rn
lsl
與lsr 類似,它是邏輯左移,可以理解爲C中的"<<"
bfi
BFI(位段插入指令),則把某個寄存器按LSB對齊的數值,拷貝到另一個寄存器的某個位段中,其格式爲 BFI.W Rd, Rn, #lsb, #width
例如,
LDR R0, =0x12345678
LDR R1, =0xAABBCCDD
BFI.W R1, R0, #8, #16
則執行後,R1= 0xAA5678DD (總是從Rn的最低位提取,#lsb只對Rd起作用——譯註)
code
ENTRY: main
main:
ldr r3, =0x20000000
ldr r0, =0x800
ldr r1, =0x200
ldr r2, #0
b LoopLoadImg
LoadImg:
ldr r4, [r3, r2]
str r4, [r0, r2]
add r2, r2, #4
LoopLoadImg:
cmp r1, r2
bcc LoadImg
SetVTOR:
ldr r0, =0x800
ldr r1, =0xE000ED08
str r0, [r1]
ldr sp, [r0]
ldr r4, [r0, #4]
bx r4
目前就做這些總結了,以後有新的知識,在做補充.