算術移位寄存器和邏輯指令
MOV傳送
MOV{條件}{S} <dest>, <op 1>
dest = op_1
MOV從另一個寄存器、被移位的寄存器或者一個立即數裝載一個值到目的寄存器。還可以指定相同的寄存器來實現 NOP 指令。如:MOV R0,R0
。移位後傳送指令:MOV R0, R0, LSL#3
。
如果 R15 是目的寄存器,將修改程序計數器或標誌。這用於返回到調用代碼,方法是把連接寄存器的內容傳送到 R15:
退出到調用者:MOV PC, R14
。
退出到調用者並恢復標誌位:MOVS PC, R14
。
指令中後綴有S說明該指令會改變CPSR。
MVN傳送取反
mvn{條件}{S} <dest>, <op 1>
dest = !op_1
MVN在傳送的之前位被反轉了,把被取反的值傳送到一個寄存器中。這是邏輯非操作而不是算術操作,這個取反的值加1纔是它的取負的值:
MVN R0, #4 ; R0 = -5
MVN R0, #0 ; R0 = -1
SUB減法
SUB{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 - op_2
SUB用操作數1減去操作數2,把結果放置到目的寄存器中。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即值:
SUB R0, R1, R2 ; R0 = R1 - R2
SUB R0, R1, #256 ; R0 = R1 - 256
SUB R0, R2, R3,LSL#1 ; R0 = R2 - (R3 << 1)
減法可以在有符號和無符號數上進行,減數不可爲立即數。
ADD加法
ADD{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 + op_2
ADD將把兩個操作數加起來,把結果放置到目的寄存器中。操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器或一個立即值:
ADD R0, R1, R2 ; R0 = R1 + R2
ADD R0, R1, #256 ; R0 = R1 + 256
ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)
AND邏輯與
AND{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 AND op_2
AND將在兩個操作數上進行邏輯與,把結果放置到目的寄存器中;對屏蔽你要在上面工作的位很有用。 操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器或一個立即值:
AND R0, R0, #3 ; R0 = 保持 R0 的位 0 和 1,丟棄其餘的位。
AND 的真值表:
Op_1 Op_2 結果
0 0 0
0 1 0
1 0 0
1 1 1
BIC位清除
BIC{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 AND (!op_2)
BIC是在一個字中清除位的一種方法,與 OR 位設置是相反的操作。操作數2是一個32位位掩碼(mask)。如果如果在掩碼中設置了某一位,則清除這一位。未設置的掩碼位指示此位保持不變。
BIC R0, R0, #0b1011 ; 清除 R0 中的位 0、1和 3
BIC 真值表:
Op_1 Op_2 結果
0 0 0
0 1 0
1 0 1
1 1 0
比較指令
CMP : 比較
CMP{條件}{P} <op 1>, <op 2>
status = op_1 - op_2
CMP允許把一個寄存器的內容如另一個寄存器的內容或立即值進行比較,更改狀態標誌來允許進行條件執行。它進行一次減法,但不存儲結果,而是正確的更改標誌。標誌表示的是操作數1比操作數2如何(大小等)。如果操作數1大於操作操作數2,則此後的有 GT 後綴的指令將可以執行。明顯的,你不需要顯式的指定 S 後綴來更改狀態標誌… 如果你指定了它則被忽略。
會影響程序狀態字:
寄存器 15 (26-bit 模式):
R15 構造如下:
Bit 31 30 29 28 27 26 25------------2 1 0
N Z C V I F 程 序 計 數 器 S1 S0
標誌的意義:
N Negative 如果結果是負數則置位
Z Zero 如果結果是零則置位
C Carry 如果發生進位則置位
O Overflow 如果發生溢出則置位
I IRQ 中斷禁用
F FIQ 快速中斷禁用
S1 和 S0 是處理器模式標誌:
S1 S0 模式
0 0 USR - 用戶模式
0 1 FIQ - 快速中斷模式
1 0 IRQ - 中斷模式
1 1 SVC - 超級用戶模式
在 R15 作爲一個指令的第一個操作數的時候,只有程序計數器部分是可以獲得的。所以,下列指令把 PC 複製到一個寄存器中並向這個目標寄存器加上 256:ADD R0, R15, #256
TST : 測試位指令
TST{條件}{P} <op 1>, <op 2>
Status = op_1 AND op_2
TST 類似於 CMP,不產生放置到目的寄存器中的結果。而是在給出的兩個操作數上進行操作並把結果反映到狀態標誌上。使用 TST 來檢查是否設置了特定的位。操作數 1 是要測試的數據字而操作數 2 是一個位掩碼。經過測試後,如果匹配則設置 Zero 標誌,否則清除它。象 CMP 那樣,你不需要指定 S 後綴。
TST R0, #0b1 ; 測試在R0中是否設置了位0