目录 上一页 下一页 下一章

第10章 细节补充 -277-

-t
AX=006EBX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0F6AES=0F6ASS=0F6ACS=0F6AIP=010A NV UP EI PL NZ AC PO CY
0F6A:010AC3RET
  B7 SHL 1=6EH=01101110B,结果包含5个1,为奇数,所以PF=0(PO)。
  由此实验可以看出,无论是逻辑操作指令还是算术运算指令,或者是移位指令都能影响PF标志。
  (2)OF(Overflow Flag)
  这是溢出标志位,这一位表示了运算结果是否超出了计算机所能表示的数的范围。溢出的概念容易让人范迷糊,举两个例子,分别计算0FFH+1与68H+21H,哪次运算会溢出?
  初看起来计算0FFH+1将产生9位的结果,而68H+21H=89H,仍然是8位,好象计算0FFH+1应该导致溢出。结果真是这样吗?让我们向"DEBUG"请教一下:
  C:\ASM\>DEBUG[Enter]
  -a[Enter]
  0F6A:0100 mov al,ff
  0F6A:0102 add al,1
  0F6A:0104 mov al,68
  0F6A:0106 add al,21
  0F6A:0108 [Enter]
-g=100 104[Enter]
AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0F6AES=0F6ASS=0F6ACS=0F6AIP=0104 NV UP EI PL ZR AC PE CY
0F6A:0104B068MOV AL,68
-g=104 108[Enter]
AX=0089BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0F6AES=0F6ASS=0F6ACS=0F6AIP=0108 OV UP EI NG NZ NA PO NC
0F6A:01085FPOP DI
  通过这个实验可以看出,实际计算结果与我们推测的正好相反。0FFH+1没有造成溢出,而68H+21H反而溢出了。
  为什么会有这样的现象?如果我们把"溢出"的概念放到"带符号数"的条件下考虑就会明白这其中的道理了。所谓"超出数的表示范围"指得是超出"带符号数"的范围,毫无疑问68H+21H是等于89H,但是89H实际是一个负数。
  究竟什么情况下会导致溢出?数据在进行计算时各数位之间难免会有进位,以8位数据计算为例,与溢出有关的进位操作是Bit6至Bit7之间的进位与Bit7至CF之间的进位。具体来说,当Bit6至Bit7的进位与Bit7至CF的进位同时发生或同时不发生的情况下就没有产生溢出。反之,如果只发生了一次进位,那么就导致了溢出。

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章