目录 上一页 下一页 下一章

-150- PC机汇编语言实战精解

-tAH寄存器的原值被乘积覆盖
AX=000CBX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=13C6ES=13C6SS=13C6CS=13C6IP=0106 NV UP EI PL NZ NA PE NC
13C6:0106BBFFFFMOV BX,FFFF
  接下来的程序反映了"MUL"指令对有符号数的处理,我们利用"G"命令一次将其执行完,看看程序执行的结果如何:
-g=106 10b[Enter]
积的低16位乘数积的高16位
AX=000CBX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=13C6ES=13C6SS=13C6CS=13C6IP=010B NV UP EI PL NZ AC PE CY
13C6:010B90NOP
  以上三行指令跟踪的结果反映了两个16位数据相乘的结果,可以看到MUL指令的确不能处理负数。它把-1(0FFFFH)当作了65535,所以得出的结果是000BFFF4H,其高位000BH出现在DX寄存器中。
  为什么不能将16位数据与8位数据相乘?这是因为被乘数究竟是8位还是16位完全取决于"MUL"指令后面的操作数。如果这个操作数是一个8位的寄存器或者是内存中的一个字节,那么CPU就会认为被乘数是AL寄存器中的一个8位数据;反之,如果这个操作数是一个16位的寄存器或者内存中的一个字,那么CPU就会认为被乘数是AX寄存器中的一个16位数据。
  试验<2>
  C:\ASM\>DEBUG[Enter]
  -a100[Enter]
  13C6:0100 mov ax,fff6
  13C6:0103 mov dx,b
  13C6:0106 mov bx,c
  13C6:0109 div bx
  13C6:010B mov ax,2000
  13C6:010E mov dx,ff
  13C6:0111 mov bl,ff
  13C6:0113 div bl
  13C6:0115 [Enter]

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章