目录 上一页 下一页 下一章

第4章 奇妙的声音 -67-

  由此我们可以发现正负数之间具有这样一种转换关系:将+1的所有位取反得到"11111110",再在最低位上加1就得到"11111111",也就是-1。同时我们也能看出补码表示法中关于符号位的规定和原码是一样的。
  那么"10000001"在补码表示法中是哪个数呢?按照刚才发现的规律,将它的各个位取反,得"01111110",再加上1,得"01111111",即十进制的+127,也就是说"10000001"表示-127。
  为什么要用这样的表示法,这主要是因为补码便于计算。我们可以用补码重新计算-1+1=?
  由于-1的补码是"11111111",将其加1,会得到"100000000",这是一个九位二进制数,如果舍掉最高位,就得到正确的结果--00000000。
  这似乎有点不讲理,凭什么舍去最高位呢?道理其实很简单,我们先来看看是否真有这样的现象,启动DEBUG输入下面两条指令:
C:\ASM\>DEBUG[Enter]
-a100[Enter]
0F6A:0100 mov al,ff
0F6A:0102 add al,1
0F6A:0104 [Enter]
-r
AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0F6AES=0F6ASS=0F6ACS=0F6AIP=0100 NV UP EI PL NZ NA PO NC
0F6A:0100B0FFMOV AL,FF
-t
AX=00FFBX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0F6AES=0F6ASS=0F6ACS=0F6AIP=0102 NV UP EI PL NZ NA PO NC
0F6A:01020401ADD AL,01
-t
AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0F6AES=0F6ASS=0F6ACS=0F6AIP=0104 NV UP EI PL NZ AC PO CY
0F6A:010456PUSH SI
  可以看到将FF(-1)加1之后AL确实成了0。AL是八位寄存器,它不可以记录第九位,因而在AL寄存器中只保留了低八位。
  那么是不是多出的一位就无影无踪了呢?并非如此,如果仔细观察DEBUG显示出的内容,就会发现标志寄存器中有一些位发生了变化:AF(辅助进位标志)和CF(借位/进位标志)被置成1了。
  由于我们采用了八位寄存器,运算结果产生了第九位,这一位作为进位送入了CF标志位。至于AF,它记录了AL寄存器低"四"位的进位情况。请看下面的实例:
C:\ASM\>DEBUG[Enter]
-a100[Enter]
0B0B:0100 mov al,f
0B0B:0102 inc al

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章