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