⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chapter7.htm

📁 win32汇编资料 教程!
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
<Title>7.0-条件跳转</Title>
<LINK REL="stylesheet" HREF="css/basestyles.css" TYPE="text/css">
<LINK REL="stylesheet" HREF="css/tutorials.css" TYPE="text/css">
</HEAD>
<BODY>
<h1 align="center">Win32Asm 教程 </h1>
<TABLE ALIGN="CENTER">
			<TR>
			<TD CLASS="tutnav" VALIGN="MIDDLE" WIDTH="60" HEIGHT="20"><A HREF="chapter6.htm">前一章</A></TD>
			<TD CLASS="tutnav" VALIGN="MIDDLE" WIDTH="60" HEIGHT="20">
				<A HREF="contents.htm">目录</A></TD>
			<TD CLASS="tutnav" VALIGN="MIDDLE" WIDTH="60" HEIGHT="20"><A HREF="chapter8.htm">下一章</A></TD>
			</TR>
</TABLE>
<h2>7.0-条件跳转</h2>
<p>
在Code部分,你可以看到像这样的标签:
</p><p class="def2">
.code
</p><p class="def2">
mov eax, edx<br/>
sub eax, ecx<br/>
cmp eax, 2<br/>
jz loc1<br/>
xor eax, eax<br/>
jmp loc2<br/>
loc1:<br/>
xor eax, eax<br/>
inc eax<br/>
loc2:
</p><p class="def1">
(xor eax, eax意为:eax=0)
</p><p>
让我们来看看这些代码:
</p>
<p class="def2">mov eax, edx;把edx放入eax中<br/>

sub eax, ecx;eax-ecx<br/>

cmp eax, 2
</p><p>
这有一条新指令:cmp。Cmp意为compare(比较)。它能比较两个值(寄存器,内存,直接数值)并设置Z-flag(零标志)。零标志很像carry,也是内部标志寄存器的一位。
</p><p class="def2">
Jz loc1
</p><p>
这也是条新的。它是条件跳转指令。Jz=jump if zero(如果设置了零标志就跳转)。Loc1是一个标记指令“xor eax,eax|inc eax”内存开始处offset的标签。因而jz loc1=如果设置了零标志,跳往位于loc1的指令。
</p><p><span class="def2">
Cmp eax, 2;如果eax=2设置零标志<br/>

Jz loc1;如果设置了零标志就跳转</span>
<br/>
=
<br/><span class="def1">如果eax等于2,跳往位于loc1的指令</span>
</p><p>
然后有jmp loc2.这也好似一个跳转,但是是一个无条件跳转:它总是执行。上面的代码就是:
</p>
<p class="def2">
if ((edx-ecx)==2)<br/>
{<br/>
eax = 1;<br/>
}<br/>
else<br/>
{<br/>
eax = 0;<br/>
}
</p><p>
或者Basic版:
</p><p>
IF (edx-ecx)=2 THEN<br/>
EAX = 1<br/>
ELSE<br/>
EAX = 0<br/>
END IF
</p>
<h2>7.1-标志寄存器</h2>
<p>
标志寄存器有一套标志。它们设不设置取决于计算或其他时间。我不会讨论它们的全部。只拣几个重要的说:
</p>
<table>
<tr>
<td class="general2">ZF(零标志)</td>
<td class="general3">当计算结果是零时该标志被设置(compare实际上是只设置标志不保存结构的减法)</td>
</tr>
<tr>
<td class="general2">SF(符号标志)</td>
<td class="general3">结果为负就设置</td>
</tr>
<tr>
<td class="general2">CF(carry标志)</td>
<td class="general3">Carry标志中存放计算后最右的位。</td>
</tr>
<tr>
<td class="general2">OF(溢出标志)</td>
<td class="general3">标明一个溢出了的计算。如,结构和目标不匹配。</td>
</tr>
</table>
<p>
还有更多的标志(<span class="def1">Parity, Auxiliary, Trap, Interrupt, Direction, IOPL, Nested Task, Resume, & Virtual Mode</span>)但因为我们不用它们,所以我不解释。
</p>
<h2>7.2-跳转系列</h2>
<p>
有一整套的条件跳转,而且它们跳转与否均取决于标志的状态。但由于大部分跳转指令有明白的名字,你甚至无需知道哪个标志要设置,例如:“如果大于等于就跳转”(jge)和“符号标志=溢出标志”一样,而“如果零就跳转”和“如果零标志=1就跳转”一样。
</p><p>
在下表中,“意思”指的是什么样的计算结果该跳转。“如果大于就跳转”意为:
</p>
<p class="def2">
cmp x, y<br/>

jmp 如果 x 比 y大
</p>
<table>
<tr>
<td class="general2">伪代码</td>
<td class="general2">意思</td>
<td class="general2">条件</td>
</tr>
 <tr>
<td class="general2">JA</td>
<td class="general3">Jump if above</td>
<td class="general3">CF=0 & ZF=0</td>
</tr>
 <tr>
<td class="general2">JAE</td>
<td class="general3">Jump if above or equal</td>
<td class="general3">CF=0</td>
</tr>
 <tr>
<td class="general2">JB</td>
<td class="general3">Jump if below</td>
<td class="general3">CF=1</td>
</tr>
 <tr>
<td class="general2">JBE</td>
<td class="general3">Jump if below or equal</td>
<td class="general3">CF=1 or ZF=1</td>
</tr>
 <tr>
<td class="general2">JC</td>
<td class="general3">Jump if carry</td>
<td class="general3">CF=1</td>
</tr>
 <tr>
<td class="general2">JCXZ</td>
<td class="general3">Jump if CX=0</td>
<td class="general3">register CX=0</td>
</tr>
 <tr>
<td class="general2">JE (is the same as JZ)</td>
<td class="general3">Jump if equal</td>
<td class="general3">ZF=1</td>
</tr>
 <tr>
<td class="general2">JG</td>
<td class="general3">Jump if greater (signed)</td>
<td class="general3">ZF=0 & SF=OF</td>
</tr>
 <tr>
<td class="general2">JGE</td>
<td class="general3">Jump if greater or equal (signed)</td>
<td class="general3">SF=OF</td>
</tr>
 <tr>
<td class="general2">JL</td>
<td class="general3">Jump if less (signed)</td>
<td class="general3">SF != OF</td>
</tr>
 <tr>
<td class="general2">JLE</td>
<td class="general3">Jump if less or equal (signed)</td>
<td class="general3">ZF=1 or SF!=OF</td>
</tr>
 <tr>
<td class="general2">JMP</td>
<td class="general3">Unconditional Jump</td>
<td class="general3">-</td>
</tr>
 <tr>
<td class="general2">JNA</td>
<td class="general3">Jump if not above</td>
<td class="general3">CF=1 or ZF=1</td>
</tr>
 <tr>
<td class="general2">JNAE</td>
<td class="general3">Jump if not above or equal</td>
<td class="general3">CF=1</td>
</tr>
 <tr>
<td class="general2">JNB</td>
<td class="general3">Jump if not below</td>
<td class="general3">CF=0</td>
</tr>
 <tr>
<td class="general2">JNBE</td>
<td class="general3">Jump if not below or equal</td>
<td class="general3">CF=1 & ZF=0</td>
</tr>
 <tr>
<td class="general2">JNC</td>
<td class="general3">Jump if not carry</td>
<td class="general3">CF=0</td>
</tr>
 <tr>
<td class="general2">JNE</td>
<td class="general3">Jump if not equal</td>
<td class="general3">ZF=0</td>
</tr>
 <tr>
<td class="general2">JNG</td>
<td class="general3">Jump if not greater (signed)</td>
<td class="general3">ZF=1 or SF!=OF</td>
</tr>
 <tr>
<td class="general2">JNGE</td>
<td class="general3">Jump if not greater or equal (signed)</td>
<td class="general3">SF!=OF</td>
</tr>
 <tr>
<td class="general2">JNL</td>
<td class="general3">Jump if not less (signed)</td>
<td class="general3">SF=OF</td>
</tr>
 <tr>
<td class="general2">JNLE</td>
<td class="general3">Jump if not less or equal (signed)</td>
<td class="general3">ZF=0 & SF=OF</td>
</tr>
 <tr>
<td class="general2">JNO</td>
<td class="general3">Jump if not overflow (signed)</td>
<td class="general3">OF=0</td>
</tr>
 <tr>
<td class="general2">JNP</td>
<td class="general3">Jump if no parity</td>
<td class="general3">PF=0</td>
</tr>
 <tr>
<td class="general2">JNS</td>
<td class="general3">Jump if not signed (signed)</td>
<td class="general3">SF=0</td>
</tr>
 <tr>
<td class="general2">JNZ</td>
<td class="general3">Jump if not zero</td>
<td class="general3">ZF=0</td>
</tr>
 <tr>
<td class="general2">JO</td>
<td class="general3">Jump if overflow (signed)</td>
<td class="general3">OF=1</td>
</tr>
 <tr>
<td class="general2">JP</td>
<td class="general3">Jump if parity</td>
<td class="general3">PF=1</td>
</tr>
 <tr>
<td class="general2">JPE</td>
<td class="general3">Jump if parity even</td>
<td class="general3">PF=1</td>
</tr>
 <tr>
<td class="general2">JPO</td>
<td class="general3">Jump if paity odd</td>
<td class="general3">PF=0</td>
</tr>
 <tr>
<td class="general2">JS</td>
<td class="general3">Jump if signed (signed)</td>
<td class="general3">SF=1</td>
</tr>
 <tr>
<td class="general2">JZ</td>
<td class="general3">Jump if zero</td>
<td class="general3">ZF=1</td>
</tr>
</table>
 <p>
所有的跳转指令需要一个参数:要跳往的offset。
</p>

</BODY>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -