久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

arm匯編指令

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年04月27日   【字體:
 
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.
。。。。。。
-------------------------------------------------
信號量指令
。。。。。。
 
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 91极品视频| 黑人精品欧美一区二区蜜桃 | 99免费在线| 人人做人人澡人人爽欧美 | 久久人人爽人人爽 | aaa综合国产| 一级黄色毛片免费 | 91久久久久 | 久久国产视频播放 | 日日摸天天添天天添破 | av中文字幕网 | 成人免费观看视频 | 日韩蜜桃视频 | 黄色一级片在线播放 | 精品一区二区久久 | 久久久999国产精品 中文字幕在线精品 | av中文字幕在线观看 | 国产精品久久久久久久久久尿 | 国产91久久久久久久免费 | 麻豆久久久久久 | 国产免费麻豆视频 | 国产精品美女久久久久久免费 | 毛片av免费看 | 国产伦一区二区三区久久 | www.国产.com | 自拍视频一区二区三区 | 成人一区精品 | 三级在线视频 | 久草在线影 | 美女黄网站视频免费 | 欧美一区二区三区一在线观看 | 国产成人精品免费视频大全最热 | 亚洲欧美日韩国产综合 | 国产精品中文字幕一区二区三区 | 91网站视频在线观看 | 97久久精品午夜一区二区 | 国产精品色av | 亚洲欧美国产一区二区三区 | www..99re | 久久久久久久一区二区三区 | 成人小视频在线观看 |