ARM指令


語法格式

<opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand>

{}表示是可選的部分,<>表示是必要的部分

條件碼

大部分ARM指令都支持條件執行,即滿足某些條件的時候執行當前指令,同時,還配合有S位用來指示當前指令是否會映像CPSR相應的位。

EQ Equal 相等 Z=1
NE Noequal 不相等 Z=0
CS/HS CarrySet/HighorSame 無符號數>= C=1
CC/LO CarryClear/LOwer 無符號數< C=0
MI MInus 負數 N=1
PL Plus 非負數 N=0
VS oVerflowSet 上溢出 V=1
VC oVerflowClear 沒有上溢出 V=0
HI HIgh 無符號> C=1&&Z=0
LS LowerorSame 無符號數<= C=0
GE GreaterorEqual 帶符號數>= N=1&&V=1或 N=0&&V=0
LT LessThan 帶符號數< N=1&&V=0或 N=0&&V=1
GT GreaterThan 帶符號數> Z=0&&N=V
LE LessEqual 帶符號數<= Z=1&&N!=V
AL 無條件執行

跳轉

B指令跳轉的范圍是PC+-32M,因為ARM一條指令32bit,操作碼B占了6bit,還有24bit裝數據,考慮到ARM的地址是4byte對齊的,所以最后的兩位都會是0,所以就可以用24bit數據表達26bit的地址空間,2^26=64M,即+-32M。如果需要跳轉的地址距離PC超過了32M,可以將目標地址壓棧,通過內存將地址傳遞給PC實現長跳轉

B{<cond>}		<target_addr>
BL{<cond>}		<target_addr>
BX{<cond>},		<Rm>
BLX	<target_address>
BLX{<cond>}	<Rm>

數據處理

  • 注意立即數的合法性問題
  • 立即數=(8bit數據) ROR 偶數位,如果不能通過這種方式得到,就會報錯
  • {S}用於表示當前指令的操作結果是否影響CPSR中的相應位
MOV{<cond>}{S}	<Rd>,	<shifter_operand>			;數據傳送
MVN{<cond>}{S}	<Rd>,	<shifter_operand>			;數據求反傳送
ADD{<cond>}{S} 	<Rd>,	<Rn>,	<shifter_operand>		;加法
ADC{<cond>}{S} 	<Rd>,	<Rn>,	<shifter_operand>		;帶位加法
SUB{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;減法
SBC{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;帶位減法
RSB{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;逆向減法
RSC{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;帶位逆向減法
AND{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;邏輯與
ORR{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;邏輯或
EOR{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;邏輯異或
BIC{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;位清除
CMP{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;比較
CMN{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;基於相反數的比較
TST{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>		;位測試
TEQ{<cond>}	<Rn>,	<shifter_operand>		        ;相等測試

數據處理指令的操作數尋址方式(shifter_operand)

<opcode>{<cond>}{S}	<Rd>,	<Rn>,	<shifter_operand>
#<immediate>                     ;立即數尋址
<Rm>                             ;寄存器尋址
<Rm>,LSL    #<shift_imm>        ;立即數邏輯左移
<Rm>,LSL    <Rs>                ;寄存器邏輯左移

<Rm>,LSR    #<shift_imm>        ;立即數邏輯右移
<Rm>,LSR    <Rs>                ;寄存器邏輯右移

<Rm>,ASR    #<shift_imm>        ;立即數算術右移
<Rm>,ASR    <Rs>                ;立即數算術右移

<Rm>,ROR    #<shift_imm>        ;立即數循環右移
<Rm>,ROR    <Rs>                ;寄存器循環右移

<Rm>,RRX                        ;寄存器擴展循環右移

乘法指令

任何乘法指令都必須使用寄存器,不能使用立即數

MUL{<cond>}{S}	<Rd>,	<Rm>,	<Rs>				;32位乘法
MLA{<cond>}{S}	<Rd>,	<Rm>,	<Rs>,	<Rn>	;32位帶加數的乘法
SMULL{<cond>}{S}	<RdLo>,	<RdHi>,	<Rm>,	<Rs>		;64位有符號數乘法
SMLAL{<cond>}{S}	<RdLo>,	<RdHi>,	<Rm>,	<Rs>		;64位帶加數的有符號數乘法
UMULL{<cond>}{S}	<RdLo>,	<RdHi>,	<Rm>,	<Rs>		;64位無符號數乘法
UMLAL{<cond>}{S}	<RdLo>,	<RdHi>,	<Rm>,	<Rs>		;64位帶加數的無符號數乘法

PSR指令

MRS{<cond>}	<Rd>,	CPSR							;將PSR的內容傳送到通用寄存器中
MRS{<cond>}	<Rd>,	SPSR							
MSR{<cond>}	CPSR_<fields>,	#<immediate>			;將通用寄存器的內容或一個立即數傳送到PSR
MSR{<cond>}	CPSR_<fields>,	<Rm>					
MSR{<cond>}	SPSR_<fields>,	#<immediate>	
MSR{<cond>}	SPSR_<fields>,	<Rm>	

內存訪問

B字節,H半字,T用戶模式,S由有符號

LDR{<cond>		<Rd>,	<addressing_mode>				;字數據讀取
LDR{<cond>}B	<Rd>,	<addressing_mode>				;字節數據讀取
LDR{<cond>}BT	<Rd>,	<addressing_mode>				;用戶模式的字節數據讀取
LDR{<cond>}H	<Rd>,	<addressing_mode>				;半字數據讀取
LDR{<cond>}SB	<Rd>,	<addressing_mode>				;有符號的字節數據讀取
LDR{<cond>}SH	<Rd>,	<addressing_mode>				;有符號的半字數據讀取
LDR{<cond>}T	<Rd>,	<post_indexed_addressing_mode>		;用戶模式的字數據讀取
STR{<cond>}		<Rd>,	<addressing_mode>				;字數據寫入
STR{<cond>}B	<Rd>,	<addressing_mode>				;字節數據寫入
STR{<cond>}H	<Rd>,	<addressing_mode>				;半字數據寫入
STR{<cond>}T	<Rd>,	< post_indexed_addressing_mode>	;用戶模式字數據寫入

批量內存訪問

LDM{<cond>}<addressing_mode>	<Rn>{!},		<registers>			;批量內存字數據讀取
LDM{<cond>}<addressing_mode>	<Rn>{!},		<registers_without_pc>	;用戶模式的批量內存字數據讀取
LDM{<cond>}<addressing_mode>	<Rn>{!},		<registers_and_pc>		;帶PSR的批量內存字數據讀取
STM{<cond>}<addressing_mode>	<Rn>{!},		<registers>			;批量內存字數據寫入
STM{<cond>}<addressing_mode>	<Rn>,		<registers>			;用戶模式的批量內存字數據寫入

異常發生指令

SWI{<cond>}	<immed_24>		;軟中斷
BKPT	<immediate>			;斷點中斷


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM