關於cmp的詳細用法

2021-09-10 16:37:38 字數 1354 閱讀 6186

一、關於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時則繼續執行

關於cmp指令

以 cmp rdi,rsi jge else 為例 1 用來設定條件位的是通過 rsi rdi,若m rsi 2,rdi 1,那麼zf 0 非零 sf 0 不為負 2 同時,jge也將基於 rsi rdi 進行跳轉。此處 rsi greater than rdi,因此將進行跳轉。3 不過需要注意的是...

關於cmp函式引數中的 符號

關於sort函式中的cmp函式有著不同的寫法,以剛剛的整形元素比較為例 還有人是這麼寫的 bool cmp const int a,const int b int a 10 sort a,a 10,cmp 思考 int 和const int 有什麼區別呢?原來 作為函式引數 int這種寫法是值傳遞,...

this的詳細用法!!

this用法如下 1.使用this來顯示地標識欄位的所有者 有點官方味道,看下例子就清楚了 class student 2.使用this來傳遞當前正在執行的物件的乙個引用 class student class help newstudent方法呼叫了help類的insert靜態方法,需要向inse...