鱼C论坛

 找回密码
 立即注册
查看: 435|回复: 5

[已解决]mul乘法

[复制链接]
发表于 2023-8-11 17:59:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  1. ;计算N的3次方
  2. cube:mov ax,bx
  3.       mul bx
  4.           mul bx
  5.           ret
复制代码





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

最佳答案
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(带进位的加法)等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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


通过在每次乘法操作之前,将AX的值复制到另一个寄存器(如CX),就可以在后续的乘法操作中不丢失前一次乘法的结果。希望这对你有帮助!
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 17:59:44 | 显示全部楼层
在汇编语言中,mul指令用于执行无符号整数的乘法操作,并将结果存储在指定的寄存器对中。当使用 mul 指令进行连续乘法运算时,需要注意处理高位和低位的结果。

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

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

以下是修改后的汇编代码示例:
  1. cube:
  2.     mov ax, bx            ; 将 bx 的值移动到 ax 中
  3.     mul bx                ; 进行第一次乘法操作,结果存储在 dx:ax 中
  4.     mov di, dx            ; 将 dx (高位)的值保存到 di 寄存器中
  5.     mul bx                ; 进行第二次乘法操作,结果存储在 dx:ax 中
  6.     add ax, di            ; 将 ax (低位)与 di (高位)相加,得到最终结果
  7.     ret                   ; 返回
复制代码

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

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

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 ,然后在第二次乘法之后将其与第二次乘积的高位部分相加。

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

  1. ;计算N的3次方
  2. cube:
  3.     mov ax, bx
  4.     mul bx
  5.     mov dx, ax ; 将第一次乘积的高位部分存储在DX中
  6.     mul bx
  7.     add dx, ax ; 将第一次乘积的高位部分与第二次乘积的高位部分相加
  8.     ret
复制代码


这样,你就可以正确地计算N的立方了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

第二次mul时  高位也应该相乘啊  ??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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(带进位的加法)等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-30 19:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表