ARM匯編:
指令
偽指令
符號
arm指令分類:
跳轉(zhuǎn)指令
數(shù)據(jù)處理指令
數(shù)據(jù)傳送指令
乘法指令
Load/Store(加載存儲)指令
程序狀態(tài)寄存器訪問指令
通用寄存器和存儲器內(nèi)容交換指令
異常產(chǎn)生指令
協(xié)處理指令(暫時不講)
信號量指令(暫時不講)
其他擴展指令(暫時不講)
指令尋址方式:
數(shù)據(jù)處理指令操作數(shù)尋址方式
內(nèi)存訪問指令尋址方式
幾乎所有arm指令都能條件執(zhí)行:
31 30 29 28 四位表示條件位,共16個條件。
Cpsr中的條件標(biāo)志位NZCV的值來確定指令是否執(zhí)行。
cond的16種條件:
shifter_operand(第二源操作數(shù))的三種形式:
# 立即數(shù)
指令里面的立即數(shù)前面加#。
嵌入式一般用十六進制,前面加0x。
寄存器
寄存器移位9種:
邏輯左移:將Rm寄存器邏輯左移shift_imm(立即數(shù))位或Rs(寄存器)位。
,LSL #/
邏輯右移:
,LSR #/
算術(shù)右移:
,ASR #/
循環(huán)右移
,ROR #/
擴展循環(huán)右移:
,RRX :Rm擴展的循環(huán)右移一位。
S標(biāo)志位:
決定是否更新cpsr中的標(biāo)志位;
如果S=1,更新cpsr標(biāo)志位,當(dāng)Rd不為R15,cpsr中的NZCV根據(jù)指令的執(zhí)行結(jié)果設(shè)置,其他位不動;當(dāng)Rd是R15,當(dāng)前程序狀態(tài)的spsr拷貝到cpsr。
如果S=0,不更新cpsr。
{}表示可選項.
-----------------------------------------
跳轉(zhuǎn)指令:
B :跳轉(zhuǎn),用于死循環(huán)
BL :帶返回的跳轉(zhuǎn),函數(shù)調(diào)用
BX :跳轉(zhuǎn)并切換狀態(tài)
BLX:帶返回的跳轉(zhuǎn)并切換狀態(tài)
三種跳轉(zhuǎn)形式:
1.跳轉(zhuǎn)到標(biāo)號處LABLE
2.跳轉(zhuǎn)到絕對地址0xXXX
3.跳轉(zhuǎn)到子程序func處
-----------
跳轉(zhuǎn)(B)和帶返回的跳轉(zhuǎn)(BL)
B{L}{}
編碼格式:
條件代碼標(biāo)識 控制位
31-28 24 23-0
NZCV 101 L 跳轉(zhuǎn)的地址
L:L位,也就是寄存器的24位,bit【24】=1,指令存儲返回地址到LR,bit【24】=0,不保存返回地址。
cond:指令執(zhí)行的條件
target_address:指令跳轉(zhuǎn)的目標(biāo)地址;計算目標(biāo)地址方法:
將24位帶符號的補碼立即數(shù)擴展為32位;
將擴展后的32位立即數(shù)左移兩位;
將得到的值加到PC寄存器中即可。
----------
跳轉(zhuǎn)并切換狀態(tài)
BX{}
Rm的第0位拷貝到cpsr的T位,其他位移入PC。
編碼格式:
條件代碼標(biāo)識
31-28 19-16 15-12 3-0
NZCV 00010010 SB0 SB0 0001 Rm
cond:指令執(zhí)行條件
:包含跳轉(zhuǎn)指令的目標(biāo)地址;Rm的bit【0】=0,目標(biāo)地址處指令為ARM指令;如果bit【1】=1,目標(biāo)地址處指令為Thumb指令。
----------
帶狀態(tài)切換的連接跳轉(zhuǎn)指令
BLX
編碼格式:
條件代碼標(biāo)識
31-28 24 23-0
1111 101 H Rm
target_add:指令的跳轉(zhuǎn)目標(biāo)地址;計算方法:
將24位擴展為32位立即數(shù);
將結(jié)果左移兩位;
將H(bit【24】)加到結(jié)果地址的第一位bit【1】;
將結(jié)果累加進程序計數(shù)器pc中。
BLX{comd}
Rm的第0位拷貝到cpsr的T位,其他位移入PC。
編碼格式:
條件代碼標(biāo)識
31-28 19-16 11-8 3-0
NZCV 00010010 SB0 SB0 0011 Rm
cond:指令執(zhí)行條件
Rm:寄存器Rm指定轉(zhuǎn)移目標(biāo),Rm的bit【0】=1,跳轉(zhuǎn)時自動將cpsr的標(biāo)志位T置位,就是解釋為Thumb,否則解釋為ARM。
-------------------------------------------
數(shù)據(jù)處理指令:
算數(shù)運算指令
ADD:加
ADC:帶進位的加
SUB:減
RSB:翻轉(zhuǎn)減
SBC:帶進位的減
RSC:帶進位的翻轉(zhuǎn)減
測試與測試指令
TST:測試
TEQ:測試相等
CMP:比較
CMN:負(fù)數(shù)比較
邏輯指令
BIC:位清0
AND:邏輯加
ORR:邏輯或
EOR:邏輯異或
編碼格式:
條件代碼標(biāo)識
31-28 25 24-21 20 19-16 15-12 11-0
NZCV 00 I opcode S Rn Rd shiter_operand
I:區(qū)分第二操作偶數(shù)是立即數(shù)還是寄存器
S:標(biāo)志指令的條件域是否更新cpsr
Opcode:操作符
Rd:指示目的寄存器
Rn:指示第一源操作寄存器
Shifter_operand:指示第二源操作數(shù),可以是立即數(shù),寄存器,寄存器移位三種形式:
數(shù)據(jù)處理指令的語法格式分兩種:
算術(shù)運算和邏輯運算的格式:
{}{S} ,,
比較和測試的格式(沒有Rd; S=1)
{} ,
-----
算數(shù)運算指令
ADD{}{S} ,,
將shifter_operand加Rn,結(jié)果存到Rd中。
ADC{}{S} ,, 帶進位的加法,處理大于32位的加法
將shifter_operand加Rn,再加cpsr中的C標(biāo)志位,結(jié)果存到Rd。
SUB{}{S} ,,
將Rn減shifter_operand,結(jié)果保存到Rd中。
SBC{}{S} ,, 帶進位的減法,處理大于32位的減法
Rn減去shifter_operand,再減去cpsr中的C標(biāo)志位的反碼,結(jié)果保存到Rd。
RSB{}{S} ,, 翻轉(zhuǎn)減,處理負(fù)數(shù)
shifter_operand減去Rn,結(jié)果保存到Rd。
RSC{}{S} ,, 帶進位的翻轉(zhuǎn)減,處理大于32位的負(fù)數(shù)
shifter_operand減去Rn,再減去cpsr中的C標(biāo)志位的反碼,結(jié)果保存到Rd。
-----
邏輯運算指令
AND{}{S} ,, 邏輯與
Rn與shifter_operand按位邏輯與,結(jié)果保存到Rd中。
與1與會保持不變,與0與變?yōu)閺?fù)位(變0)。
EOR{}{S} ,, 邏輯異或,不同則為1,相同則為0
Rn和shifter_operand進行按位邏輯異或,結(jié)果保存到Rd中。
與0異或保持不變,與1異或會反轉(zhuǎn)。
ORR{}{S} ,, 邏輯或
Rn與shifter-_operand進行按位邏輯或,結(jié)果保存到Rd中。
與0或會保持不變 ,與1或可以置位(変1)。
BIC{}{S} ,,
Rn的源碼與shifter_operand的反碼按位進行邏輯與,結(jié)果保存到Rd中。
-----
比較測試
CMP{} , 比較指令
用Rn減去shifter_operand,自動更新cpsr的標(biāo)志位。
CMN{} , 負(fù)數(shù)比較指令
用Rn的原值減去shifter_operand的負(fù)數(shù)指(相當(dāng)與兩者相加),自動更新cpsr的標(biāo)志位。
TST{} , 測試指令
將Rn和shifter_oerand進行按位邏輯與,自動更新cpsr的標(biāo)志位。
TEQ{} , 測試相等指令
將Rn和shifter_operand進行按位邏輯異或,自動更新cpsr的標(biāo)志位。
---------------------------------------------
數(shù)據(jù)傳送指令:
MOV{cond}{S} ,
編碼格式:
條件代碼標(biāo)識
31-28 20 15-12 11-0
NZCV 00 1 1101 S 0000 Rd shiter_operand
cond:條件,指令只有在條件滿足時才執(zhí)行。
S:S標(biāo)識,S(bit【20】)=1,更新cpsr。如果Rd=r15,CPSR=SPSR,如果Rd不是r15,根據(jù)傳送的數(shù)值設(shè)置cpsr的NZCV。如果S=0,不更新cpsr。
Rd:確定目標(biāo)寄存器
shifter_operand:確定操作數(shù),可以是立即數(shù),寄存器,寄存器移位的形式。
MVN{}{S} ,
傳送反碼,將shifter_operand按位取反傳送給Rd。
編碼格式:
條件代碼標(biāo)識
31-28 20 15-12 11-0
NZCV 00 1 1111 S 0000 Rd shiter_operand
-------------------------------------------
乘法指令
編碼格式:
31-28 23-21 20 19-16 15-12 11-8 3-0
NZCV 0000 mul S Rd/RdHi Rn/RdLo Rs 1001 Rm
mul:
RdHi:RdLo 由RdHi(最高有效32位)和RdLo(最低有效32位)鏈接形成的64位數(shù)
[31:0] 表示只選取結(jié)果的最低有效32位。
:= 表示簡單的賦值。
S:S位,控制cpsr條件控制位的設(shè)置,具體設(shè)置如下:
產(chǎn)生32位結(jié)果,N=Rd【31】;64位結(jié)果的,N=RdHi【31】。
產(chǎn)生32位結(jié)果,Rd=0時,Z=1;64位結(jié)果的,RdHi和RdLo都為0,Z=1.
C設(shè)置成無意義的指,V不變。
MUL{}{S} ,, 乘法指令
31-28 23-21 20 19-16 11-8 3-0
NZCV 0000 000 S Rd Rs 1001 Rm
Rm*Rs,取結(jié)果的最低32位保存到Rd中。
MLA{}{S} ,,, 乘-累加指令
31-28 23-21 20 19-16 15-12 11-8 3-0
NZCV 0000 001 S Rd Rn Rs 1001 Rm
Rm*Rs,乘積加Rn,取結(jié)果的低32位保存到Rd。
UMULL{}{S} ,,, 無符號長乘指令
31-28 23-21 20 19-16 15-12 11-8 3-0
NZCV 0000 100 S RdHi RdLo Rs 1001 Rm
Rm和Rs進行無符號相乘,結(jié)果低32位保存到RdLo,高32位保存到RdHi。
UMLAL{}{S} ,,, 無符號長乘-累加指令
31-28 23-21 20 19-16 15-12 11-8 3-0
NZCV 0000 101 S RdHi RdLo Rs 1001 Rm
Rm和Rs做無符號相乘,64位乘積與RdHi:RdLo相加,結(jié)果低32位保存到RdLo中,高32位保存到RdHi中。
SMULL{}{S} ,,, 有符號數(shù)長乘指令
31-28 23-21 20 19-16 15-12 11-8 3-0
NZCV 0000 110 S RdHi RdLo Rs 1001 Rm
Rm和Rs做有符號相乘,結(jié)果低32位保存到RdLo中,高32位保存到RdHi中。
SMLAL{}{S} ,,, 有符號數(shù)長乘-累加指令
31-28 23-21 20 19-16 15-12 11-8 3-0
NZCV 0000 111 S RdHi RdLo Rs 1001 Rm
Rm和Rs做有符號相乘,64位乘積和RdHi:RdLo相加,結(jié)果低32位保存到RdLo中,高32位保存到RdHi中。
-------------------------------------------
ARM加載存儲指令
單寄存器加載/存儲指令:單數(shù)據(jù)傳送,字節(jié),半字和字都可以。
多寄存器加載/存儲指令:傳大數(shù)據(jù),進程進入、退出、保存、恢復(fù),內(nèi)存數(shù)據(jù)拷貝。
單寄存器交換指令:寄存器和存儲器進行數(shù)據(jù)交換,用于多處理器實現(xiàn)信號量。
-----
單寄存器指令:
字:
LDR:Load 加載:從內(nèi)存到寄存器
STR:Store 儲存:從寄存器到內(nèi)存
B:字節(jié)
H:半字
S:有符號
T:用戶模式
31-28 25 24 23 22 21 20 19-16 15-12 11-0
NZCV 0 X L P U I W S Rn Rd addr_mode
L:L=1,進行加載,否則是存儲
P:P=1,使用預(yù)先變址尋址,否則使用過后變址尋址
U:U=1,給出的偏移量被加到基址寄存器上,否則從中減去偏移量
W:預(yù)先變址尋址,W=1,強制用作地址轉(zhuǎn)換的最終地址寫回基址寄存器;
過后變址尋址,W=1,在進行傳送之前強制進行地址轉(zhuǎn)換。
LDR{} , 字?jǐn)?shù)據(jù)加載指令
31-28 25 24 23 21 19-16 15-12 11-0
NZCV 01 L P U 0 W 1 Rn Rd addr_mode
從內(nèi)存中將一個32位字讀取到目標(biāo)寄存器Rd。
STR{} , 字?jǐn)?shù)據(jù)存儲指令
31-28 25 24 23 21 19-16 15-12 11-0
NZCV 01 L P U 0 W 0 Rn Rd addr_mode
將寄存器Rd中一個32位的字?jǐn)?shù)據(jù)寫入到一個內(nèi)存單元。
LDRB{}B , 字節(jié)數(shù)據(jù)加載指令
31-28 25 24 23 21 19-16 15-12 11-0
NZCV 01 L P U 1 W 1 Rn Rd addr_mode
將一個8位字節(jié)讀取到目標(biāo)寄存器Rd。
STRB{}B , 字節(jié)數(shù)據(jù)存儲指令
31-28 25 24 23 21 19-16 15-12 11-0
NZCV 01 L P U 1 W 0 Rn Rd addr_mode
從寄存器Rd中取出8位字節(jié)放入內(nèi)存單元低8位,高位補0.
LDRH{}H , 半字?jǐn)?shù)據(jù)加載指令
31-28 24 23 21 19-16 15-12 11-8 4-0
NZCV 010 P U 1 W 1 Rn Rd addr_mode 1011 addr_mode
從內(nèi)存將一個16位的半字讀取到目標(biāo)寄存器Rd。
STRH{}H , 半字?jǐn)?shù)據(jù)存儲指令
31-28 24 23 21 19-16 15-12 11-8 4-0
NZCV 000 P U 1 W 0 Rn Rd addr_mode 1011 addr_mode
從寄存器取出指定的16位半字放入指令中指定的內(nèi)存單元的低16位,將高位補0.
LDR{}T , 用戶模式字加載指令
31-28 25 23 19-16 15-12 11-0
NZCV 01 L 0 U 1 1 1 Rn Rd addr_mode
從內(nèi)存中將一個32位的字讀取到目標(biāo)寄存器Rd。
post_indexed_addressing_mode:使用后索引地址模式尋址。
STR{}T , 用戶模式字存儲指令
31-28 25 23 19-16 15-12 11-0
NZCV 01 L 0 U 0 1 0 Rn Rd addr_mode
將寄存器Rd中的一個32位的字寫入到內(nèi)存中。
post_indexed_addressing_mode:使用后索引地址模式尋址。
LDR{}BT , 用戶模式字節(jié)加載指令
31-28 25 23 19-16 15-12 11-0
NZCV 01 L 0 U 1 1 1 Rn Rd addr_mode
從內(nèi)存讀取一個8位字節(jié)到目標(biāo)寄存器Rd。
post_indexed_addressing_mode:使用后索引地址模式尋址。
STR{}BT ,,
用戶模式字節(jié)存儲指令
31-28 25 23 19-16 15-12 11-0
NZCV 01 L 0 U 1 1 0 Rn Rd addr_mode
將寄存器Rd中的一個8位的字節(jié)寫入到內(nèi)存中。
post_indexed_addressing_mode:使用后索引地址模式尋址。
LDR{}SB , 有符號字節(jié)傳送指令
31-28 24 23 22 21 19-16 15-12 11-0
NZCV 000 P U I W 1 Rn Rd addr_mode
將一個8位的字節(jié)讀取到目標(biāo)寄存器Rd。
LDR{}SH , 有符號半字傳送指令
31-28 24 23 22 21 19-16 15-12 11-8 11-0
NZCV 000 P U I W 1 Rn Rd 1111 addr_mode
將一個16位的半字節(jié)讀取到目標(biāo)寄存器Rd。
-----
多寄存器加載存儲指令
主要用途現(xiàn)場保護,數(shù)據(jù)復(fù)制,參數(shù)傳遞,有8中模式(address_mode):
數(shù)據(jù)塊傳輸:
IA:每次傳送后地址加4
IB:每次傳送前地址加4
DA:每次傳送后地址減4
DB:每次傳送前地址減4
堆棧操作:
FD:滿遞減堆棧
ED:空遞減堆棧
FA:滿遞增堆棧
EA:空遞增堆棧
多寄存器內(nèi)存字?jǐn)?shù)據(jù)傳送指令:
LDM{} {!},
31-28 24 23 21 19-16 15-0
NZCV 100 P U 0 W 1 Rn register_list
將數(shù)據(jù)從連續(xù)的內(nèi)存單元中讀取到寄存器列表中。
address_mode:指令的尋址方式,確定PUW位
Rn:基址寄存器
!:設(shè)置W位
registers:被加載的寄存器列表
STM{} {!},
31-28 24 23 21 19-16 15-0
NZCV 100 P U 0 W 0 Rn register_list
將寄存器列表中各寄存器數(shù)據(jù)寫入到連續(xù)的內(nèi)存單元中。
address_mode:指令的尋址方式,確定PUW位
Rn:基址寄存器
!:設(shè)置W位
registers:被加載的寄存器列表
用戶模式多寄存器內(nèi)存字?jǐn)?shù)據(jù)傳送指令:
LDM{} ,
31-28 24 23 21 19-16 15-0
NZCV 100 P U 1 W 1 Rn register_list
將數(shù)據(jù)從連續(xù)的內(nèi)存單元讀取到指令中指定的寄存器列表中的各寄存器。
STM{} ,
31-28 24 23 21 19-16 15-0
NZCV 100 P U 0 W 0 Rn register_list
將寄存器列表中的各寄存器數(shù)值寫入到內(nèi)存單元。
帶狀態(tài)寄存器的多寄存器字?jǐn)?shù)據(jù)裝載指令:
LDM{} {!},
31-28 24 23 21 19-16 15-0
NZCV 100 P U 1 W 1 Rn register_list
將數(shù)據(jù)從連續(xù)的內(nèi)存單元讀取到寄存器列表。
-----
通用寄存器和存儲器內(nèi)容交換指令
用于進程同步
SWP{} ,,[]
31-28 19-16 15-12 11-8 3-0
NZCV 00010000 Rn Rd SBZ 1001 Rm
Rn:內(nèi)存單元地址寄存器
Rd:確定指令的目標(biāo)寄存器
Rm:包含將要被存儲到內(nèi)存單元中的數(shù)據(jù)的寄存器
將一個內(nèi)存單元【Rn】中的字?jǐn)?shù)據(jù)讀取到寄存器Rd中,同時將寄存器Rm的字?jǐn)?shù)據(jù)寫入到內(nèi)存單元【Rn】中。
SWP{}B ,,[]
31-28 19-16 15-12 11-8 3-0
NZCV 00010100 Rn Rd SBZ 1001 Rm
Rn:內(nèi)存單元地址寄存器
Rd:確定指令的目標(biāo)寄存器
Rm:包含將要被存儲到內(nèi)存單元中的數(shù)據(jù)的寄存器
將一個內(nèi)存單元【Rn】中的字節(jié)數(shù)據(jù)讀取到寄存器Rd中,同時將寄存器Rm的字節(jié)寫入到內(nèi)存單元【Rn】中。
------------------------------------------------
程序狀態(tài)寄存器訪問指令:
ARM提供兩條指令,直接控制程序狀態(tài)寄存器psr。
將程序狀態(tài)寄存器的值送到通用寄存器
MRS{} ,CPSR/SPSR
31-28 22 19-16 15-12 12-11
NZCV 00010 R 00 SB0 Rd SBZ
R:如果R=1,Rd=SPSR;R=0,Rd=CPSR
將通用狀態(tài)寄存器的值送到程序狀態(tài)寄存器
MSR{} CPSR_/SPSR_,
31-28 22 19-16 15-12 8-11 3-0
N ZCV 00010 R 10 FSXC SB0 SBZ 0000 Rm
R:如果R=1,SPSR=Rd;R=0,CPSR =Rd
將立即數(shù)送給程序狀態(tài)寄存器
MSR{} CPSR_/SPSR_, #
31-28 22 19-16 15-12 11-8 7-0
N ZCV 00110 R 10 FSXC SB0 8_bit_immediate
R:如果R=1,SPSR=immediate;R=0,CPSR=immediate
域標(biāo)志位field:
F:標(biāo)志位掩碼域
S:狀態(tài)位掩碼域
X:擴展位掩碼域
C:控制位掩碼域
------------------------------------------------
異常產(chǎn)生指令
SWI{}
31-28 23-0
N ZCV 1111 immed_24
immed_24:24位立即數(shù)。
SWI用于產(chǎn)生軟中斷,實現(xiàn)從用戶模式變換到管理模式,cpsr保存到管理模式的spsr,執(zhí)行轉(zhuǎn)移到SWI向量。
---------------------------------------------------------------------
Arm偽指令:
ADR:裝載程序相關(guān)或寄存器相關(guān)地址(小范圍)到寄存器。
ADRL:裝載程序相關(guān)或寄存器相關(guān)地址(中等范圍)到寄存器。
MOV32:裝載32位常數(shù)或地址到寄存器。
LDR:裝載32位常數(shù)或地址到寄存器。
NOP:執(zhí)行一條空操作,用于延時。
ADR{cond}{.W} register,lable
Cond:指令執(zhí)行條件
.W:指定指令寬度
Register:目標(biāo)寄存器
Label:基于PC或具體寄存器的表達式
ADRL{cond} register,label
Cond:指令執(zhí)行條件
Register:目標(biāo)寄存器
Label:基于PC或具體寄存器的表達式
LDR{cond}{.W} register,=[expr|label-expr]
Cond:執(zhí)行條件
.W:指令寬度
Register:目標(biāo)寄存器
Expr:32位常量表達式
Label-expr:一個程序相關(guān)或聲明為外部的表達式。
NOP
可以用mov ro,ro替換
-------------------------------------------------------------------------------------------------------------------
arm處理器尋址方式有9種:
1.寄存器尋址(寄存器Rn中存放的數(shù)就是操作數(shù))
2.立即數(shù)尋址(立即數(shù)#0xXXXXXXXX作為操作數(shù))
3.寄存器移位尋址(寄存器中存放的值進行移位操作之后作為操作數(shù))
4.寄存器間接尋址([Rn],將Rn寄存器中存放的值作為操作數(shù)的地址)
5.基址尋址([Rn,#0xXXX],將Rn寄存器中存放的值加上立即數(shù)作為操作數(shù)的地址)
6.多寄存器尋址({Rn-Rm,Rk},在大括號中可以放多個寄存器,進行批量操作)
7.堆棧尋址
8.塊拷貝
9.相對尋址
寄存器移位方式有9種:
ASR #n/:算術(shù)右移
LSL #n/:邏輯左移
LSR #n/:邏輯右移
ROR #n/:循環(huán)右移
RRX:帶擴展的循環(huán)右移一位
#n表示立即數(shù),表示偏移量寄存器。
arm指令分類:
數(shù)據(jù)處理指令(算數(shù)運算、位運算、比較測試、數(shù)據(jù)傳送)
乘法指令
跳轉(zhuǎn)指令
加載存儲指令(load/store)
寄存器訪問指令(程序狀態(tài)寄存器、通用寄存器)
異常中斷指令
協(xié)處理指令
信號量指令
偽指令(arm偽指令,thumb偽指令、符號定義偽指令、數(shù)據(jù)定義偽指令、報告?zhèn)沃噶睢R編控制偽指令、其他偽指令)
arm指令格式:
{}{S} ,{, operand2}
<>:表示必須
{}:表示可選
opcode:指令助記符
Rd:目標(biāo)寄存器
Rn:源寄存器(第一操作數(shù)寄存器)
operand2:第二操作數(shù)(可以是立即數(shù)、寄存器、寄存器移位)
cond為指令執(zhí)行條件
寄存器的高四位為條件cond:
31
30
29
28
N
Z
C
V
N:=1,負(fù)數(shù)
Z:=1,零
C:=1,進位
V:=1,溢出
條件碼助記符有16種:
31-28
助記符
說明
檢測條件
0000
EQ
相等 /等于零
Z=1
0001
NE
不等
Z=0
0010
CS/HS
進位 /無符號數(shù)大于或等于
C=1
0011
CC/LO
無進位 /無符號數(shù)小于
C=0
0100
MI
負(fù)數(shù)
N=1
0101
PL
正數(shù) /零
N=0
0110
VS
溢出
V=1
0111
VC
未溢出
V=0
1000
HI
無符號數(shù)大于
C=1&Z=0
1001
LS
無符號數(shù)小于或等于
C=0&Z=1
1010
GE
有符號數(shù)大于或等于
N=V
1011
LT
有符號數(shù)小于
N !=V
1100
GT
有符號數(shù)大于
Z=0 & N=V
1101
LE
有符號數(shù)小于或等于
Z=1 | N !=V
1110
AL
總執(zhí)行
任何狀態(tài)
1111
NV
從不執(zhí)行
無
指令限制:
指令都是32位的等寬,造成了分配出來存放立即數(shù)的位數(shù)不同,所以帶立即數(shù)的數(shù)據(jù)處理指令受到限制。
數(shù)據(jù)處理指令(16種)
條件位
指令助記符
CSPR
源寄存器
目標(biāo)寄存器
第二操作數(shù)
31—28
27
26
25
24
23
22
21
20
19——16
15——12
11——0
NZCV
0
0
I
S
Rn
Rd
立即數(shù)
跳轉(zhuǎn)指令B、帶連接的跳轉(zhuǎn)指令BL
條件位
24位跳轉(zhuǎn)地址
31—28
27
26
25
24
23——0
N Z C V
1
0
1
L
立即數(shù)
帶狀態(tài)切換的鏈接跳轉(zhuǎn)指令BLX
條件位
24位跳轉(zhuǎn)地址
31—28
27
26
25
24
23——0
N Z C V
1
0
1
H
立即數(shù)
軟中斷指令SWI
條件位
24位操作數(shù)
31—28
27
26
25
24
23——0
N Z C V
1
1
1
1
立即數(shù)
第二操作數(shù)是立即數(shù)時:
必須是一個8位的常數(shù)經(jīng)過偶數(shù)位循環(huán)移位得到。
arm偽指令:
ADR:將基于PC的相對偏移地址的值讀取到寄存器中。
ADR{} Rd,addr_expr
ADRL:將基于PC相對偏移地址的值,或基于寄存器相對偏移地址的值讀取到寄存器中。
ADRL{} Rd,addr_expr
LDR:加載32位立即數(shù)或一個地址到指定寄存器。
LDR{} Rd,addr_expr/#n
注意:LDR既可以作為arm偽指令,也可以作為加載指令。
NOP:空操作偽指令,用于延時。
NOP
通用偽指令
以下偽指令為編譯器定義,所以可以通用,都是以.開頭。
.equ symbol, expr
.set 同.equ
Symbol:要指定的名稱
Expr:常量或
相當(dāng)于宏定義,用symbol來代替expr。
.global symbol
.globl同.global
Symbol:要聲明的全局符號
在一個文件中聲明一個全局變量或全局函數(shù),在別的文件能夠訪問
.extern symbol
Symbol:要聲明的外部標(biāo)號
.ltorg
.pool
聲明一個數(shù)據(jù)緩沖池的開始。
.byte expr{, expr}…
Expr:數(shù)字表達式或程序中的標(biāo)號。
定義一個字節(jié),相當(dāng)于定義一個char類型
.hword expr{, expr}…
.short expr{, expr}…
Expr:數(shù)字表達式或程序中的標(biāo)號
定義一個半字,兩個字節(jié),相當(dāng)于short int。
.word expr{, expr}…
.int expr{, expr}…
.long expr{, expr}…
Expr:數(shù)字表達式或程序中的標(biāo)號
定義一個字,四個字節(jié),相當(dāng)于int,long int(32位)
.ascii expr{, expr}…
.asciz expr{, expr}…
.string expr{, expr}…
Expr:表示字符串
定義一個字符串,相當(dāng)于char *
.quad expr{, expr}…
Expr:數(shù)字表達式
定義雙字,相當(dāng)于八個字節(jié),long int(64位)
.zero
分配number_of_bytes字節(jié)的數(shù)據(jù)空間,用0填充內(nèi)存
.space {, }
.skip同.space
分配number_of_bytes字節(jié)數(shù)據(jù)空間,用fill_byte填充,缺省用0.
.fill repeat{, size}{, value}
Repeat:重復(fù)填充的次數(shù)
Size:每次填充的字節(jié),默認(rèn)為1
Value:所填充的數(shù)據(jù),默認(rèn)為0
定義重復(fù)內(nèi)存單元
.double expr{. Expr}…
Expr:為32位的單精度浮點數(shù)
定義一個雙精度浮點數(shù)
.arm
.code32
表示是arm指令,32位指令
.thumb
.16
表示thumb指令,16位指令
.section {, “”}
Section_name:段名稱,可以自定義,也可以使用預(yù)定義的(test,data,bss)。
Flags:elf文件格式的標(biāo)志,a(可加載段,可讀),w(可寫段),x(可執(zhí)行段)。
定義一個段
.text
代碼段
.data
數(shù)據(jù)段
.bss
Bss段
.end
表示源文件的結(jié)束,如果之后還有代碼不會被編譯執(zhí)行
.include “filename“
將指定的文件filename在使用的位置展開(一般是頭文件)
.incbin “file”[, skip[, count]]
File:一個二進制文件
Skip:從文件開頭跳過skip個字節(jié)
Count:讀取的字?jǐn)?shù)
將一個原封不動的二進制文件編譯到當(dāng)前文件中。
.align [ab***pr1, ab***pr2]
Ab***pr1:表示對齊方式,(4,8,16,32等)
Ab***pr2:表示填充的值
指定數(shù)據(jù)對其方式,以ab***pr1方式對齊,在未使用的區(qū)域用ab***pr2填充。
.balign和.align相同
.if
.else
根據(jù)表達式的值決定下面的代碼是否編譯,endif表示結(jié)束條件判斷。
.ifdef
.else
.endif
條件編譯偽操作,滿足條件就編譯。
.macro 宏名 參數(shù)列表
宏體
.exitm或.endm @表示宏結(jié)束
.rept 重復(fù)次數(shù)
數(shù)據(jù)定義
.endr @結(jié)束重復(fù)定義
用來重復(fù)定義一個或幾個數(shù)據(jù)
ARM匯編程序設(shè)計的格式
[:] [] @comment
Label:標(biāo)號
Instruction:匯編指令
Pseudo-instruction:偽指令
Directive:偽操作
@:注釋
C和匯編混合編程
只有C和匯編都遵循標(biāo)準(zhǔn),才能相互調(diào)用,ATPCS就是一個公共標(biāo)準(zhǔn)。
C和匯編混合引用的內(nèi)容:
函數(shù);
變量。
C和匯編混合引用的方式:
C內(nèi)嵌匯編;
C和匯編相互引用。
ATPCS(arm/thumb程序調(diào)用標(biāo)準(zhǔn)):
規(guī)定寄存器的使用;
規(guī)定函數(shù)傳參方式;
規(guī)定棧使用方法。
1. 寄存器的使用
未備份寄存器:
R0-R3:作為函數(shù)傳遞的參數(shù)值,想用就用,可記作A1-A3;
備份寄存器:
R4-R11:arm狀態(tài)下保存局部變量,寄存器變量必須保護,可記作V1-V8;
使用之前要先保存,使用之后要恢復(fù)(壓棧出棧)。
有臨時第二功能:
R12:函數(shù)調(diào)用時用來臨時保堆棧指針,函數(shù)返回時進行出棧,記作IP
第二功能寄存器:
R13-R15:有第二功能的寄存器,以第二功能為主。
2.函數(shù)傳參方式:
參數(shù)個數(shù)可變的子程序參數(shù)調(diào)用規(guī)則:
如果參數(shù)個數(shù)不超過四個,用R0-R3來傳遞;
如果參數(shù)個數(shù)超過四個,多出的參數(shù)使用棧來傳遞參數(shù)。
參數(shù)個數(shù)固定的子程序參數(shù)傳遞規(guī)則:
如果系統(tǒng)不包含double(64位)類型,如果不超過四個參數(shù),使用R0-R3來傳遞,超過的部分使用棧來傳遞。
如果包含了double(64位)類型,需要8字節(jié)(64位)對齊,也就是說double類型只能放在R的偶數(shù)(4字節(jié))+奇數(shù)(4字節(jié))來存放,而不能使用奇數(shù)+偶數(shù)來存放。
3.棧的使用方法:
過程調(diào)用標(biāo)準(zhǔn)規(guī)定數(shù)據(jù)棧為FD類型,并且對數(shù)據(jù)棧的操作時要求8字節(jié)對齊。
-------------------------------------------------
協(xié)處理指令
ARM支持多達16個協(xié)處理器,ARM協(xié)處理器指令主要用于ARM處理器初始化ARM協(xié)處理器的數(shù)據(jù)處理操作,以及在ARM處理器的寄存器和協(xié)處理器的寄存器之間傳送數(shù)據(jù),以及在ARM協(xié)處理器的寄存器和存儲器之間傳送數(shù)據(jù)
ARM協(xié)處理器有5條指令:
CDP:協(xié)處理器數(shù)操作指令
LDC:協(xié)處理器數(shù)據(jù)加載指令
STC:協(xié)處理器數(shù)據(jù)存儲指令
MCR:ARM處理器寄存器到協(xié)處理器寄存器數(shù)據(jù)傳送指令
MRC:協(xié)處理器寄存器到ARM處理器寄存器數(shù)據(jù)傳送指令
MCR指令格式:
MCR{} 協(xié)處理器編碼,協(xié)處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協(xié)處理器操作碼2
將ARM處理器的源寄存器中的數(shù)據(jù)傳送到協(xié)處理器的目的寄存器1和目的寄存器2.
。。。。。。
-------------------------------------------------
信號量指令
。。。。。。