1. 程式人生 > >ARM主要彙編指令總結

ARM主要彙編指令總結

本文大部分學習內容來自朱老師的課堂。
ARM彙編特點:8種定址方式
暫存器定址 mov r1,r2
立即定址 mov r0,#FF00
暫存器移位定址 mov r0,r1,lsl#3
暫存器間接定址 ldr r1,[r2]
基址變址定址 ldr r1,[r2,#4]
多暫存器定址 ldmia r1!,{r2-r7,r12},
堆疊定址 stmfd sp!,{r2-r7,lr}

Stmdb和ldmia指令區別
stmdb和ldmia指令一般配對使用,stmdb用於將暫存器壓棧,ldmia用於將暫存器彈出棧,作用是儲存使用到的暫存器。
stmdb和ldmia指令一般配對使用,stmdb用於將暫存器存到某個地址上(一般是棧地址),ldmia用於將地址上的值載入到暫存器上,作用是儲存使用到的暫存器。

https://blog.csdn.net/minsophia/article/details/53080183
這裡比較容易混,混就混在了逗號上,ldr和ldmia用法其實不是一樣的,ldmia和str的用法差不多,是把逗號前面的放到逗號後面的裡頭

ARM彙編特點3:指令字尾
同一指令經常附帶不同字尾,變成不同的指令。經常使用的字尾有:
B(byte)功能不變,操作長度變為8位
H(half word)功能不變,長度變為16位
S(signed)功能不變,運算元變為有符號
如 ldr ldrb ldrh ldrsb ldrsh
S(S標誌)功能不變,影響CPSR標誌位
如 mov和movs movs r0, #0
問題:什麼是cpsr?
CPSR是程式狀態暫存器
ARM主要彙編指令總結


ARM主要彙編指令總結
看這張圖就知道cpsr是什麼了。
ARM主要彙編指令總結
字尾什麼時候執行?
是在本句語句執行之前判斷,前面判斷若沒有被允許,後面的指令就不能執行。
怎麼判斷呢?
就看CPSR的條件位。看N、Z、C、V的值。
ARM主要彙編指令總結
mov和mvn的區別是什麼?
mvn是先位取反後再傳遞的。

資料傳輸指令 mov mvn
算術指令 add sub rsb adc sbc rsc
邏輯指令 and orr eor bic
比較指令 cmp cmn tst teq
乘法指令 mvl mla umull umlal smull smlal
前導零計數 clz
這裡普及下指令作用:
邏輯指令bic用的比較多,
用法 bic r0,r0,#0x1f
解釋:把r的第0位到第4位先清0,然後在賦值給r0

比較指令有4個
CMP
    CMP{條件}{P}    <op1>, <op2>
                    status = op1 - (op2)                             相減操作
CMN -- 比較取負的值
    CMN{條件}{P}    <op1>, <op2>
                    status = op1 - (-op2)                          相加操作
    CMN R0, #1  @把R0與-1進行比較
TEQ -- 測試等價
   TEQ{條件} {P}  <op1>, <op2>
                     status = op1 EOR op2                        相異或操作
    注意:TEQ是對2個數,進行EOR
TST --- 測試位
   TST{條件} {P}  <op1>, <op2>
                     status = op1 AND op2                        相與操作
    TST R0,#0x01 @測試Bit0是否為0
注意:CMP 和 CMN 是算術指令,TEQ 和 TST 是邏輯指令
TEQ和TST通常是一個暫存器和一個立即數按位運算後做比較
mrs & msr

mrs用來讀psr,msr用來寫psr
CPSR暫存器比較特殊,需要專門的指令訪問,這就是mrs和msr。

Psr是Cpsr和spsr
用法
ARM主要彙編指令總結
cpsr_c的意思是cpsr的C位控制位
那麼怎麼知道cpsr到第有多少欄位呢?
C:控制域遮蔽欄位(PSR中的第0位到第7位);
X:擴充套件域遮蔽欄位(PSR中的第8位到第15位);
S:狀態域遮蔽欄位(PSR中的第16位到第32位);
F:標誌域遮蔽欄位(PSR中的第24位到第31位)。

b & bl & bx

b 直接跳轉(就沒開啟算返回)
bl branch and link,跳轉前把返回地址放入lr中{r14中},以便返回,以便用於函式呼叫
//bx跳轉同時切換到ARM模式,一般用於異常處理的跳轉。。。基本上不用

ldr/str & ldm/stm & swp

單個字/半字/位元組訪問 ldr/str
多字批量訪問 ldm/stm
swp r1, r2, [r0]
Swp的主要作用是交換的作用,先把[r0]放到r1裡,然後把r2放回到[r0]

swp r1, r1, [r0]
上面這個例子就是交換了,這個用的比較多,這就完成了暫存器和記憶體的交換

mcr & mrc

mrc用於讀取CP15中的暫存器
mcr用於寫入CP15中的暫存器
ARM主要彙編指令總結
https://blog.csdn.net/gameit/article/details/13169405
mcr{<cond>} p15, <opcode_1>, <Rd>, <Crn>, <Crm>, {<opcode_2>}
opcode_1:對於cp15永遠為0
Rd:ARM的普通暫存器
Crn:cp15的暫存器,合法值是c0~c15
Crm:cp15的暫存器,一般均設為c0
opcode_2:一般省略或為0
其實就是r0和c1的資料的ldr和str

補充一個概念為什麼要有偽指令?
答:偽指令的出現時因為有合法立即數和非法立即數的概念,由於非法立即數的出現,導致編寫很麻煩,所以通過偽指令可以通用這些指令。
那什麼是非法立即數?
非法立即數是指連續出現ff(8個1)以上就是非法的,不能超過8個1

上面那條指令就是報錯指令
那麼偽指令為什麼就可以呢?
答:因為編譯器可以幫你搞定,幫你轉換。