ARM指令集-數(shù)據(jù)處理指令
數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指令、算術(shù)邏輯運算指令和比較指令等。
數(shù)據(jù)傳送指令用于在寄存器和存儲器之間進行數(shù)據(jù)的雙向傳輸。 算術(shù)邏輯運算指令完成常用的算術(shù)與邏輯的運算,該類指令不但將運算結(jié)果保存在目的寄存器中,同時更新CPSR 中的相應(yīng)條件標(biāo)志位。 比較指令不保存運算結(jié)果,只更新CPSR 中相應(yīng)的條件標(biāo)志位。
數(shù)據(jù)處理指令包括:
— MOV 數(shù)據(jù)傳送指令
— MVN 數(shù)據(jù)取反傳送指令
— CMP 比較指令
— CMN 反值比較指令
— TST 位測試指令
— TEQ 相等測試指令
— ADD 加法指令
— ADC 帶進位加法指令
— SUB 減法指令
— SBC 帶借位減法指令
— RSB 逆向減法指令
— RSC 帶借位的逆向減法指令
— AND 邏輯與指令
— ORR 邏輯或指令
— EOR 邏輯異或指令
— BIC 位清除指令
1、 MOV 指令
MOV 指令的格式為:
MOV{條件}{S} 目的寄存器,源操作數(shù)
MOV 指令可完成從另一個寄存器、被移位的寄存器或?qū)⒁粋€立即數(shù)加載到目的寄存器。其中S選項決定指令的操作是否影響CPSR 中條件標(biāo)志位的值,當(dāng)沒有S 時指令不更新CPSR 中條件標(biāo)志位的值。
指令示例:
MOV R1 , R0 ;將寄存器 R0 的值傳送到寄存器 R1
MOV PC , R14 ;將寄存器 R14 的值傳送到 PC ,常用于子程序返回
MOV R1 , R0 , LSL # 3 ;將寄存器 R0 的值左移 3 位后傳送到 R1
2、 MVN 指令
MVN 指令的格式為:
MVN{條件}{S} 目的寄存器,源操作數(shù)
MVN 指令可完成從另一個寄存器、被移位的寄存器、或?qū)⒁粋€立即數(shù)加載到目的寄存器。與MOV 指令不同之處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。其中S 決定指令的操作是否影響CPSR 中條件標(biāo)志位的值,當(dāng)沒有S 時指令不更新CPSR 中條件標(biāo)志位的值。
指令示例:
MVN R0 ,# 0 ;將立即數(shù) 0 取反傳送到寄存器 R0 中,完成后 R0=-1
3、 CMP 指令
CMP 指令的格式為:
CMP{條件} 操作數(shù)1,操作數(shù)2
CMP 指令用于把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行比較,同時更新CPSR 中條件標(biāo)志位的值。該指令進行一次減法運算,但不存儲結(jié)果,只更改條件標(biāo)志位。標(biāo)志位表示的是操作數(shù)1 與操作數(shù)2 的關(guān)系(大、小、相等),例如,當(dāng)操作數(shù)1 大于操作操作數(shù)2,則此后的有GT后綴的指令將可以執(zhí)行。
指令示例:
CMP R1 , R0 ;將寄存器 R1 的值與寄存器 R0 的值相減,并根據(jù)結(jié)果設(shè)置 CPSR 的標(biāo)志位
CMP R1 ,# 100 ;將寄存器 R1 的值與立即數(shù) 100 相減,并根據(jù)結(jié)果設(shè)置 CPSR 的標(biāo)志位
4、 CMN 指令
CMN 指令的格式為:
CMN{條件} 操作數(shù)1,操作數(shù)2
CMN 指令用于 把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)取反后進行比較,同時更新CPSR 中條件標(biāo)志位的值。該指令實際完成操作數(shù)1 和操作數(shù)2 相加,并根據(jù)結(jié)果更改條件標(biāo)志位。
指令示例:
CMN R1 , R0 ;將寄存器 R1 的值與寄存器 R0 的值相加,并根據(jù)結(jié)果設(shè)置 CPSR 的標(biāo)志位
CMN R1 ,# 100 ;將寄存器 R1 的值與立即數(shù) 100 相加,并根據(jù)結(jié)果設(shè)置 CPSR 的標(biāo)志位
5、 TST 指令
TST 指令的格式為:
TST{條件} 操作數(shù)1,操作數(shù)2
TST 指令用于 把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行按位的與運算,并根據(jù)運算結(jié)果更新CPSR 中條件標(biāo)志位的值。操作數(shù)1 是要測試的數(shù)據(jù),而操作數(shù)2 是一個位掩碼,該指令一般用來檢測是否設(shè)置了特定的位。
指令示例:
TST R1 ,#% 1 ;用于測試在寄存器 R1 中是否設(shè)置了最低位(%表示二進制數(shù))
TST R1 ,# 0xffe ;將寄存器 R1 的值與立即數(shù) 0xffe 按位與,并根據(jù)結(jié)果設(shè)置 CPSR 的標(biāo)志位
6、 TEQ 指令
TEQ 指令的格式為:
TEQ{條件} 操作數(shù)1,操作數(shù)2
TEQ 指令用于 把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行按位的異或運算,并根據(jù)運算結(jié)果更新CPSR 中條件標(biāo)志位的值。該指令通常用于比較操作數(shù)1 和操作數(shù)2 是否相等。
指令示例:
TEQ R1 , R2 ;將寄存器 R1 的值與寄存器 R2 的值按位異或,并根據(jù)結(jié)果設(shè)置 CPSR 的標(biāo) 志位
7、 ADD 指令
ADD 指令的格式為:
ADD{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
ADD 指令用于 把兩個操作數(shù)相加,并將結(jié)果存放到目的寄存器中。操作數(shù) 1 應(yīng)是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。
指令示例:
ADD R0 , R1 , R2 ; R0 = R1 + R2
ADD R0 , R1 , #256 ; R0 = R1 + 256
ADD R0 , R2 , R3 , LSL#1 ; R0 = R2 + (R3 << 1)
8、 ADC 指令
ADC 指令的格式為:
ADC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
ADC 指令用于 把兩個操作數(shù)相加,再加上CPSR 中的C 條件標(biāo)志位的值,并將結(jié)果存放到目的寄存器中。它使用一個進位標(biāo)志位,這樣就可以做比32 位大的數(shù)的加法,注意不要忘記設(shè)置S 后綴來更改進位標(biāo)志。操作數(shù)1 應(yīng)是一個寄存器,操作數(shù)2 可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。
以下指令序列完成兩個128 位數(shù)的加法,第一個數(shù)由高到低存放在寄存器R7~R4,第二個數(shù)由高到低存放在寄存器R11~R8,運算結(jié)果由高到低存放在寄存器R3~R0:
ADDS R0 , R4 , R8 ; 加低端的字
ADCS R1 , R5 , R9 ; 加第二個字,帶進位
ADCS R2 , R6 , R10 ; 加第三個字,帶進位
ADC R3 , R7 , R11 ; 加第四個字,帶進位
9、 SUB 指令
SUB 指令的格式為:
SUB{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
SUB 指令用于 把操作數(shù) 1 減去操作數(shù) 2 ,并將結(jié)果存放到目的寄存器中。操作數(shù) 1 應(yīng)是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令可用于有符號數(shù)或無符號數(shù)的減法運算。
指令示例:
SUB R0 , R1 , R2 ; R0 = R1 - R2
SUB R0 , R1 , #256 ; R0 = R1 - 256
SUB R0 , R2 , R3 , LSL#1 ; R0 = R2 - (R3 << 1)
10、SBC 指令
SBC 指令的格式為:
SBC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
SBC 指令用于 把操作數(shù) 1 減去操作數(shù) 2 ,再減去CPSR 中的C 條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù) 1 應(yīng)是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令使用進位標(biāo)志來表示借位,這樣就可以做大于 32 位的減法,注意不要忘記設(shè)置S后綴來更改進位標(biāo)志。該指令可用于有符號數(shù)或無符號數(shù)的減法運算。
指令示例:
SUBS R0 , R1 , R2 ; R0 = R1 - R2 - ! C ,并根據(jù)結(jié)果設(shè)置 CPSR 的進位標(biāo)志位
11、RSB 指令
RSB 指令的格式為:
RSB{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
RSB 指令稱為逆向減法指令,用于 把操作數(shù) 2 減去操作數(shù) 1 ,并將結(jié)果存放到目的寄存器中。操作數(shù) 1 應(yīng)是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令可用于有符號數(shù)或無符號數(shù)的減法運算。
指令示例:
RSB R0 , R1 , R2 ; R0 = R2 – R1
RSB R0 , R1 , #256 ; R0 = 256 – R1
RSB R0 , R2 , R3 , LSL#1 ; R0 = (R3 << 1) - R2
12、RSC 指令
RSC 指令的格式為:
RSC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
RSC 指令用于 把操作數(shù) 2 減去操作數(shù) 1 ,再減去CPSR 中的C 條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù) 1 應(yīng)是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令使用進位標(biāo)志來表示借位,這樣就可以做大于 32 位的減法,注意不要忘記設(shè)置S后綴來更改進位標(biāo)志。該指令可用于有符號數(shù)或無符號數(shù)的減法運算。
指令示例:
RSC R0 , R1 , R2 ; R0 = R2 – R1 - ! C
13、AND 指令
AND 指令的格式為:
AND{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
AND 指令用于 在兩個操作數(shù)上進行邏輯與運算,并把結(jié)果放置到目的寄存器中。操作數(shù) 1 應(yīng)是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令常用于屏蔽操作數(shù) 1 的某些位。
指令示例:
AND R0 , R0 ,# 3 ; 該指令保持 R0 的 0 、 1 位,其余位清零。
14、ORR 指令
ORR 指令的格式為:
ORR{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
ORR 指令用于 在兩個操作數(shù)上進行邏輯或運算,并把結(jié)果放置到目的寄存器中。操作數(shù) 1應(yīng)是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令常用于設(shè)置操作數(shù) 1 的某些位。
指令示例:
ORR R0 , R0 ,# 3 ; 該指令設(shè)置 R0 的 0 、 1 位,其余位保持不變。
15、EOR 指令
EOR 指令的格式為:
EOR{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
EOR 指令用于 在兩個操作數(shù)上進行邏輯異或運算,并把結(jié)果放置到目的寄存器中。操作數(shù) 1 應(yīng)是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。該指令常用于反轉(zhuǎn)操作數(shù) 1 的某些位。
指令示例:
EOR R0 , R0 ,# 3 ; 該指令反轉(zhuǎn) R0 的 0 、 1 位,其余位保持不變。
16、BIC 指令
BIC 指令的格式為:
BIC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
BIC 指令用于清除 操作數(shù) 1 的某些位,并把結(jié)果放置到目的寄存器中。操作數(shù) 1 應(yīng)是一個寄存器,操作數(shù) 2 可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。操作數(shù) 2 為 32 位的掩碼,如果在掩碼中設(shè)置了某一位,則清除這一位。未設(shè)置的掩碼位保持不變。
指令示例:
BIC R0 , R0 ,#% 1011 ;該指令清除 R0