![]() | 第10章 细节补充 | -277- | |||||||||||||||||||
-t | |||||||||||||||||||||
AX=006E | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=0F6A | ES=0F6A | SS=0F6A | CS=0F6A | IP=010A | NV UP EI PL NZ AC PO CY | ||||||||||||||||
0F6A:010A | C3 | RET | |||||||||||||||||||
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=0000 | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=0F6A | ES=0F6A | SS=0F6A | CS=0F6A | IP=0104 | NV UP EI PL ZR AC PE CY | ||||||||||||||||
0F6A:0104 | B068 | MOV AL,68 | |||||||||||||||||||
-g=104 108[Enter] | |||||||||||||||||||||
AX=0089 | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=0F6A | ES=0F6A | SS=0F6A | CS=0F6A | IP=0108 | OV UP EI NG NZ NA PO NC | ||||||||||||||||
0F6A:0108 | 5F | POP 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 |