初学者看王爽的书中关于mul的疑问
书中有一个程序是计算N的3次方的,程序如下cube:
mov ax,bx
(1) mul bx
(2) mul bx
ret
其中bx中保存N
根据书上说的,乘数为16位的,结果默认低位保存在ax中,高位保存在dx中,那么当N较大时,在执行完(1)后,ax、dx中均有数据。
执行(2)时,由于ax中保存的数为一个乘数,而这个乘数只是N的平方的低位,这样算的话怎么可能会得到正确的答案呢?
程序代码:-a 0100 0B74:0100 mov bx,3e8 0B74:0103 mov ax,bx 0B74:0105 mul ax 0B74:0107 jnc 0117 0B74:0109 push ax 0B74:010A push dx 0B74:010B pop ax 0B74:010C mul bx 0B74:010E mov cx,ax 0B74:0110 pop ax 0B74:0111 mul bx 0B74:0113 add dx,cx 0B74:0115 jmp 119 0B74:0117 mul ax 0B74:0119 int 3 0B74:011A -g AX=CA00 BX=03E8 CX=3A98 DX=3B9A SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B74 ES=0B74 SS=0B74 CS=0B74 IP=0119 NV UP EI PL NZ NA PE NC 0B74:0119 CC INT 3 -

程序代码: ;0xFFFF * 0xFFFF *0xFFFF = 0xFFFD0002FFFF (6 bytes)
1. 0xFFFF*0xFFFF = 0xFFFE0001
2. 0xFFFE0001 * 0xFFFF
= (0xFFFE0000 * 0xFFFF) + (0x0001 * 0xFFFF)
= (0xFFFE * 0xFFFF) * 0x10000 + 0xFFFF
= (0xFFFD0002) * 0x10000 + 0xFFFF
= (0xFFFD0002 << 16) + 0xFFFF
= (dw + dd) + dw
3. hiword dw 0
lodword dd 0
4.
mov bx,0ffffh
mov ax,bx
mul bx
;0xFFFF * 0xFFFF = 0xFFFE0001
;dx = 0xFFFE ax = 0x0001
push ax
push dx
pop ax
;ax = 0xFFFE
mul bx
;0xFFFE * 0xFFFF = 0xFFFD0002
;dx = 0xFFFD ax = 0x0002
mov ds:[hiword],dx
mov ds:[lodword+2],ax
pop ax
;ax = 0x0001
mul bx
;0x0001 * 0xFFFF = 0xFFFF
;dx = 0x0000 ax = 0xFFFF
add ds:[lodword],ax
adc ds:[lodword+2],dx
5. vc __asm code