1.跳轉(zhuǎn)指令
B 無(wú)條件跳轉(zhuǎn)? ? ?
BL 帶鏈接的無(wú)條件跳轉(zhuǎn)?
BX 帶狀態(tài)切換的無(wú)條件跳轉(zhuǎn)? 根據(jù)目標(biāo)地址最低位切換狀態(tài)(arm/thumb)
BLX 帶鏈接和狀態(tài)切換的無(wú)條件跳轉(zhuǎn)
B loc_地址
BEQ,BNE
2.存儲(chǔ)器與寄存器交互數(shù)據(jù)指令 核心
存儲(chǔ)器(主存卷玉,內(nèi)存)
寄存器中放的數(shù)據(jù):可以是字符串宿稀,可以是數(shù)鞠呈,也可以是一個(gè)地址某筐,它可以放各種類型的數(shù)據(jù)
存儲(chǔ)地址單元:地址(如0x00004000)與地址中存在的值
LDR:從存儲(chǔ)器中加載數(shù)據(jù)到寄存器 ← Load
LDR R8,[R9,#4] R8為待加載數(shù)據(jù)的寄存器全谤,加載值為R9+0x4所指向的存儲(chǔ)單元 R8=*(R9+4)
STR:將寄存器的數(shù)據(jù)存儲(chǔ)到存儲(chǔ)器 → Store
STR R8,[R9,#4] 將R8寄存器的數(shù)據(jù)存儲(chǔ)到R9+0x4指向的存儲(chǔ)單元? *(R9+4)=R8
LDM:將存儲(chǔ)器的數(shù)據(jù)加載到一個(gè)寄存器列表 →
LDM R0,{R1-R3}將R0指向的存儲(chǔ)單元的數(shù)據(jù)依次加載到R1,R2,R3寄存器
STM:將一個(gè)寄存器列表的數(shù)據(jù)存儲(chǔ)到指定的存儲(chǔ)器? ←
PUSH:將寄存器值推入堆棧? 壓棧--》
POP:將堆棧值推出到寄存器? 出棧 《--
SWP:將寄存器與存儲(chǔ)器之間的數(shù)據(jù)進(jìn)行交換
SWP R1, R1 [R0] 將R1寄存器與R0指向的存儲(chǔ)單元的內(nèi)容進(jìn)行交換
堆骆撇,隊(duì)列:數(shù)據(jù)結(jié)構(gòu),棧是豎的,后進(jìn)先出隶债,且只能從棧頂依次填入數(shù)據(jù)
3.數(shù)據(jù)傳送指令
MOV:將立即數(shù)或寄存器的數(shù)據(jù)傳送到目標(biāo)寄存器 ←
MOV R0, #8? ? ? ? R0=8
4.數(shù)據(jù)算術(shù)運(yùn)算指令
←
ADD,SUB,MUL,DIV
有符號(hào),無(wú)符號(hào)運(yùn)算跑筝;帶進(jìn)位運(yùn)算
5.數(shù)據(jù)邏輯運(yùn)算指令
與:AND
或:ORR
異或:EOR? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
移位:實(shí)質(zhì)是乘死讹,除,類似于小數(shù)點(diǎn)移位曲梗,但相反赞警。小數(shù)點(diǎn)左移妓忍,數(shù)變小愧旦;右移變大世剖。
但邏輯移位,左移變大笤虫,右移變小旁瘫,且按2的倍數(shù)進(jìn)行,因?yàn)槭?進(jìn)制琼蚯。
LSL:邏輯左移←
LSR:邏輯右移←
LSL R0,R1酬凳,#2 R0=R1*4?
LSR R0,R1,#2? R0=R1*2
6.比較指令
CMP:比較
CMP R0 #0 R0寄存器中的值與0比較
標(biāo)志位:如z位遭庶,這個(gè)都可以在動(dòng)態(tài)調(diào)試時(shí)宁仔,寄存器窗口看到
7.其他指令
協(xié)處理器指令:SWT (切換用戶模式)
偽指令:DCB
8.寄存器尋址方式
立即尋址:MOV R0,#1234 R0=0X1234
寄存器尋址:MOV R0,R1 R0=R1
寄存器移位尋址:MOV R0,R1,LSL #2 R0=R1*4
寄存器間接尋址:LDR R0,[R1] 將R1寄存器中的值作為地址,取出地址中的值賦予R0
寄存器間接基址偏移尋址:LDR R0,[R1峦睡,#-4]將R1寄存器的值-0x4的值作為地址翎苫,取出地址中的值給R0
對(duì)int a=0;這一句簡(jiǎn)單高級(jí)語(yǔ)言的匯編理解,首先會(huì)開(kāi)辟一個(gè)內(nèi)存存儲(chǔ)單元榨了,然后把0x0這個(gè)數(shù)放入R0寄存器煎谍,
然后再把R0寄存器的數(shù)據(jù)放入內(nèi)存存儲(chǔ)單元。所以:
MOV R0,#0
STR R0阻逮,[R11,#0x14+var_20]