📄 page281.html
字号:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第10章 细节补充</title>
</head>
<body>
<style type="text/css">
body {
background-color: #c0c0c0;
}
table {
background-color: #c0c0c0;
line-height: 24px;
}
</style>
<!导航条>
<p><a href="content1.html">目录</a> <a href="page280.html">上一页</a> <a href="page282.html">下一页</a> <a href="page291.html">下一章</a></p>
<table border=0 align="center" width=800 frame="box" rules="none">
<!标尺行>
<tr>
<td width=3%></td><td width=6%></td><td width=1%></td> <!左侧空白>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=1%></td><td width=6%></td><td width=3%></td> <!右侧空白>
</tr>
<!页眉行>
<tr height=60 valign="bottom">
<td></td><td></td><td></td>
<td colspan=6><img src="icons/flag.gif"></td><td colspan=4></td><td colspan=6 align="right">第10章 细节补充</td> <!章节名>
<td></td><td>-281-</td><td></td> <!页码>
</tr>
<!页眉线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!正文>
<font face="宋体" lang="ZH-CN" size=3>
<tr height=20><td colspan=22></td></tr> <!顶部空白>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
都看做无符号数。这就是指令JA/JB只适用于无符号数相比较的原因。<br>
那么符号究竟从哪里体现呢?现在我们可以想到的只有符号标志SF位。而且有一个事实是我们每个人都知道的,就是当一个小的数减一个大的数的时候,无论这两个数是否有符号,它们相减的结果必然是负数。也就是说这样两个数相减之后,SF标志应该是1(NG)。<br>
从跟踪的结果来看+5与-1相比较之后SF标志位仍然是0(PL),这说明了+5并不小于-1。由此看来判断带符号数的比较结果应该通过SF标志而不是CF标志。
</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=4>-p[Enter]</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>AX=0005</td><td colspan=2>BX=0000</td><td colspan=2>CX=0000</td><td colspan=2>DX=0000</td><td colspan=2>SP=FFEE</td><td colspan=2>BP=0000</td><td colspan=2>SI=002A</td><td colspan=2>DI=0000</td><td colspan=2></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>DS=0F6A</td><td colspan=2>ES=0F6A</td><td colspan=2>SS=0F6A</td><td colspan=2>CS=0F6A</td><td colspan=2>IP=0108</td>
<td colspan=5>OV UP EI NG NZ NA PO CY</td><td colspan=3></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=2>0F6A:0108</td><td colspan=2>5F</td><td colspan=6>POP DI</td><td colspan=4></td><td colspan=4></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
是否仅仅通过SF标志就能正确判断带符号数的大小呢?将+5与-128相比较之后我们可以看到SF标志为1(NG)。如果按刚才的推论来看+5应该小于-128,这当然不对。问题出在哪儿?<br>
实际上+5减-128应该得+133,但是+133是大于+127的,所以这样的一次运算其实已经导致了溢出。注意观察OF标志,它悄悄地从"NV"变成了"OV"。所以我们又可以得出一个推论:如果比较之后符号标志SF为1同时溢出标志OF也为1,则仍然说明前一个数不小于后一个数。<br>
综合上面的实验结果,就可以推测出相比较的两个带符号数如果是"前不小于后"的关系,那么符号标志SF与溢出标志OF必然是同为0(+5比+3、+5比-1)或同为1(+5比-128)。再进一步推断,如果这两个数是"前小于后"的关系,那么SF与OF之中必有一个是1,而另一个是0。即要么是结果为负而无溢出,要么是结果为正而有溢出。<br>
究竟是不是这样?多做一些实验就能知道。比如用+3减去+5就能看到结果为负而无溢出的情况。而用-40减去+100就能看到结果为正而有溢出的情况了。总之前面推出的结论是完全正确的。由此我们得出了指令"JL"所判断的条件,把这个条件写成表达式的形式就是"SF XOR OF=1"。<br>
同时指令JG判断的条件也就自然得出,应该是"(SF XOR OF)OR ZF=0",要注意排除两个数相等的情况(ZF=1)。如果不排除两个数相等的情况,即只考虑"SF XOR OF=0",那么相应的指令就应该是"JGE",这个指令在前面讨论画线时应用过。那么指令"JLE"判断的条件又是什么呢?没错,是"(SF XOR OF)OR ZF=1"。<br>
表10-2给出了所有条件转移指令的说明,其中有一些是我们前面没有讨论过的。
</td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18><font face="黑体"><a name="104">10.4 其它指令说明</a></font></td>
<td></td><td></td> <!右边距>
</tr>
<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
学了这么多的指令,想必大家对于"Z"与"NZ"已经有所认识,许多指令都与ZF标志有关,比如条件转移指令JZ/JNZ,连指令前缀REP也可以加上Z与NZ写成REPZ(ZF为1则重复)和REPNZ(ZF为0则重复)。注意在我们已经学过的指令之中还有一个指令也可以加上Z与NZ,这个指令就是循环指令LOOP:
</td>
<td></td><td></td> <!右边距>
</tr>
</font>
<!页脚线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!页脚>
<tr height=60 valign="top">
<td></td><td></td>
<td colspan=9><i>Copyright © 2004-2005 <a href="mailto:webmaster@nucstorm.com">Chunk Lee</a></i></td>
<td colspan=9 align="right"><i><a href="http://www.nucstorm.com" target="_top">www.nucstorm.com</a></i></td>
<td></td><td></td>
</tr>
</table>
<!导航条>
<p align="right"><a href="content1.html">目录</a> <a href="page280.html">上一页</a> <a href="page282.html">下一页</a> <a href="page291.html">下一章</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -