【ARM】数据操作指令(下)
00. 目錄
文章目錄
- 00. 目錄
- 01. 數(shù)據(jù)操作指令概述
- 02. RSC指令
- 03. TST測試指令
- 04. TEQ指令
- 05. CMP 指令
- 06. CMN 指令
- 07. ORR 指令
- 08. BIC位清零指令
- 09. 附錄
01. 數(shù)據(jù)操作指令概述
? 數(shù)據(jù)操作指令是指對存放在寄存器中的數(shù)據(jù)進(jìn)行操作的指令。主要包括數(shù)據(jù)傳送指令、算術(shù)指令、邏輯指令、比較與測試指令及乘法指令。
? 如果在數(shù)據(jù)處理指令前使用 S 前綴,指令的執(zhí)行結(jié)果將會影響 CPSR 中的標(biāo)志位。數(shù)據(jù)處理指令如表 3-6 所示。
02. RSC指令
RSC(Reverse Subtract with Carry)指令從寄存器 shifter_operand 中減去 Rn 表示的數(shù)值,再減去寄存器 CPSR 中 C 條件標(biāo)志位的反碼[NOT(Carry Flag)],并將結(jié)果保存到目標(biāo)寄存器 Rd 中,并根據(jù)指令的執(zhí)行結(jié)果設(shè)置 CPSR 中相應(yīng)的標(biāo)志位。
2.1 指令的語法格式
RSC{<cond>}{S} <Rd>,<Rn>,<shifter_operand>2.2 應(yīng)用示例一
@ 下面的程序使用 RSC 指令實現(xiàn)求 64 位數(shù)值的負(fù)數(shù)。 RSBS R2,R0,#0 RSC R3,R1,#003. TST測試指令
TST(Test)測試指令用于將一個寄存器的值和一個算術(shù)值進(jìn)行比較。條件標(biāo)志位根據(jù)兩個操作數(shù)做“邏輯與”后的結(jié)果設(shè)置。
3.1 指令的語法格式
TST{<cond>} <Rn>,<shifter_operand>3.2 應(yīng)用示例一
TST 指令類似于 CMP 指令,不產(chǎn)生放置到目的寄存器中的結(jié)果。而是在給出的兩個操作數(shù)上進(jìn)行操作并把結(jié)果反映到狀態(tài)標(biāo)志上。使用 TST 指令來檢查是否設(shè)置了特定的位。操作數(shù) 1 是要測試的數(shù)據(jù)字,而操作數(shù) 2 是一個位掩碼。經(jīng)過測試后,如果匹配則設(shè)置 Zero標(biāo)志,否則清除它。與 CMP 指令一樣,該指令不需要指定 S 后綴。下面的指令測試在 R0 中是否設(shè)置了位 0。
TST R0, #104. TEQ指令
TEQ(Test Equivalence)指令用于將一個寄存器的值和一個算術(shù)值做比較。條件標(biāo)志位根據(jù)兩個操作數(shù)做“邏輯異或”后的結(jié)果設(shè)置。以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。
4.1 指令的語法格式:
TEQ{<cond>} <Rn>,<shifter_operand>4.2 應(yīng)用示例一
@ 下面的指令是比較 R0 和 R1 是否相等,該指令不影響 CPSR 中的 V 位和 C 位。 TEQ R0,R1TST 指令與 EORS 指令的區(qū)別在于 TST 指令不保存運算結(jié)果。使用 TEQ 進(jìn)行相等測試,常與 EQ 和 NE 條件碼配合使用,當(dāng)兩個數(shù)據(jù)相等時,條件碼 EQ 有效;否則條件碼NE 有效。
05. CMP 指令
CMP(Compare)指令使用寄存器 Rn 的值減去 operand2 的值,根據(jù)操作的結(jié)果更新CPSR 中相應(yīng)的條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。
CMP 指令允許把一個寄存器的內(nèi)容與另一個寄存器的內(nèi)容或立即值進(jìn)行比較,更改狀態(tài)標(biāo)志來允許進(jìn)行條件執(zhí)行。它進(jìn)行一次減法,但不存儲結(jié)果,而是正確地更改標(biāo)志位。標(biāo)志位表示的是操作數(shù) 1 與操作數(shù) 2 比較的結(jié)果(其值可能為大于、小于、相等)。如果操作數(shù) 1 大于操作數(shù) 2,則此后的有 GT 后綴的指令將可以執(zhí)行。顯然,CMP 不需要顯式地指定 S 后綴來更改狀態(tài)標(biāo)志。
5.1 指令語法格式
CMP{<cond>} <Rn>,<shifter_operand>5.2 應(yīng)用示例一
@ 比較 R1 和立即數(shù) 10 并設(shè)置相關(guān)的標(biāo)志位。 CMP R1,#105.3 應(yīng)用示例二
@ 比較寄存器 R1 和 R2 中的值并設(shè)置相關(guān)的標(biāo)志位。 CMP R1,R2通過上面的例子可以看出,CMP 指令與 SUBS 指令的區(qū)別在于 CMP 指令不保存運算結(jié)果,在進(jìn)行兩個數(shù)據(jù)大小判斷時,常用 CMP 指令及相應(yīng)的條件碼來進(jìn)行操作。
06. CMN 指令
CMN(Compare Negative)指令使用寄存器 Rn 的值減去 operand2 的負(fù)數(shù)值(加上operand2),根據(jù)操作的結(jié)果更新 CPSR 中相應(yīng)的條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。
6.1 指令的語法格式
CMN{<cond>} <Rn>,<shifter_operand>6.2 應(yīng)用示例一
CMN 指令將寄存器 Rn 中的值加上 shifter_operand 表示的數(shù)值,根據(jù)加法的結(jié)果設(shè)置CPSR 中相應(yīng)的條件標(biāo)志位。寄存器 Rn 中的值加上 shifter_operand 的操作結(jié)果對 CPSR 中條件標(biāo)志位的影響,與寄存器 Rn 中的值減去 shifter_operand 的操作結(jié)果的相反數(shù)對 CPSR中條件標(biāo)志位的影響有細(xì)微差別。當(dāng)?shù)?2 個操作數(shù)為 0 或者為 0x80000000 時,兩者結(jié)果不同。比如下面兩條指令。
@ 第 1 條指令使標(biāo)志位 C 值為 1,第 2 條指令使標(biāo)志位 C 值為 0。 CMP Rn,#0 CMN Rn,#06.3 應(yīng)用示例二
@ 下面的指令使 R0 值加 1,判斷 R0 是否為 1 的補(bǔ)碼,若是,則 Z 置位。 CMN R0,#107. ORR 指令
ORR(Logical OR)為邏輯或操作指令,它將第 2 個源操作數(shù) shifter_operand 的值與寄存器 Rn 的值按位做“邏輯或”操作,結(jié)果保存到 Rd 中。
7.1 指令的語法格式
ORR{<cond>}{S} <Rd>,<Rn>,<shifter_operand>7.2 應(yīng)用示例一
@ 設(shè)置 R0 中位 0 和 1。 ORR R0, R0, #37.3 應(yīng)用示例二
@ 將 R0 的低 4 位置 1。 ORR R0,R0,#0x0F7.2 應(yīng)用示例一
@ 使用 ORR 指令將 R2 的高 8 位數(shù)據(jù)移入到 R3 的低 8 位中。 MOV R1,R2,LSR #4 ORR R3,R1,R3,LSL #808. BIC位清零指令
BIC(Bit Clear)位清零指令,將寄存器 Rn 的值與第 2 個源操作數(shù) shifter_operand 的值的反碼按位做“邏輯與”操作,結(jié)果保存到 Rd 中。
8.1 指令的語法格式
BIC{<cond>}{S} <Rd>,<Rn>,<shifter_operand>8.2 應(yīng)用示例一
@ 清除 R0 中的位 0、1 和 3,保持其余的不變。 BIC R0, R0, #0b10118.3 應(yīng)用示例二
@ 將 R3 的反碼和 R2 做“邏輯與”操作,結(jié)果保存到 R1 中。 BIC R1,R2,R309. 附錄
11.1 ARM Architecture Reference Manual
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的【ARM】数据操作指令(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ARM】数据操作指令(上)
- 下一篇: 【ARM】乘法指令