初学者看王爽的书中关于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],dx5. vc __asm code