8種尋址方式
寄存器尋址???mov?r1,r2 立即尋址????????mov?r#0xFF00 寄存器移位尋址?mov?r0,r1,lsl?#3? 寄存器間接尋址?ldr?r1,[r2]? 基址變址尋址??ldr?r1,[r2,#4] 多寄存器尋址??ldmia?r1!,{r2-r7,r12}? 堆棧尋址????????stmfd?sp!,(r2-r7,lr) 相對(duì)地址????????flag:beq?flag
指令后綴
B(byte)?????功能不變,操作長(zhǎng)度變?yōu)?位 H(half?word)????功能不變,操作長(zhǎng)度變?yōu)?6位 S(signed)???????功能不變,操作長(zhǎng)度變?yōu)橛蟹?hào) ????如ldr、ldrb、drh、ldrsb、 S(S標(biāo)志)??????功能不變,影響CPSR標(biāo)志位 ????如mov和movs
條件執(zhí)行后綴
mov?r0,r1???0?相當(dāng)于C語(yǔ)言當(dāng)中的r0=r1 moveq???r0,r1???0?如果eq后綴成立,則直接執(zhí)行mov?r0,r1;如果eq不成立,相當(dāng)于沒(méi)有 ????????0?類似于???C語(yǔ)言當(dāng)中的if(eq){r0=r1}
多級(jí)指令流水線
cpsr
:程序狀態(tài)寄存器,整個(gè)CPU只有一個(gè);而SPSR有5個(gè),分別在五種異常模式下,作用是當(dāng)普通模式進(jìn)入異常模式
時(shí),用來(lái)保存之前普通模式的CPSR的,以在返回普通模式是復(fù)原原來(lái)的CPSR.
跳轉(zhuǎn)指令
b???直接跳轉(zhuǎn) bl??跳轉(zhuǎn)前將返回地址保存到lr寄存器,一般用于子程序調(diào)用 bx??跳轉(zhuǎn)同時(shí)切換到ARM模式,一般用于異常處理的跳轉(zhuǎn)
訪存指令
單個(gè)字/半字/字節(jié)訪問(wèn)ldr/str 多字節(jié)訪問(wèn)?ldm/stm 8中后綴 ia??(increase?after)????先傳輸,再地址加4 ib??(increase?before)???先地址加4,再傳輸 da??(dacrease?after)????先傳輸,再地址減4 db??(decrease?before)???先地址減4,再傳輸
gun匯編中的一些符號(hào)
@用來(lái)作注釋,可以在行首也可以在代碼后面同一行直接跟,和C語(yǔ)言中//類似 #做注釋,一般放在行首,表示這一行都是注釋而不是代碼 :以冒號(hào)結(jié)尾的是標(biāo)號(hào) ?.點(diǎn)號(hào)在gun匯編中表示當(dāng)前指令的地址 #立即數(shù)前面要加#或$
常見(jiàn)的gun偽指令
.global_start???@給_start外部鏈接屬性 .section.text???@指定當(dāng)前段為代碼段 .ascii.byte.short.long.word? .quad.float.string??@定義數(shù)據(jù) .align?4????????@以16字節(jié)對(duì)齊????2^4 .balignl????16,0xabcdefgh???@對(duì)齊+(位)填充 .equ????????@類似于C中宏定義??? .end????????@文件結(jié)束 .arm/.code?32???@聲明以下為arm指令 .thumb/code?16??@聲明以下為thumbm指令
最重要的偽指令
ldr?????大范圍的地址加載指令 adr?????小范圍的地址加載指令 adrl????????中等范圍的地址加載指令????? ARM中有一個(gè)ldr指令,還有一個(gè)ldr的偽指令 adr和ldr的差別,ldr加載的地址在鏈接時(shí)確定,而adr加載的地址在運(yùn)行時(shí)確定,所以可以通過(guò)adr和ldr加
載的地址來(lái)判斷程序是否在鏈接時(shí)指定的地址執(zhí)行