常用匯編指令及其影響的標誌位
加法指令 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)
指令對標誌位的影響:乘法指令只影響標誌位CF和OF,其他條件碼位無定義。
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時,移動後最高位的值發生變化。
SF、ZF、PF標誌位不受影響。
帶進位的循環右移 RCR (rotate right through carry)
指令對標誌位的影響:CF=移入的數值。
OF=1 當cnt=1時,操作數最高位的值未發生變化。
OF=0 當cnt=1時,操作數最高位的值發生變化。
SF、ZF、PF標誌位不受影響。
串傳送 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 同符號數相減時,或不同符號數相減,其結果符號與減數不同。
條件轉移指令
指令的匯編格式及功能 根據條件碼的值轉移:
49、JZ(JE) OPR ZF=1
50、JNZ(JNE) OPR ZF=0
51、JS OPR SF=1
52、JNS OPR SF=0
53、JO OPR OF=1
54、JNO OPR OF=0
55、JP OPR PF=1
56、JNP OPR PF=0
57、JC OPR CF=1
58、JNC OPR CF=0
比較兩個無符號數,根據比較的結果轉移
59、JB(JNAE,JC) OPR CF=1 被減數小於減數則轉移
60、JNB(JAE,JNC) OPR CF=0 被減數大於或等於減數則轉移
61、JBE(JNA) OPR CF或ZF=1 被減數小於或等於減數則轉移
62、JNBE(JA) OPR CF或ZF=0 被減數大於減數則轉移
比較兩個帶符號數,根據比較結果轉移
63、JL/JNGE OPR SF異或OF=1 被減數小於減數則轉移
64、JNL/JGE SF異或OF=0 被減數不小於減數則轉移
65、JLE/JNE (SF異或OF)與ZF=1 被減數不大於減數則轉移
66、JNLE/JG (SF異或OF)與ZF=0 被減數大於減數則轉移
根據CX寄存器的值轉移
67、JCXZ (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位
常用匯編指令及其影響的標誌位