lm68140318 发表于 2023-8-11 17:59:24

mul乘法


;计算N的3次方
cube:mov ax,bx
      mul bx
          mul bx
          ret




我的问题:第一次mul bx后高位默认在DX中存放,低位在AX中
          第二次mul bx只是低位AX与bx相乘   高位的值被忽视了   ??

陶远航 发表于 2023-8-11 17:59:40

在x86汇编语言中,mul指令用于无符号乘法操作。它将一个8位或16位的寄存器与AX(累加器)相乘,结果的低16位保存在AX中,高16位保存在DX中。当使用两个相邻的mul bx指令时,第一次的结果会被存储在DX和AX中,然后第二次的mul bx只会将AX与BX相乘,高位的值被忽略了。

如果你想要正确地进行多次乘法操作,并且保存所有乘法的结果,可以按照以下方式进行:

mov ax, bx         ; 将bx的值移动到ax
mul bx             ; 将ax与bx相乘,结果的低16位保存在ax中,高16位保存在dx中
mov cx, ax         ; 将ax的值复制到cx
mul bx             ; 将ax与bx相乘,结果的低16位保存在ax中,高16位保存在dx中
; 你可以继续进行更多的乘法操作


通过在每次乘法操作之前,将AX的值复制到另一个寄存器(如CX),就可以在后续的乘法操作中不丢失前一次乘法的结果。希望这对你有帮助!
如果问题已经解决,请设置最佳答案

学习编程中的Ben 发表于 2023-8-11 17:59:44

在汇编语言中,mul指令用于执行无符号整数的乘法操作,并将结果存储在指定的寄存器对中。当使用 mul 指令进行连续乘法运算时,需要注意处理高位和低位的结果。

在你给出的代码中,第一次执行 mul bx 后,高位乘积被存储在 DX:AX 寄存器对中,其中 DX 存储高位结果,AX 存储低位结果。而第二次执行 mul bx 时,只会将低位的结果与 BX 相乘,高位的值被忽略。

如果要进行连续乘法操作并保留最终结果,可以使用附加的寄存器来保存中间结果。

以下是修改后的汇编代码示例:

cube:
    mov ax, bx            ; 将 bx 的值移动到 ax 中
    mul bx                ; 进行第一次乘法操作,结果存储在 dx:ax 中
    mov di, dx            ; 将 dx (高位)的值保存到 di 寄存器中
    mul bx                ; 进行第二次乘法操作,结果存储在 dx:ax 中
    add ax, di            ; 将 ax (低位)与 di (高位)相加,得到最终结果
    ret                   ; 返回



在这个示例中,我们使用 mov di, dx 将第一次乘法的高位结果保存到 DI 寄存器中。然后,执行第二次乘法操作时,只进行低位的乘法运算,得到最终结果时,将低位结果与高位结果相加。

希望这能解答你的问题。如果还有其他疑问,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-8-11 18:00:03

是的,你的理解是正确的。

在x86汇编语言中, mul 指令用于无符号乘法操作。它将一个无符号操作数与累加器( AX 、 EAX 或 RAX )中的值相乘,并将结果存储在累加器中。

当使用 mul 指令时,乘积的低位部分将存储在累加器的低位寄存器中( AL 、 AX 、 EAX 或 RAX ),而乘积的高位部分将存储在累加器的高位寄存器中( AH 、 DX:AX 、 EDX:EAX 或 RDX:RAX )。

在你的代码中,第一次执行 mul bx 后,乘积的低位部分存储在 AX 中,而乘积的高位部分存储在 DX 中。

然后,你执行了第二次 mul bx 操作。这次乘积的低位部分将再次存储在 AX 中,但是乘积的高位部分将被忽略,因为你没有指定存储高位部分的寄存器。这意味着第二次乘积的高位部分将覆盖掉第一次乘积的高位部分。

如果你想保留第一次乘积的高位部分,你可以将其存储在另一个寄存器中,例如 DX ,然后在第二次乘法之后将其与第二次乘积的高位部分相加。

以下是修改后的代码示例:

;计算N的3次方
cube:
    mov ax, bx
    mul bx
    mov dx, ax ; 将第一次乘积的高位部分存储在DX中
    mul bx
    add dx, ax ; 将第一次乘积的高位部分与第二次乘积的高位部分相加
    ret


这样,你就可以正确地计算N的立方了。

lm68140318 发表于 2023-8-11 18:04:56

陶远航 发表于 2023-8-11 17:59
在x86汇编语言中,mul指令用于无符号乘法操作。它将一个8位或16位的寄存器与AX(累加器)相乘,结果的低16 ...

第二次mul时高位也应该相乘啊??

陶远航 发表于 2023-8-11 18:07:25

lm68140318 发表于 2023-8-11 18:04
第二次mul时高位也应该相乘啊??

你的理解是正确的,理论上来说,高位也应该参与乘法运算。但是在x86汇编语言中,mul指令的设计是这样的:它只会将AX寄存器(或者是AL寄存器,取决于操作数的大小)和另一个寄存器进行乘法运算,然后将结果的低位部分存储在AX寄存器中,高位部分存储在DX寄存器中。

所以,当你连续执行两次mul bx指令时,第二次的mul bx实际上是忽略了第一次乘法运算结果的高位部分,只是将第一次乘法运算结果的低位部分(也就是AX寄存器中的内容)和BX寄存器进行了乘法运算。

如果你想要在乘法运算中包含高位部分,你需要手动将DX寄存器中的内容加入到乘法运算中。这可能需要使用其他的汇编指令,例如add或者adc(带进位的加法)等。
页: [1]
查看完整版本: mul乘法