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