ARM-汇编指令集
ARM 指令集
ARM 指令集分為 6 類:
- 跳轉指令
- 數據處理指令
- 程序狀態寄存器(PSR)轉移指令
- Load/Store 指令
- 協處理器指令
- 異常中斷產生指令
指令的一般格式
ARM 指令的一般編碼格式
<opcode> {<cond>}{S} <Rd>,<Rn>,<shifter_operand>opcode:是指令助記符,如 ADD 表示算數加法操作指令
cond:表示指令執行的條件
S:決定指令的操作是否影響 CPSR 的值
Rd:表示目標寄存器
Rn:表示包含第 1 個操作數的寄存器
shifter_operand:表示第 2 個操作數
跳轉指令
- B 跳轉指令
- 僅僅執行跳轉操作
- BL 帶返回的跳轉指令
- 執行跳轉操作的同時還將 PC 寄存器的值保存在 LR 寄存器中,BL 指令用于實現子程序調用,子程序的返回可以通過將 LR 寄存器的值復制到 PC 寄存器中來實現
- BX 帶狀態切換的跳轉指令
- BX 指令跳轉到指令中指定的目標地址,目標地址處的指令可以是 ARM 指令,也可以是 Thumb 指令
- BLX 帶返回和狀態切換的跳轉指令
- 從 ARM 指令跳轉到指令中指定的目標地址,目標地址可以是 ARM 指令,也可以是 Thumb 指令
數據處理指令
數據處理指令又分為三類
數據傳送指令:如 MOV
算數邏輯運算指令:如 ADD
比較指令:如 TST
- MOV:數據傳送指令
- MVN:數據求反傳送指令
- CMP:比較指令
- CMN:基于相反數的比較指令
- TST:位測試指令
- TEQ:相等測試指令
- ADD:加法指令
- SUB:減法指令
- RSB:逆向加法指令
- ADC:帶位加法指令
- SBC:帶位減法指令
- RSC:帶位逆向減法指令
- AND:邏輯與操作指令
- BIC:位清除指令
- EOR:邏輯異或操作指令
- ORR:邏輯或操作指令
MOV 傳送指令
MOV 指令將 <shifter_operand> 表示的數據傳送到目標寄存器 中,并根據操作的結果更新 CPSR 相應的條件標志位
指令的語法格式:
MOV {<cond>}{S} <Rd>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
shifter_operand:為向目標寄存器傳送的數據
MOV 指令完成的功能:
- 將數據從一個寄存器傳送到另一個寄存器
- 將一個常數傳送到一個寄存器中
- 實現單純的移位操作。左移操作可以實現將操作數乘以 2 n 次方
- 當 PC 寄存器作為目標寄存器是可以程序跳轉。這種跳轉可以實現子程序調用以及從子程序中返回
- 當 PC 寄存器作為目標寄存器且指令中 S 位被設置時,指令在執行跳轉操作的同時,將當前處理器模式的 SPSR 寄存器內容復制到 CPSR 中。這樣 MOVS PC,LR 可以實現從某些異常中斷中返回。
MVN 傳送指令
MVN 指令將 <shifter_operand> 表示的數據的反碼傳送到目標寄存器 中,并根據操作的結果更新 CPSR 相應的條件標志位
指令的語法格式:
MVN {<cond>}{S} <Rd>,<shifter_operand>其中各參數的用法與 MOV 傳送指令相同
MVN 指令有以下用途
- 向寄存器中傳送一個負數
- 生成位掩碼
- 求一個數的反碼
ADD 加法指令
ADD 指令將 <shifter_operand> 表示的數據與寄存器 中的值相加,并把結果保存在目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的標志位
ADD 指令實現兩個操作數相加
指令的語法格式
ADD {<cond>}{S} <Rd>,<Rn>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
示例:
ADD Rx, Rx,#1 ;Rx=Rx+1 ADD Rd, Rx, Rx, LSL, #n ;Rd=Rx+Rx*(2*n) ADD Rs, PC, #offset ;生成基于 PC 的跳轉指針ADC 帶位加法指令
ADC 指令將 <shifter_operand> 表示的數據與寄存器 中的值相加,再加上 CPSR 中 C 條件標志位的值,并把結果保存在目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的標志位
指令的語法格式
ADC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
ADC 指令和 ADD 指令聯合使用可以實現兩個 64 位的操作數相加。
如果寄存器 R0 和 R1 中放置一個 64 位的源操作數,其中 R0 中放置低 32 位數值,R1 中放置高 32 位數據,
如果寄存器 R2 和 R3 中放置另一個 64 位的源操作數,其中 R2 中放置低 32 位數值,R3 中放置高 32 位數據,
下面的指令序列實現了兩個 64 位操作數的加法操作
ADDS R4,R0,R2 ADC R5,R1,R3若將 ADC R5,R1,R3 指令改為 ADCS R5,R1,R3,操作結果將影響到 CPSR 寄存器中相應的條件標志位的值
SUB 減法指令
SUB 指令從寄存器 中減去 <shifter_operand> 表示的數值,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。
指令的語法格式
SUB {<cond>}{S} <Rd>,<Rn>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
SUB 指令實現兩個操作數相減
示例:
SUB Rx,RX,#1 ;Rx=Rx-1SBC 帶位減法指令
SBC 指令從寄存器 中減去 <shifter_operand> 表示的數值,再減去 CPSR 中 C 條件標志位的反碼,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。
指令的語法格式
SBC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
RSB 逆向減法指令
RSB 指令從 <shifter_operand> 表示的數值中減去寄存器 值,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。
指令的語法格式
RSB {<cond>}{S} <Rd>,<Rn>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
示例:
RSB Rd, Rx, #0; Rd=-RxRSC 帶位逆向減法指令
RSC 指令從 <shifter_operand> 表示的數值中減去寄存器 值,再減去寄存器 CPSR 中 C 條件標志位的反碼,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。
指令的語法格式
RSC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
AND 邏輯與操作指令
AND 指令將 <shifter_operand> 表示的數值中與寄存器 的值按位做邏輯與操作,,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。
指令的語法格式
AND {<cond>}{S} <Rd>,<Rn>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
ORR 邏輯或操作指令
ORR 指令將 <shifter_operand> 表示的數值中與寄存器 的值按位做邏輯或操作,,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。
指令的語法格式
ORR {<cond>}{S} <Rd>,<Rn>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
EOR 邏輯或操作指令
EOR 指令將 <shifter_operand> 表示的數值中與寄存器 的值按位做邏輯異或操作,,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。
指令的語法格式
EOR {<cond>}{S} <Rd>,<Rn>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
BIC 位清除指令
BIC 指令將 <shifter_operand> 表示的數值中與寄存器 的值的反碼按位做邏輯與操作,,并把結果保存到目標寄存器 中,同時根據操作的結果更新 CPSR 中相應的條件標志位。
指令的語法格式
BIC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>cond:為指令執行的條件碼
S:決定指令的操作是否影響 CPSR 中條件標志位的值
Rd:寄存器為目標寄存器
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
CMP 比較指令
CMP 指令從寄存器 中減去 <shifter_operand> 表示的數值,根據操作的結果更新 CPSR 中相應的條件標志位,后面的指令就可以根據 CPSR 中相應的條件標志位來判斷是否執行。
指令的語法格式
CMP {<cond>}<Rn>,<shifter_operand>cond:為指令執行的條件碼
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
CMN 基于相反數的比較指令
CMN 指令從寄存器 中加上 <shifter_operand> 表示的數值,根據操作的結果更新 CPSR 中相應的條件標志位,后面的指令就可以根據 CPSR 中相應的條件標志位來判斷是否執行。
指令的語法格式
CMN {<cond>}<Rn>,<shifter_operand>cond:為指令執行的條件碼
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
TST 位測試指令
TST 指令將 <shifter_operand> 表示的數值中與寄存器 的值按位做邏輯與操作,根據操作的結果更新 CPSR 中相應的條件標志位
指令的語法格式
TST {<cond>}<Rn>,<shifter_operand>cond:為指令執行的條件碼
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
TEQ 相等測試指令
TEQ 指令將 <shifter_operand> 表示的數值中與寄存器 的值按位做邏輯異或操作,根據操作的結果更新 CPSR 中相應的條件標志位
指令的語法格式
TST {<cond>}<Rn>,<shifter_operand>cond:為指令執行的條件碼
Rn:寄存器為第 1 個源操作數所在的寄存器
shifter_operand:為向目標寄存器傳送的數據
總結
- 上一篇: Linux应用编程之共享内存实例
- 下一篇: 时间复杂度和空间复杂度,一看就懂,面试前