首页 > 解决方案 > 这是在 Mul 中使用 cbw 的正确方法吗?

问题描述

我从 8bit 和 8bit 寄存器中得到乘法。但是,当你有一个 16 位和一个 8 位时,我们如何在乘法之前进行转换:

问题:需要提供260*19的代码片段,并打印结果。我做了:

mov Ax,260
mov Al,19
cbw;
Mul Ax 
PutInt Ax

标签: assemblyx86-16sign-extension

解决方案


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 axthen 会计算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


推荐阅读