目录 上一页 下一页 下一章

第10章 细节补充 -281-

都看做无符号数。这就是指令JA/JB只适用于无符号数相比较的原因。
  那么符号究竟从哪里体现呢?现在我们可以想到的只有符号标志SF位。而且有一个事实是我们每个人都知道的,就是当一个小的数减一个大的数的时候,无论这两个数是否有符号,它们相减的结果必然是负数。也就是说这样两个数相减之后,SF标志应该是1(NG)。
  从跟踪的结果来看+5与-1相比较之后SF标志位仍然是0(PL),这说明了+5并不小于-1。由此看来判断带符号数的比较结果应该通过SF标志而不是CF标志。
-p[Enter]
AX=0005BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=002ADI=0000
DS=0F6AES=0F6ASS=0F6ACS=0F6AIP=0108 OV UP EI NG NZ NA PO CY
0F6A:01085FPOP DI
  是否仅仅通过SF标志就能正确判断带符号数的大小呢?将+5与-128相比较之后我们可以看到SF标志为1(NG)。如果按刚才的推论来看+5应该小于-128,这当然不对。问题出在哪儿?
  实际上+5减-128应该得+133,但是+133是大于+127的,所以这样的一次运算其实已经导致了溢出。注意观察OF标志,它悄悄地从"NV"变成了"OV"。所以我们又可以得出一个推论:如果比较之后符号标志SF为1同时溢出标志OF也为1,则仍然说明前一个数不小于后一个数。
  综合上面的实验结果,就可以推测出相比较的两个带符号数如果是"前不小于后"的关系,那么符号标志SF与溢出标志OF必然是同为0(+5比+3、+5比-1)或同为1(+5比-128)。再进一步推断,如果这两个数是"前小于后"的关系,那么SF与OF之中必有一个是1,而另一个是0。即要么是结果为负而无溢出,要么是结果为正而有溢出。
  究竟是不是这样?多做一些实验就能知道。比如用+3减去+5就能看到结果为负而无溢出的情况。而用-40减去+100就能看到结果为正而有溢出的情况了。总之前面推出的结论是完全正确的。由此我们得出了指令"JL"所判断的条件,把这个条件写成表达式的形式就是"SF XOR OF=1"。
  同时指令JG判断的条件也就自然得出,应该是"(SF XOR OF)OR ZF=0",要注意排除两个数相等的情况(ZF=1)。如果不排除两个数相等的情况,即只考虑"SF XOR OF=0",那么相应的指令就应该是"JGE",这个指令在前面讨论画线时应用过。那么指令"JLE"判断的条件又是什么呢?没错,是"(SF XOR OF)OR ZF=1"。
  表10-2给出了所有条件转移指令的说明,其中有一些是我们前面没有讨论过的。
10.4 其它指令说明
  学了这么多的指令,想必大家对于"Z"与"NZ"已经有所认识,许多指令都与ZF标志有关,比如条件转移指令JZ/JNZ,连指令前缀REP也可以加上Z与NZ写成REPZ(ZF为1则重复)和REPNZ(ZF为0则重复)。注意在我们已经学过的指令之中还有一个指令也可以加上Z与NZ,这个指令就是循环指令LOOP:

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章