[ARM裸機程序][7]ARM 指令分類學習

算術移位寄存器和邏輯指令

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章