關於ARM中的tst、cmp、bne、beq指令
阿新 • • 發佈:2017-05-21
and 等於 與運算 bsp 進制 實例 運算 進行 cmp
一、關於cmp的詳細用法
假設現在AX寄存器中的數是0002H,BX寄存器中的數是0003H。
執行的指令是:CMP AX, BX
執行這條指令時,先做用AX中的數減去BX中的數的減法運算。
列出二進制運算式子:
0000 0000 0000 0010
- 0000 0000 0000 0011
_________________________________
(借位1) 1111 1111 1111 1111
所以,運算結果是 0FFFFH
根據這個結果,各標誌位將會被分別設置成以下值:
CF=1,因為有借位
OF=0,未溢出
SF=1,結果是負數
ZF=0,結果不全是零
還有AF, PF等也會相應地被設置。
CMP 比較指令做了減法運算以後,根據運算結果設置了各個標誌位。
標誌位設置過以後,0FFFFH這個減法運算的結果就沒用了,它被丟棄,不保存。
執行過了CMP指令以後,除了CF,ZF,OF, SF,等各個標誌位變化外,其它的數據不變。
對照普通的減法指令 SUB AX, BX,它們的區別就在於:
SUB指令執行過以後,原來AX中的被減數丟了,被換成了減法的結果。
CMP指令執行過以後,被減數、減數都保持原樣不變。
二、tst、cmp、bne、beq指令
1、tst:邏輯處理指令,用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,並根據運算結果更新CPSR中條件標誌位的值。當前運算結果為1,則Z=0;當前運算結果為0,則Z=1
cmp:算數處理指令,用於把一個寄存器的內容和另一個寄存器的內容或立即數進行減法比較,不存儲結果,都會更改標誌位
bne: 數據跳轉指令,標誌寄存器中Z標誌位不等於零時, 跳轉到BNE後標簽處
beq: 數據跳轉指令,標誌寄存器中Z標誌位等於零時, 跳轉到BEQ後標簽處
2、實例
tst r0 , #0x2 //進行and運算,如果bit_2為1,zero==0,如果bit_2為0,則zero==1,即該指令測試bit_2是否為0 bne led_blink //非零則跳轉,若zero==1,跳轉到led_blink處執行;若zero==0,則繼續執行下一步指令
3、實例
sub r1 , r1 , #1 //r1=r1-1 cmp r1 , #0 //r1是否等於0,並更改標誌位 bne led_blink //zero==1時跳轉至led_blink處,zero==0時則繼續執行
關於ARM中的tst、cmp、bne、beq指令