-150- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
-t | AH寄存器的原值被乘积覆盖 | ||||||||||||||||||||
AX=000C | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13C6 | ES=13C6 | SS=13C6 | CS=13C6 | IP=0106 | NV UP EI PL NZ NA PE NC | ||||||||||||||||
13C6:0106 | BBFFFF | MOV BX,FFFF | |||||||||||||||||||
接下来的程序反映了"MUL"指令对有符号数的处理,我们利用"G"命令一次将其执行完,看看程序执行的结果如何: | |||||||||||||||||||||
-g=106 10b[Enter] | |||||||||||||||||||||
积的低16位 | 乘数 | 积的高16位 | |||||||||||||||||||
AX=000C | BX=0000 | CX=0000 | DX=0000 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13C6 | ES=13C6 | SS=13C6 | CS=13C6 | IP=010B | NV UP EI PL NZ AC PE CY | ||||||||||||||||
13C6:010B | 90 | NOP | |||||||||||||||||||
以上三行指令跟踪的结果反映了两个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 |