(譯)win32asm教程-6 (轉)

gugu99發表於2008-01-12
(譯)win32asm教程-6 (轉)[@more@] 

7.0條件跳轉:namespace prefix = o ns = "urn:schemas--com::office" />

在Code部分,你可以看到像這樣的標籤:

.code

mov eax, edx
sub eax, ecx
cmp eax, 2
jz loc1
xor eax, eax
jmp loc2
loc1:
xor eax, eax
inc eax
loc2:

(xor eax, eax意為:eax=0)

讓我們來看看這些程式碼:

mov eax, edx;把edx放入eax中

sub eax, ecx;eax-ecx

cmp eax, 2

這有一條新指令:cmp。Cmp意為compare(比較)。它能比較兩個值(暫存器,,直接數值)並設定Z-flag(零標誌)。零標誌很像carry,也是內部標誌暫存器的一位。

Jz loc1

這也是條新的。它是條件跳轉指令。Jz=jump if zero(如果設定了零標誌就跳轉)。Loc1是一個標記指令“xor eax,eax|inc eax”記憶體開始處offset的標籤。因而jz loc1=如果設定了零標誌,跳往位於loc1的指令。

Cmp eax, 2;如果eax=2設定零標誌

Jz loc1;如果設定了零標誌就跳轉

=如果eax等於2,跳往位於loc1的指令

然後有jmp loc2.這也好似一個跳轉,但是是一個無條件跳轉:它總是。上面的程式碼就是:

if ((edx-ecx)==2)
{
eax = 1;
}
else
{
eax = 0;
}

或者Basic版:

IF (edx-ecx)=2 THEN
EAX = 1
ELSE
EAX = 0
END IF

3.  1標誌暫存器

標誌暫存器有一套標誌。它們設不設定取決於計算或其他時間。我不會討論它們的全部。只揀幾個重要的說:

ZF(零標誌)

當計算結構是零時該標誌被設定(compare實際上是隻設定標誌不儲存結構的減法)

(符號標誌)

結構為負就設定

CF(carry標誌)

Carry標誌中有計算後最右的位。

OF(標誌)

標明一個溢位了的計算。如,結構和目標不匹配。

還有更多的標誌(Parity, Auxiliary, Trap, Interrupt, Direction, IOPL, Nested Task, Resume, & Virtual Mode)但因為我們不用它們,所以我不解釋。

7.2跳轉系列

有一整套的條件跳轉,而且它們跳轉與否均取決於標誌的狀態。但由於大部分跳轉指令有明白的名字,你甚至無需知道哪個標誌要設定,例如:“如果大於等於就跳轉”(jge)和“符號標誌=溢位標誌”一樣,而“如果零就跳轉”和“如果零標誌=1就跳轉”一樣。

在下表中,“意思”指的是什麼樣的計算結果該跳轉。“如果大於就跳轉”意為:

cmp x, y

jmp 如果 x 比 y大

虛擬碼

意思

條件

JA

Jump if above

CF=0 & ZF=0

JAE

Jump if above or equal

CF=0

JB

Jump if below

CF=1

JBE

Jump if below or equal

CF=1 or ZF=1

JC

Jump if carry

CF=1

JCXZ

Jump if CX=0

register CX=0

JE (is the same as JZ)

Jump if equal

ZF=1

JG

Jump if greater (signed)

ZF=0 & SF=OF

JGE

Jump if greater or equal (signed)

SF=OF

JL

Jump if less (signed)

SF != OF

JLE

Jump if less or equal (signed)

ZF=1 or SF!=OF

JMP

Unconditional Jump

-

JNA

Jump if not above

CF=1 or ZF=1

JNAE

Jump if not above or equal

CF=1

JNB

Jump if not below

CF=0

JNBE

Jump if not below or equal

CF=1 & ZF=0

JNC

Jump if not carry

CF=0

JNE

Jump if not equal

ZF=0

JNG

Jump if not greater (signed)

ZF=1 or SF!=OF

JNGE

Jump if not greater or equal (signed)

SF!=OF

JNL

Jump if not less (signed)

SF=OF

JNLE

Jump if not less or equal (signed)

ZF=0 & SF=OF

JNO

Jump if not overflow (signed)

OF=0

JNP

Jump if no parity

PF=0

JNS

Jump if not signed (signed)

SF=0

JNZ

Jump if not zero

ZF=0

JO

Jump if overflow (signed)

OF=1

JP

Jump if parity

PF=1

JPE

Jump if parity even

PF=1

JPO

Jump if paity odd

PF=0

JS

Jump if signed (signed)

SF=1

JZ

Jump if zero

ZF=1

所有的跳轉指令需要一個引數:要跳往的offset。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-997153/,如需轉載,請註明出處,否則將追究法律責任。

相關文章