ARM指令集总结
一.概念:
? ? ? 指令集指一個微處理器所有指令的集合。處理器的指令集可以分為CISC(復雜指令集)和RISC(精簡指令集),ARM處理器使用RISC。
? ? ?ARM處理器支持ARM和Thumb兩種指令集:ARM指令集工作在32位模式下,指令長度都是32b;Thumb指令集工作在16位模式下,指令長度都是16b。
二.指令集種類
1.算術運算指令
1.1.ADD指令
ADD指令用與普通的加法運算。
格式:ADD{條件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作數dest=op_1+op_2
ADD指令把兩個操作數op_1和op_2相加的結果存放到目的寄存器dest中,操作數op_1和op_2可以是寄存器或者是一個立即數。
例:
ADD ????R0, R1,R2 ??????????; ?R0=R1+R2
ADD ????R0, R1,#256 ????????; ?R0=R1+256
ADD ????R0, R1,R3,LSL#1 ??; ?R0=R1+(R3<<1)
?
1.2.ADC指令
ADC指令用于帶進位的加法運算。
格式:ADC{條件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作數dest = op_1 + op_2 + carry
ADC指令把兩個操作數op_1和op_2相加的結果存放到目的寄存器dest中。ADC指令使用一個進位標志位,可以進行大于32位的加法操作。
例:
;64位數結果:存放在寄存器R0和R1
;兩個32位數:存放在寄存器R2和R3
ADCS ???R0,R2,R3 ??;帶進位加,結果保存在R0和R1寄存器
?
1.3.SUB指令
格式:SUB{條件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作數dest=op_1-op_2
SUB指令把兩個操作數op_1和op_2相減的結果存放到目的寄存器dest中,操作數op_1和op_2可以是寄存器或者是一個立即數。
例:
SUB ????R0, R1,R2 ??????????; ?R0=R1-R2
SUB ????R0, R1,#256 ????????; ?R0=R1-256
SUB ????R0, R1,R3,LSL#1 ??; ?R0=R1-(R3<<1)
?
1.4.SBC指令
格式:SBC{條件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作數dest = op_1 - op_2 -! Carry
SBC指令把兩個操作數op_1和op_2相減的結果存放到目的寄存器dest中.SBC指令支持借位標志,故可以支持大于32位的減法操作。
?
?
?
2.邏輯運算指令
2.1.AND指令
AND指令求連個操作數的邏輯與的結果
格式:AND{條件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作數dest=op_1 AND op_2
AND指令在兩個操作數op_1和op_2做邏輯與操作,結果存放到目的寄存器dest中,AND指令常用于屏蔽寄存器中的某一位。op_1是寄存器,op_2可以是寄存器或者是一個立即數。
例:
AND ???R0, R0,#3 ?????;R0的第0位和第1位保持不變,其他位清零
?
2.2.EOR
EOR指令對兩個操作數做異或運算。
格式:EOR{條件} {S} <dest>, <op_1>, <op_2>
//dest是目的寄存器,op_1和op_2是操作數dest=op_1 EOR op_2
EOR指令在兩個操作數op_1和op_2做邏輯異或操作,結果存放到目的寄存器dest中,常用于設置某個特定反轉。EOR指令中,op_1是寄存器,op_2可以是寄存器或者是一個立即數。
例:
EOR ???R0, R0,#3 ?????;R0的第0位和第1位被反轉
?
3.MOV指令
MOV指令在兩個操作數之間復制數據。
格式:MOV{條件} {S} <dest>, <op_1>
//dest是目的寄存器,op_1是操作數dest=op_1
MOV指令的作用是把另一個寄存器中,支持操作數的移位操作。
例:
MOV ??R0,R0 ???????????;R0 = R0相當于沒有操作
MOV ??R0,R0,LST#3 ???;R0 = R0 * 8 LST寄存器左移3位,相當于乘8
?
4.分支指令
B指令可以根據設置的條件跳轉到指定的代碼地址。
格式; B{條件} <地址>
B指令是分支跳轉指令。程序中遇到B指令會立即跳轉到指定地址,然后繼續從新的地址開始運行程序。
?
5.數據傳送指令
數據傳送指令用于CPU和存儲器之間的數據傳送,是ARM處理器唯一能與外部存儲器交換數據的一類指令。
5.1.單一數據傳送指令
單一數據傳送指令用于內向存儲。
格式:
LDR{條件} ??????Rd;<地址>
STR{條件} ??????Rd;<地址>
LDR{條件}B ????Rd;<地址>
STR{條件}B ????Rd;<地址>
單一數據傳送指令STR和LDR可以在內存和寄存器之間裝載或者存儲一個或多個字節的數據,并提供了;靈活的尋址方式。Rd是要操作的數值,地址可以是基址寄存器Rbase和變址寄存器Rindex指定的地址。在條件后加入標志B代表一次傳送1字節數據。
常見尋址方式:
STR ??Rd, ?[Rbase] ????????????;存儲Rd到Rbase所包含的有效地址
STR ??Rd, ?[Rbase,Rindex] ???;存儲Rd到Rbase+Rindex所合成的有效地址
STR ??Rd, ?[Rbase,#index] ???;存儲Rd到Rbase+index所合成的有效地址,index是立即數
?
5.2.多數據傳送指令
多數據傳送指令用于向內存裝載和存儲多個字節或字的數據。
格式; xxM{條件} {類型} ?Rn{!}, <寄存器列表>{^}
其中,xx可以是LD(裝載),也可以是ST(存儲).多數據傳送指令用于寄存器和內存之間多個數據的復制。
指令包括:
LDMED ???LDMIB ??;裝載前增加地址,相當于C語言的++p
LDMFD ???LDMIA ??;裝載前增加地址,相當于C語言的p++
LDMEA ???LDMDB ??;裝載前增加地址,相當于C語言的++*p
LDMFA ???LDMDA ??;裝載前增加地址,相當于C語言的*p++
STMFA ???STMIB ????;存儲前增加地址
STMEA ???STMIA ????;存儲后增加地址
STMFD ???STMDB ???;存儲前增加值
STMED ???STMDA ???;存儲后增加值
?
附:
ARM處理器支持的移位操作:
LSL 邏輯左移 ? ? ? ? ?寄存器的二進制位從右往左移動,空出的位補0
LSR 邏輯右移 ? ? ? ? ?寄存器的二進制位從左往右移動,空出的位補0
ASR 算術右移 ? ? ? ? ?移位過程中符號位不變,即如果源操作數是正數,則字的高端空出的位補0否則補1 ? ? ? ? ? ? ? ? ? ? ? ? ?
ROR 循環右移 ? ? ? ? ?寄存器的低端移出的位填入字的高端空出的位
RRX 帶擴展的循環位移 ???操作數右移一位,高端空出的位用原C標志值填充
?
?
?
?
?
?
?
?
?
總結
- 上一篇: 轻轻的你来了,悄悄的你走了,邓总没有带走
- 下一篇: 微信表情都戒烟了