ARM 匯編指令學習:[2]ARM指令集
一、跳轉指令
1、 B(跳轉指令)及BL(帶返回跳轉指令)
B{L}{<cond>} <target_address>
其中:
L 決定是否保存當前PC寄存器地址到LR寄存器中。
<target_address> 為指令跳轉的目標地址。這個地址的計算方法是:將指令中的24位帶符號的補碼立即數擴展為32位(擴展其符號位);將此32位數左移兩位;將得到的值加到PC寄存器中,即得到跳轉的目標地址。由這種計算方法可知跳轉的范圍大致為-32MB~+32MB。
2、 第一種BLX(帶返回和狀態切換的跳轉指令)
BLX <target_address>
其中,<target_address>的用法與B及BL指令中的用法相同。
3、 第二種BLX(帶返回和狀態切換的跳轉指令)
BLX{<cond>} <Rm>
其中:
<Rm> 該寄存器中為跳轉的目標地址。當<Rm>寄存器的bit[0]值為0時,目標地址處的指令為ARM指令;當<Rm>寄存器的bit[0]值為1時,目標地址處的指令為Thumb指令。當<Rm>寄存器為R15(PC)時,會產生不可預知的結果(跑飛)。
4、 BX(帶狀態切換的跳轉指令)
BX{<cond>} <Rm>
其中,<Rm>的用法與BLX指令中的用法相同。
二、數據處理指令
1、 MOV 數據傳送指令
MOV{<cond>}{S} <Rd>, <shifter_operand>
MOV指令將<shifter_operand>表示的數據傳送到目標寄存器<Rd>中,并根據操作的結果更新CPSR中相應的條件標志位。
2、 MVN 數據求反傳送指令
MVN{<cond>}{S} <Rd>, <shifter_operand>
MVN指令將<shifter_operand>表示的數據的反碼傳送到目標寄存器<Rd>中,并根據操作的結果更新CPSR中相應的條件標志位。
3、 CMP 比較指令
CMP{<cond>} <Rn>, <shifter_operand>
CMP指令從寄存器<Rn>中減去<shifter_operand>表示的數據,并根據操作的結果更新CPSR中相應的條件標志位,后面的指令就可以根據CPSR中相應的條件標志位來判斷是否執行。
4、 CMN 基于相反數的比較指令
CMN{<cond>} <Rn>, <shifter_operand>
CMN指令從寄存器<Rn>中加上<shifter_operand>表示的數據,并根據操作的結果更新CPSR中相應的條件標志位,后面的指令就可以根據CPSR中相應的條件標志位來判斷是否執行。
5、 TST 位測試指令
TST{<cond>} <Rn>, <shifter_operand>
TST指令將<shifter_operand>表示的數據與寄存器<Rn>的值按位作邏輯與操作,并根據操作的結果更新CPSR中相應的條件標志位,后面的指令就可以根據CPSR中相應的條件標志位來判斷是否執行。
6、 TEQ 相等測試指令
TEQ{<cond>} <Rn>, <shifter_operand>
TEQ指令將<shifter_operand>表示的數據與寄存器<Rn>的值按位作邏輯異或操作,并根據操作的結果更新CPSR中相應的條件標志位,后面的指令就可以根據CPSR中相應的條件標志位來判斷是否執行。
7、 ADD 加法指令
ADD{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
ADD指令將<shifter_operand>表示的數據的與<Rn>的值相加,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。
8、 SUB 減法指令
SUB{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
SUB指令從寄存器<Rn>中減去<shifter_operand>表示的數據,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。
9、 RSB 逆向減法指令
RSB{<cond> }{S} <Rd>, <Rn>, <shifter_operand>
RSB指令從<shifter_operand>表示的數據中減去寄存器<Rn>的值,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。
10、 ADC 帶位加法指令
ADC{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
ADC指令將<shifter_operand>表示的數據的與<Rn>的值相加,再加上寄存器CPSR中的C條件標志位的值,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。
11、 SBC 帶位減法指令
SBC{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
SBC指令從寄存器<Rn>中減去<shifter_operand>表示的數據,再減去寄存器CPSR中的C條件標志位的反碼,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。
12、 RSC 帶位逆向減法指令
RSC{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
RSC指令從<shifter_operand>表示的數據中減去寄存器<Rn>的值,再減去寄存器CPSR中的C條件標志位的反碼,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。
13、 AND 邏輯與操作指令
AND{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
AND指令將<shifter_operand>表示的數據與寄存器<Rn>的值按位作邏輯與操作,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。
14、 BIC 位清除指令
BIC{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
BIC指令將<shifter_operand>表示的數據與寄存器<Rn>的反碼按位作邏輯與操作,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。
15、 EOR 邏輯異或操作指令
EOR{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
EOR指令將<shifter_operand>表示的數據與寄存器<Rn>的值按位作邏輯異或操作,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。
16、 ORR 邏輯或操作指令
ORR{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
ORR指令將<shifter_operand>表示的數據與寄存器<Rn>的值按位作邏輯或操作,并把結果保存到目標寄存器<Rd>中,同時根據操作的結果更新CPSR中相應的條件標志位。
17、 乘法指令
- MUL 32位乘法指令
MUL{<cond>}{S} <Rd>, <Rm>, <Rs>
示例
MUL R0, R1, R2 ; R0=R1*R2
- MLA 32位帶加數的乘法指令
MLA{<cond>}{S} <Rd>, <Rm>, <Rs>, <Rn>
示例
MLA R0, R1, R2, R3 ; R0=R1*R2+R3
- SMULL 64位有符號數乘法指令
SMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>
示例
SMULL R1, R2, R3, R4 ; R1=R3*R4的低32位;R2=R3*R4的高32位
- SMLAL 64位帶加數的有符號數乘法指令
SMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>
示例
SMLAL R1, R2, R3, R4 ; R1=R3*R4的低32位+R1;R2=R3*R4的高32位+R2
- UMULL 64位無符號數乘法指令
UMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>
- UMLAL 64位帶加數的無符號數乘法指令
UMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>
18、 雜類的算術指令
- CLZ 前導0個數計數指令
CLZ{<cond>} <Rd>, <Rm>
CLZ指令用于計算寄存器中操作數最高端的0的個數。如果操作數的bit[31]為1,則指令返回0;如果操作數為0,則指令返回32。
三、程序狀態寄存器(PSR)傳輸指令
1、 MRS 狀態寄存器到通用寄存器的傳送指令
MRS{<cond>} <Rd>, CPSR
MRS{<cond>} <Rd>, SPSR
2、 MSR 通用寄存器到狀態寄存器的傳送指令
MSR{<cond>} CPSR_<fields>, #<immediate>
MSR{<cond>} CPSR_<fields>, <Rm>
MSR{<cond>} SPSR_<fields>, #<immediate>
MSR{<cond>} SPSR_<fields>, <Rm>
四、Load/Store指令
- LDR
- LDRB
- LDRBT
- LDRH
- LDRSB
- LDRSH
- LDRT
- STR
- STRB
- STRBT
- STRH
- STRSB
- STRSH
- STRT
- ......
詳見我的上一篇文章。
信號量操作指令
- SWP 交換指令
SWP{<cond>} <Rd>, <Rm>, [<Rn>]
示例
SWP R1, R2, [R3] ; 將內存單元(R3)中的字數據讀取到R1寄存器中,同時將R2寄存器的數據寫入到內存單元(R3)中
- SWPB 字節交換指令
SWPB{<cond>} <Rd>, <Rm>, [<Rn>]
示例
SWPB R1, R2, [R3] ; 將內存單元(R3)中的字節數據讀取到R1寄存器中,R1的高24位為0,同時將R2寄存器的低8位寫入到內存單元(R3)中
五、協處理器指令
1、 CDP 協處理器數據操作指令
CDP{<cond>} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>, <opcode_2>
CDP2 <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>, <opcode_2>
本指令是ARM處理器用于通知ARM協處理器執行特定的操作。該操作不涉及ARM寄存器和內存單元。
示例
CPD p5, 2, c12, c10, c3, 4 ; 協處理器p5的操作初始化。其中,操作碼1為2,操作碼2為4,目標寄存器為c12,源操作寄存器為c10和c3
2、 LDC 協處理器數據讀取指令
LDC{<cond>}{L} <coproc>, <CRd>, <addressing_mode>
LDC2{L} <coproc>, <CRd>, <addressing_mode>
LDC指令從一系列連續的內存單元將數據讀取到協處理器的寄存器中。
示例
LDC p6, CR4, [R2, #4] ; R2為ARM處理器,指令讀取內存單元(R2+4)的字數據,傳送到協處理器p6的CR4寄存器中
3、 STC 協處理器數據寫入指令
STC{<cond>}{L} <coproc>, <CRd>, <addressing_mode>
STC2{L} <coproc>, <CRd>, <addressing_mode>
STC指令將協處理器的寄存器中的數據寫入到一系列連續的內存單元中。
示例
STC p6, CR4, [R2, #4] ; R2為ARM處理器,指令將協處理器p6的CR4寄存器中的字數據寫入到內存單元(R2+4)中
4、 MCR ARM寄存器到協處理器寄存器的數據傳送指令
MCR{<cond>} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
MCR2 <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
MCR指令將ARM處理器的寄存器中的數據傳送到協處理器的寄存器中。
示例
MCR p14, 3, R7, c7, c11, 6 ; 指令將ARM寄存器中將數據傳送到協處理器p14的寄存器中,其中R7為ARM處理器,存放源操作數;C7和C11為協處理器寄存器,為目標寄存器;操作碼1為3,操作碼2為6
5、 MRC 協處理器寄存器到ARM寄存器的數據傳送指令
MRC{<cond>} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
MRC2 <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
MRC指令將協處理器的寄存器中的數據傳送到ARM處理器的寄存器中。
示例
MRC p14, 3, R7, c7, c11, 6 ; 指令將協處理器p14的寄存器中將數據傳送到ARM寄存器中,其中R7為ARM處理器,為目標寄存器;C7和C11為協處理器寄存器,存放源操作數;操作碼1為3,操作碼2為6
六、異常中斷產生指令
1、 SWI 軟中斷指令
SWI{<cond>} <immed_24>
SWI指令用于產生軟中斷。
2、 BKPT 斷點中斷指令
BKPT <immed_16>
BKPT指令用于產生軟件斷點中斷。軟件調試程序可以使用該中斷。當系統使用硬件調試部件時可以忽略該中斷。
參考自《ARM體系架構與編程》杜春雷
- 我的個人主頁:http://www.techping.cn/
- 我的個人站點博客:http://www.techping.cn/blog/wordpress/
- 我的CSDN博客:http://blog.csdn.net/techping
- 我的簡書:http://www.lxweimin.com/users/b2a36e431d5e/timeline
- 我的GitHub:https://github.com/techping
歡迎相互follow~