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