![]() | 第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=0000 | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=0F6A | ES=0F6A | SS=0F6A | CS=0F6A | IP=0100 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
0F6A:0100 | B0FF | MOV AL,FF | |||||||||||||||||||
-t | |||||||||||||||||||||
AX=00FF | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=0F6A | ES=0F6A | SS=0F6A | CS=0F6A | IP=0102 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
0F6A:0102 | 0401 | ADD AL,01 | |||||||||||||||||||
-t | |||||||||||||||||||||
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 NZ AC PO CY | ||||||||||||||||
0F6A:0104 | 56 | PUSH 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 |