常用匯編指令及其影響的標志位


 

加法指令 ADD (addition)

指令對標志位的影響:

                     CF=1   最高有效位向高位有進位

                     CF=0   最高有效位向高位無進位

                     OF=1   兩個同符號數相加(正數+正數  負數+負數),結果符號與其相反。

                     OF=0   兩個不同符號數相加,或同符號數相加,結果符號與其相同。

 

帶進位加法指令 ADC (add with carry)

指令對標志位的影響:

                     CF=1   最高有效位向高位有進位

                     CF=0   最低有效位相高位無進位

                     OF=1   兩個同符號數相加,結果符號與其相反,

                     OF=0   兩個同符號數相加,或同符號相加,結果符號與其相同

 

1指令 INC (increament)

指令對標志位的影響:

                     CF無影響

                     OF=1   兩個同符號數相加,結果符號與其相反,

                     OF=0   兩個同符號數相加,或同符號相加,結果符號與其相同。

 

減法指令 SUB (subtract)

指令對標志位的影響:

                     CF=1 二進制減法運算中最高有效位向高位有借位(被減數小於減數,不夠減的情況)

                     CF=0 二進制減法運算中最高有效為向高位無借位(被減數〉=減數,夠減的情況)

                     OF=1 兩數符號相反(正數-負數,或負數-正數),而結果符號與減數相同。

                     OF=0 同符號數相減時,或不同符號數相減,其結果符號與減數不同。

 

帶借位減法指令 SBB (subtract with borrow)

指令對標志位的影響:

                     CF=1 二進制減法運算中最高有效位向高位有借位(被減數小於減數,不夠減的情況)

                     CF=0 二進制減法運算中最高有效為向高位無借位(被減數〉=減數,夠減的情況)

                     OF=1 兩數符號相反(正數-負數,或負數-正數),而結果符號與減數相同。

                     OF=0 同符號數相減時,或不同符號數相減,其結果符號與減數不同。

 

1指令 DEC (decrement)

指令對標志位的影響:

 

                     CF無影響

                     OF=1 兩數符號相反(正數-負數,或負數-正數),而結果符號與減數相同。

                     OF=0 同符號數相減時,或不同符號數相減,其結果符號與減數不同。

                   

比較指令 CMP (compare)

指令對標志位的影響:

                     CF=1 二進制減法運算中最高有效位向高位有借位(被減數小於減數,不夠減的情況)

                     CF=0 二進制減法運算中最高有效為向高位無借位(被減數〉=減數,夠減的情況)

                     OF=1 兩數符號相反(正數-負數,或負數-正數),而結果符號與減數相同。

                     OF=0 同符號數相減時,或不同符號數相減,其結果符號與減數不同。

 

求補指令 NEG (negate)

指令對標志位的影響:

 

                     CF=1  不為0的操作數求補時

                     CF=0  為0的操作數求補時

                     OF=1    操作數為-128(字節運算)或操作數為-32768(字運算)

                     OF=0    當求補運算的操作數不為-128(字節)或-32768(字)時

 

 

無符號乘法指令 MUL (unsigned multiple)    有符號乘法指令 IMUL(signed muliple)

指令對標志位的影響:乘法指令只影響標志位CFOF,其他條件碼位無定義

                     MUL指令的條件碼設置為:

                     CF OF=0 0 乘積的高一半為0(字節操作的(AH)或字操作的(DX))

                     CF OF=1 1 乘積的高一半不為0

                     IMUL指令的條件碼設置為:

                     CF OF=0 0 乘積的高一半為低一半的符號擴展.

                     CF OF=1 1 其他情況

 

無符號數除法 DIV (unsigned divide)     帶符號數除法 IDIV (singed divide)

指令對標志位的影響:不影響條件碼。   

 

邏輯與 AND (logic and)

指令對標志位的影響:

 

                     指令執行后 CF  OF 置零,AF無定義。

                     PF=1 結果操作數中1的個數為偶數時置1

                     PF=0 結果操作數中1的個數為奇數時置0

 

邏輯或 or (logic or)

指令對標志位的影響:

 

                     令執行后 CF  OF 置零,AF無定義。

                     PF=1 結果操作數中1的個數為偶數時置1

                     PF=0 結果操作數中1的個數為奇數時置0

 

邏輯非 NOT (logic not)

指令對標志位的影響:對標志位無影響

 

異或 XOR (exclusice or)

指令對標志位的影響:

 

                     令執行后 CF  OF 置零AF無定義。

                     PF=1 結果操作數中1的個數為偶數時置1

                     PF=0 結果操作數中1的個數為奇數時置0

 

測試指令 TEST

指令對標志位的影響:

 

                     令執行后 CF  OF 置零AF無定義。

                     PF=1 結果操作數中1的個數為偶數時置1

                     PF=0 結果操作數中1的個數為奇數時置0

 

邏輯左移 SHL (shift logical left)

指令對標志位的影響: CF=移入的數值

                     OF=1 cnt=1時,移動后最高位的值發生變化。

                     OF=0 cnt=1時,移動時最高位的值未發生變化。

 

邏輯右移 SHR (shift logical right)

指令對標志位的影響:CF=移入的數值

                     OF=1 cnt=1時,移動后最高位的值發生變化。

                     OF=0 cnt=1時,移動時最高位的值未發生變化。

 

算術左移 SAL (shift arithmetic left)

指令對標志位的影響:CF=移入的數值

                     OF=1 cnt=1時,移動后最高位的值發生變化。

                     OF=0 cnt=1時,移動時最高位的值未發生變化。

 

算術右移SAR (shift arithmetic right)

指令對標志位的影響:CF=移入的數值

                     OF=1 cnt=1時,移動后最高位的值發生變化。

                     OF=0 cnt=1時,移動時最高位的值未發生變化。

 

循環左移 ROL (rotate left)

指令對標志位的影響:CF=移入的數值

                     OF=1 cnt=1時,移動后最高位的值發生變化。

                     OF=0 cnt=1時,移動時最高位的值未發生變化。

 

循環右移 ROR (rotate right)

指令對標志位的影響:CF=移入的數值

                     OF=1 cnt=1時,移動后最高位的值發生變化。

                     OF=0 cnt=1時,移動時最高位的值未發生變化。

 

帶進位的循環左移 RCL (rotate left through carry)

指令對標志位的影響:CF=移入的數值。

                     OF=1 cnt=1時,移動后最高位的值未發生變化。

                     OF=0 cnt=1時,移動后最高位的值發生變化。

                     SFZFPF標志位不受影響。

 

帶進位的循環右移 RCR (rotate right through carry)

指令對標志位的影響:CF=移入的數值。

                     OF=1 cnt=1時,操作數最高位的值未發生變化。

                     OF=0 cnt=1時,操作數最高位的值發生變化。

                     SFZFPF標志位不受影響。

 

串傳送 MOVSB / MOVSW (move string byte/word)

指令對條件碼的影響:不影響條件碼。

 

存串 STOSB / STOSW (stroe from string byte/word)

指令對條件碼的影響:不影響條件碼。

 

取串LODSB / LODSW (load from string byte/word)

指令對條件碼的影響:不影響條件碼。

 

串比較 CMPSB / CMPSW (compare string byte/word)

指令對條件碼的影響:

                     CF=1 二進制減法運算中最高有效位向高位有借位(被減數小於減數,不夠減的情況)

                     CF=0 二進制減法運算中最高有效為向高位無借位(被減數〉=減數,夠減的情況)

                     OF=1 兩數符號相反(正數-負數,或負數-正數),而結果符號與減數相同。

                     OF=0 同符號數相減時,或不同符號數相減,其結果符號與減數不同。

 

串掃描 SCASB / SCASW (scan string byte / word)

指令對條件碼的影響:

                     CF=1 二進制減法運算中最高有效位向高位有借位(被減數小於減數,不夠減的情況)

                     CF=0 二進制減法運算中最高有效為向高位無借位(被減數〉=減數,夠減的情況)

                     OF=1 兩數符號相反(正數-負數,或負數-正數),而結果符號與減數相同。

                     OF=0 同符號數相減時,或不同符號數相減,其結果符號與減數不同。

 

條件轉移指令

 

指令的匯編格式及功能    根據條件碼的值轉移:

49JZ(JE) OPR         ZF=1

50JNZ(JNE) OPR      ZF=0

51JS OPR             SF=1

52JNS OPR           SF=0

53JO OPR             OF=1

54JNO OPR          OF=0

55JP OPR             PF=1

56JNP OPR           PF=0

57JC OPR             CF=1

58JNC OPR           CF=0

 

比較兩個無符號數,根據比較的結果轉移

59JB(JNAE,JC)   OPR   CF=1            被減數小於減數則轉移

60JNB(JAE,JNC) OPR    CF=0            被減數大於或等於減數則轉移

61JBE(JNA) OPR        CFZF=1       被減數小於或等於減數則轉移

62JNBE(JA) OPR        CFZF=0       被減數大於減數則轉移

 

比較兩個帶符號數,根據比較結果轉移

63JL/JNGE OPR       SF異或OF=1           被減數小於減數則轉移   

64JNL/JGE           SF異或OF=0               被減數不小於減數則轉移

65JLE/JNE           (SF異或OF)ZF=1     被減數不大於減數則轉移

66JNLE/JG           (SF異或OF)ZF=0     被減數大於減數則轉移

 

根據CX寄存器的值轉移

67JCXZ              (CX)=0               CX內容為零 則轉移

最后,說一下關於一個指令對於兩個相同操作數的情況(PS:之前一直感到困惑,為啥test經常操作兩個相同的操作數,結合指令的對於標志位的影響就能明白這樣做的意圖,下面我來舉例說明)

 

例子:

:00401098 50 push eax 
:00401099 8BCF mov ecx, edi 
:00401056 52  push edx 
:00401057 8BC8 mov ecx, eax 
:00401059 E8021D0100 call 00412D60 
:0040105E 85C0 test eax, eax 
:00401060 7421 je 00401083

標紅的這句test比較了eax的值,將會影響標志位SF、ZF、和PF標志位,並將CF和OF如果eax為0則標志位SF=0,ZF=1,PF=0,CF,0F=0.

 

由於ZF=0,所以下一句將會執行跳轉。說白了,這里test指令就是用來檢測eax是否為零的!

附上各個標志位含義

 

CF:    進位標志符號比         排在第0位
PF:    奇偶標志            排在第2位
AF:    輔助進位標志          排在第4位
ZF:    零標志             排在第6位
SF:    符號標志            排在第7位
TF:    追蹤標志             排在第8位
IF:    中斷允許標志            排在第9位
DF:    方向標志             排在第10位
OF:    溢出標志             排在第11位

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM