簡介
計算機指令,就是指揮機器工作的指示和命令,程式就是一系列按一定順序排列的指令,執行程式的過程就是計算機的工作過程。每一台計算機均有自己的特定的指令系統,其指令內容和格式有所不同。數據處理指令是指對暫存器中的數據進行操作指令。數據處理指令可分為數據傳送指令、算術邏輯運算指令和比較指令等。數據傳送指令用於在暫存器和存儲器之間進行數據的雙向傳輸。算術邏輯運算指令完成常用的算術與邏輯的運算,該類指令不但將運算結果保存在目的暫存器中,同時更新CPSR中的相應條件標誌位。比較指令不保存運算結果,只更新CPSR中相應的條件標誌位。
常見數據處理指令
MOV:數據傳送指令。
MVN:數據取反傳送指令。
CMP:比較指令。
CMN:反值比較指令。
TST:位測試指令。
TEQ:相等測試指令。
ADD:加法指令。
ADC:帶進位加法指令。
SUB:減法指令。
SBC:帶借位減法指令。
RSB:逆向減法指令。
RSC:帶借位的逆向減法指令。
AND:邏輯與指令。
ORR:邏輯或指令。
EOR:邏輯異或指令。
BIC:位清除指令。
數據傳送指令
最常用的就是MOV指令了,語法格式如下:
MOV{<cond>}{S} <Rd>, <shifter_operand>
MOV指令將<shifter_operand>表示的數據傳送到目標暫存器Rd中,若指令中帶有S標誌,則根據操作結果更新CPSR中的N、Z、C位。
MVN傳送指令
MVN{<cond>}{S} <Rd>, <shifter_operand>
與MOV指令類似,MVN表示將數據的反碼傳送到目標暫存器,並根據情況更新CPSR中的N、Z、C位。
MRS指令
MRS{<cond>} <Rd>, CPSR
從指令語法中,我們能夠猜測出該指令是對CPSR暫存器進行操作的指令,它的主要功能是將狀態暫存器中的內容傳送到能用暫存器中。
MSR指令
MSR<cond> CPSR_<fields>, <shifter_operand>
MSR<cond> SPSR_<fields>, <shifter_operand>
<fields>指的是狀態暫存器中需要操作的位。狀態暫存器的32位可以分為4個8位的域:0-7位為控制項位域,用c表示,8-15位為擴展位域,用x表示,16-23位為狀態位域,用s表示,24-31位為條件標誌位域,用f表示。
MSR指令的功能是將數據傳送到狀態暫存器中。MSR與MRS指令通過讀出-修改-寫回操作,用於恢復或者改變狀態暫存器的內容。
MRS R0, CPSR ;讀取CPSR
BIC R0, R0, #0x1F ;修改,去除當前處理器模式
ORR R0, R0, #0x13 ;修改,設定特權模式
MSR CPSR_c, R0 ;寫回,僅僅修改CPSR中的控制位域
BIC位清除指令
BIC{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
BIC指令將<shifter_operand>表示的數值與暫存器<Rn>的值的反碼按位做邏輯與操作,並把結果保存到目標暫存器<Rd>中。
比較指令
CMP比較指令
CMP{<cond>} <Rn>, <shifter_operand>
CMP指令從暫存器Rn中減去<shifter_operand>表示的數值,根據操作的結果更新CPSR中的相應的條件標誌位,後面的指令就可以根據CPSR中相應的位來判斷是否執行了。
CMN基於相反數的比較指令
CMN{<cond>} <Rn>, <shifter_operand>
CMN指令將暫存器Rn中的值加上<shifter_operand>表示的數值,根據操作的結果更新CPSR中相應的條件標誌位。與CMP指令相比,就可以理解CMN為什麼叫基於相反數的比較指令了。
TST位測試指令
TST{<cond>} <Rn>, <shifter_operand>
TST指令將<shifter_operand>表示的數值與Rn中的值按位做邏輯與運算,根據操作的結果更新CPSR中的條件標識位。TST指令通常用於測試暫存器中某些位是1還是0。
TEQ相等測試指令
TEQ{<cond>} <Rn>, <shifter_operand>
TEQ指令將<shifter_operand>表示的數值與暫存器<Rn>的值做邏輯異或操作,根據操作的結果更新CPSR中的條件標誌位。TEQ通常用於比較兩個數是否相等,與CMP/CMN操作相比,TEQ操作通常不影響CPSR中的V、C位。
算術邏輯指令
算術指令
加法指令ADD
{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;加法指令
ADC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;帶位加法指令
ADD指令將Rn中的值與<shifter_operand>表示的值相加,並將結果保存到目標暫存器Rd中。
ADC指令將Rn中的值與<shifter_operand>表示的值相加,再加上CPSR中的C條件標誌位的值,並將結果保存到目標暫存器<Rd>中。
ADD指令與ADC指令聯合使用,可以實現兩個64位的運算元據相加,代碼如下:
ADDS R4, R0, R2 ;兩個64位數R1R0與R3R2,先將兩個數的低位相加,結果保存在R4中,如有進位,保存在CPSR的C位中
ADC R5, R1, R3 ;再將兩個數的高位相加,並加上低位相加的進位,結果保存在R5中,R5R4則表示這兩個64位數相加的結果
減法指令SUB
{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ; 減法指令
SBC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;帶位減法指令同加法指令類似,減法指令也有帶位與不帶位兩條指令,用法也非常類似,同樣也可用作64位數的減法:
SUBS R4, R0, R2
SBC R5, R1, R3
逆向減法指令
RSB{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;逆向減法指令
RSC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;帶位逆向減法指令
逆向減法指令也是實現了兩個運算元據的減法,與減法指令不同的是,逆向減法指令是從<shifter_operand>表示的數中減去暫存器Rn的值,Rd中保存操作的結果。
乘法指令
MUL{<cond>}{S} <Rd>, <Rm>, <Rs>
MLA{<cond>}{S} <Rd>, <Rm>, <Rs>, <Rn>
MUL實現兩個32位數Rm與Rs的乘積,並將結果保存到Rd中。
MLA實現兩個32位數Rm與Rs的乘積,再將乘積加上Rn後保存到Rd中。
邏輯操作指令
AND與操作指令
AND{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
AND指令將<shifter_operand>表示的值與Rn的值按位做邏輯與操作,結果保存到Rd中。
ORR或操作指令
ORR{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
ORR指令將<shifter_operand>表示的值與Rn的值按位做邏輯或操作,結果保存到Rd中。
EOR異或操作指令
EOR{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
EOR指令將<shifter_operand>表示的值與Rn的值按位做邏輯異或操作,結果保存到Rd中。