ARM Cortex-M之彙編小結(1)

ARM Cortex-M之彙編小結(1)

最近在學習ARM Cortex-M,許久沒有再使用匯編的小弟,看到一段彙編命令十分之頭疼。耗費一天時間之後,終於對這段代碼有所瞭解,作爲學習筆記記錄一下。

ldr

在ARM指令集中,ldr指令即可能是大範圍的地址讀取僞指令,也可能是內存訪問指令,當它的第二個參數之前有“=”時,表示僞指令,否則是內存訪問指令,比如 :

LDR r0,=name, 像這種帶等號的是僞指令, 而不是ARM指令。 LDR 僞指令用於加載立即數或一個地址值到指定寄存器.

  1. 如果name是立即數的話: LDR R0,=0x123 ;將0x123存入R0
  2. 如果name是個標識符: LDR R0,=name ;將name的地址存入R0
  3. 如果name加有[]符號的話: LDR R0,[R1] ;將R1所指向的地址存儲的值存入R0
  4. 如果name有[]的表達式的話: LDR R0,[R1, R2] ;將R1+R2所指向的地址存儲的值存入R0

str

把一個寄存器按字存儲到存儲器中

  1. str r1, [r2, #4] // 將r1的數據保存到地址爲r2+4的內存單元中
  2. str r1, [r2] // 將r1的數據保存到地址爲r2的內存單元中
  3. 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
   

目前就做這些總結了,以後有新的知識,在做補充.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章