1. 程式人生 > >常用匯編指令及其影響的標誌位

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

說明 比較 cxz 個數 test car size through with

加法指令 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位

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