(譯)win32asm教程-6 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (譯)win32asm教程-7 (轉)Win32ASM
- (譯)win32asm教程-9 (轉)Win32ASM
- (譯)win32asm教程-8 (轉)Win32ASM
- (譯)win32asm教程-10 (轉)Win32ASM
- (譯)win32asm教程-11 (轉)Win32ASM
- (譯)win32asm教程-5 (轉)Win32ASM
- (譯)win32asm教程-12-完結 (轉)Win32ASM
- (譯)win32asm例項-1 (轉)Win32ASM
- (譯)win32asm例項-3 (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (二) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (四) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (三) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (七) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (六) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (八) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (一) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (五) (轉)Win32ASM
- win32asm原理 (轉)Win32ASM
- Win32Asm 教程,來自易語言俱樂部論壇,譯者taowen。 (5千字)Win32ASM
- Win32ASM經驗點滴 (轉)Win32ASM
- Java Servlet和JSP教程(6)(轉)JavaServletJS
- webpack4 系列教程(二): 編譯 ES6Web編譯
- Delphi6的新特性[翻譯] (轉)
- VC++/MFC 教程6&7(英文) (轉)C++
- rfc1945-http1.0自譯本-(6) (轉)HTTP
- XML簡明教程(6)什麼是XML Schema(轉)XML
- [譯][Perl 6] 5to6-perlfunc
- [譯][Perl 6] 5to6-nutshell
- VB.Net中文教程(6) 母子物件關係 (轉)物件
- 遊戲製作相關---HAM教程翻譯本(五)(轉)遊戲
- 遊戲製作相關---HAM教程翻譯本(四)(轉)遊戲
- ECMAScript 6教程 (三)
- 【譯】UIVisualEffectView教程UIView
- Openwrt編譯教程編譯
- leapftp教程,掌握leapftp教程只需6步FTP
- Python教程-6模組Python
- Python系列教程6Python
- ECMAScript6 教程(一)