專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

arm匯編指令

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

相關(guān)文章