最近在學習arm cortex-m,許久沒有再使用彙編的小弟,看到一段彙編命令十分之頭疼。耗費一天時間之後,終於對這段**有所了解,作為學習筆記記錄一下。
在arm指令集中,ldr指令即可能是大範圍的位址讀取偽指令,也可能是記憶體訪問指令,當它的第二個引數之前有「=」時,表示偽指令,否則是記憶體訪問指令,比如 :
ldr r0,=name, 像這種帶等號的是偽指令, 而不是arm指令。 ldr 偽指令用於載入立即數或乙個位址值到指定暫存器.
如果name是立即數的話: ldr r0,=0x123 ;將0x123存入r0
如果name加有符號的話: ldr r0,[r1] ;將r1所指向的位址儲存的值存入r0
如果name有的表示式的話: ldr r0,[r1, r2] ;將r1+r2所指向的位址儲存的值存入r0
把乙個暫存器按字儲存到儲存器中str r1, [r2, #4] // 將r1的資料儲存到位址為r2+4的記憶體單元中
str r1, [r2] // 將r1的資料儲存到位址為r2的記憶體單元中
str r1, [r2], #4 // 將r1的資料儲存到位址為r2的記憶體單元中,然後r2=r2+4
按位或,可以理解為c 中的"|"
按位與,可以理解為c 中的"&"
邏輯右移,可以理解為c中的">>"比如說:
lsr rd, rn, #4 ; rd = rn>>4
lsr rd, rn ; rd >>= rn
與lsr 類似,它是邏輯左移,可以理解為c中的"<<"
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起作用——譯註)
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
目前就做這些總結了,以後有新的知識,在做補充. 彙編指令小結
彙編指令小結 more 本文主要是記錄一些遇到的arm彙編知識。彙編 以韋東山老師的 第7章nand flash實驗配套 13th link 4096 中的start.s為例 globl start start 硬體相關的設定 把外設的基位址告訴cpu peri port setup ldr r0,...
gdb反彙編小結
高位址 eip 上級函式返回位址 ebp 上級函式的ebp 當前函式a的ebp 即sfp框架指標 偏移量a local variables esp指向函式a新分配的區域性變數,區域性變數可以通過a的ebp 偏移量a訪問 f r arg n 函式b的第n個引數 a m arg 函式b的第.個引數 e ...
PowerPC 彙編指令小結
1.暫存器模型 2.記憶體訪問 li r7,123 stw r7,0 r1 store register r7 to the stack lwz r3,0 r1 load register r3 from the stack blrstw r7,0 r1 儲存r7到stack中,如果用stwu在同時...