在汇编中 乘法是 怎么具体运算的?

来源:百度知道 编辑:UC知道 时间:2024/07/07 02:59:52
8000H*0 怎么不等于0?

-a
1386:0100 mov ax,8000
1386:0103 mov dx,0
1386:0106 mul ax,0
1386:0108
-t

AX=8000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1386 ES=1386 SS=1386 CS=1386 IP=0103 NV UP EI PL NZ NA PO NC
1386:0103 BA0000 MOV DX,0000
-t

AX=8000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1386 ES=1386 SS=1386 CS=1386 IP=0106 NV UP EI PL NZ NA PO NC
1386:0106 F7E0 MUL AX
-t

AX=0000 BX=0000 CX=0000 DX=4000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1386 ES=1386 SS=1386 CS=1386 IP=0108 OV UP EI PL NZ NA PO CY
1386:0108 29C1 SUB CX,AX

正确的:
-a
1386:0100 mov ax,8000
1386:0103 mov dx,0
1386:0106 mul dx
1386:0108
-t

AX=8000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1386 ES=1386 SS=1386 CS=1386 IP=0103 NV UP EI PL NZ NA PO NC
1386:0103 BA0000 MOV DX,0000
-t

AX=8000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1386 ES=1386 SS=1386 CS=1386 IP=0106 NV UP EI PL NZ NA PO NC
1386:0106 F7E0 MUL dx
-t

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1386 ES=1386 SS=1386 CS=1386 IP=0108 OV UP EI PL NZ NA PO CY
1386:0108 29C1 SUB CX,AX

解释:
乘法指令是“单”操作数:如果是8位相乘,一个乘数默认是在AL中,另一个乘数由指令给出,必须是8位的寄存器或内存单元,结果为16位,默认放在AX中;如果是16位相乘,一个乘数默认是在AX中,另一个乘数由指令给出,必须是16位的寄存器或内存单元,结果为32位,默认放在AX(低16位)和DX(高16位)中;也就是说,虽然乘法是2个操作数,但是指令只给出一个,另外一个是系统默认的。
例如:mov ax,1122h
mov bx,3344h
mul bl ;完成al*bl,结果放在ax
mul bx ;完成ax*bx,结果放在ax和dx