![]() | 第6章 文字输出与键盘输入 | -151- | |||||||||||||||||||
-g=100 109[Enter] | |||||||||||||||||||||
被除数的低16位 | 除数 | 被除数的高16位 | |||||||||||||||||||
AX=FFF6 | BX=000C | CX=0000 | DX=000B | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13C6 | ES=13C6 | SS=13C6 | CS=13C6 | IP=0109 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
13C6:0109 | F7F3 | DIV BX | |||||||||||||||||||
以下是"DIV"指令执行后的寄存器情况,从中可以看到商与余数数的位置。000BFFF6H除以000CH应该商0FFFFH余2,从程序执行的结果来看AX寄存器中的确保存着商数而余数在DX寄存器中。 | -t | 商 | 余数 | ||||||||||||||||||
AX=FFFF | BX=000C | CX=0000 | DX=0002 | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13C6 | ES=13C6 | SS=13C6 | CS=13C6 | IP=010B | NV UP EI PL NZ NA PO NC | ||||||||||||||||
13C6:010B | B80020 | MOV AL,2000 | |||||||||||||||||||
与MUL指令一样,CPU判断被除数是32位还是16位同样依据DIV指令之后的操作数。若操作数是16位,则被除数就是由DX与AX寄存器共同保存的32位数据;若操作数是8位,则被除数就是AX寄存器中的16位数据。请看下面的跟踪结果: | |||||||||||||||||||||
-g=10b 113[Enter] | |||||||||||||||||||||
被除数的低16位 | 除数 | 被除数的高16位 | |||||||||||||||||||
AX=2000 | BX=00FF | CX=0000 | DX=00FF | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13C6 | ES=13C6 | SS=13C6 | CS=13C6 | IP=0113 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
13C6:0113 | F6F3 | DIV BL | |||||||||||||||||||
我们有意"创造"了一个32位的被除数00FF2000H,然而除数是一个8位二进制数,通过以下的跟踪结果我们可以看到究竟谁是真正的被除数。 | -t | 商与余数 | |||||||||||||||||||
AX=2020 | BX=00FF | CX=0000 | DX=00FF | SP=FFEE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=13C6 | ES=13C6 | SS=13C6 | CS=13C6 | IP=0115 | NV UP EI PL NZ AC PE CY | ||||||||||||||||
13C6:0115 | 90 | NOP | |||||||||||||||||||
虽然DX寄存器中存入了00FFH,但由于DIV指令的操作数是8位寄存器BL,所以DX寄存器并未参与这次除法运算,真正的被除数是AX寄存器中的2000H。 试验<3> C:\ASM\>DEBUG[Enter] -a[Enter] 13C6:0100 mov ax,2000 13C6:0103 mov bl,2 |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |