我从 8bit 和 8bit 寄存器中得到乘法。但是,当你有一个 16 位和一个 8 位时,我们如何在乘法之前进行转换:
问题:需要提供260*19的代码片段,并打印结果。我做了:
mov Ax,260
mov Al,19
cbw;
Mul Ax
PutInt Ax
我从 8bit 和 8bit 寄存器中得到乘法。但是,当你有一个 16 位和一个 8 位时,我们如何在乘法之前进行转换:
问题:需要提供260*19的代码片段,并打印结果。我做了:
mov Ax,260
mov Al,19
cbw;
Mul Ax
PutInt Ax
mov Ax,260 mov Al,19
AL
寄存器是寄存器的最低半部分AX
。
AX
/-----------------\
MSB xxxx xxxx xxxx xxxx LSB
\-------/ \-------/
AH AL
因此,第二条指令mov al, 19
错误地覆盖了您的第一个数字。
Mul Ax
字节大小的mul
指令将AL
寄存器乘以指定的字节大小的操作数。
字长mul
指令将AX
寄存器乘以指定的字长操作数。
使用mul ax
then 会计算AX * AX
,这不是你想要的。你想乘以不同的数字。
AX
与另一个寄存器一起使用可以BX
解决这两个问题。
如何处理这cbw
取决于我们如何看待代码。
如果您将数字用作立即数 (260, 19),那么即使对于小数字 19,也只需使用字大小的寄存器:
mov bx, 260
mov ax, 19
mul bx ; Product AX * BX is in DX:AX but here DX=0
PutInt ax
甚至让汇编器做乘法:
mov ax, 260 * 19
PutInt ax
如果数字来自内存(不同大小的变量),那么您需要扩展较小的数字。
无符号数,mul
用于无符号乘法
mov bx, wNum ; [0,65535]
mov al, bNum ; [0,255]
mov ah, 0
mul bx ; Product AX * BX is in DX:AX
PutInt ax
我建议不要cbw
在这种情况下使用!使用cbw
会削弱 128 以上的所有数字。
有符号数,imul
用于有符号乘法
mov bx, wNum ; [-32768,32767]
mov al, bNum ; [-128,127]
cbw
imul bx ; Product AX * BX is in DX:AX
PutInt ax
cbw
是从 扩展有符号字节的正确选择AL
。