gpt4 book ai didi

assembly - assembly 中的MUL功能

转载 作者:行者123 更新时间:2023-12-04 13:01:36 30 4
gpt4 key购买 nike

我正在尝试在汇编中进行简单的乘法运算,但是由于某些原因,当标记了MUL函数时,我看不到寄存器会发生变化。

mov bx, 5    
mov cx, 10

mul cx

最佳答案

这些称为指令,它们指定要由处理器执行的操作。 mov是用于移动的助记符,而mul是用于乘法的助记符。其他常见说明包括addsubdiv。我相信您可以弄清楚这些指定的操作!

大多数指令采用两个参数。用技术术语来说,这些通常称为操作数。第一个(左侧)是目的地,第二个(右侧)是源。因此,在mov bx, 5的情况下,这会将字面值5移到目标寄存器bx中。当然,这些参数的顺序很重要,因为您不能将寄存器bx的内容移动到文字值5中!

mul指令有点奇怪,因为它的某些操作数是隐式的。也就是说,它们没有明确指定为参数。对于mul指令,目标操作数被硬编码为ax寄存器。源操作数是您作为参数传递的一个:它可以是寄存器或内存位置。

因此,您可以想象mul cx的意思是mul ax, cx,但是您不会这样写,因为ax目标寄存器是隐式的。

现在,mul指令命令处理器将目标操作数与源操作数相乘,并将结果存储在目标中。在代码中,您可以想象mul cx将转换为ax = ax * cx。现在,您应该看到问题了:您尚未初始化ax寄存器的内容,因此您要乘以10(这是您放置在cx中的值)乘以ax中剩下的任何垃圾。因此,结果毫无意义!

如果实际上您想做5 * 10,那么只需在代码中更改一个字符即可:

mov  ax, 5     ; ax = 5
mov cx, 10 ; cx = 10
mul cx ; ax = ax * cx ; actually dx:ax = ax * cx


结果将存储在隐式目标寄存器 ax中。

好吧,从技术上讲,结果将存储在 dx:ax中。这是一个寄存器对,意味着结果的高位部分将存储在 dx中,而结果的低位部分将存储在 ax中。为什么会有这种额外的并发症?因为将两个16位值相乘可能会导致一个大于16位的值!在一对16位寄存器中返回全乘法结果允许 mul指令返回32位结果。但是,当您只是在学习时,就不必为此担心。您可以忽略溢出的可能性,并从 ax中提取结果的较低部分。 (但是请记住,无论是否要使用16位的 mul都会覆盖 dx。在386及更高版本上,您可以使用 imul ax, cx真正执行 ax *= cx而不会浪费时间编写 dx。)

虽然我确定这只是一个玩具示例,但实际上没有理由编写将两个常数相乘的代码。这可以在构建时完成,要么使用计算器并对值进行硬编码,要么以符号形式写出常数的乘法,然后让汇编器进行计算。即 mov ax, 50。或者让您的汇编器使用 mov ax, 5 * 10为您完成此操作。但是就像我说的,我确定你已经知道了!

如果所有其他方法均失败,请查阅文档以获取给您带来麻烦的说明。您几乎可以始终通过谷歌搜索指令名称和“ x86”来在网上找到它。例如,可以在 here中找到 mul文档以及其他几个站点。这些信息可能很复杂,但是通过一些努力,您应该能够提取所需的信息。您还可以在 标记 wiki中找到许多其他重要信息和链接。


但是由于某些原因,当标记了MUL功能时,我看不到寄存器发生变化。


我还应该指出,如果您使用调试器来单步执行代码,则当前标记/突出显示的行是将要执行的行。它尚未执行,因此它对寄存器,存储器等的影响尚不可见。您必须单步执行该指令,以便标记/突出显示在下一行上,然后您将看到上一条(刚刚执行的)指令的效果。

如果您理解上面的解释,则在 mul指令之后,您应该会看到 axdx寄存器的内容发生变化。如果调试器显示了其中一个标志,则还将看到标志和指令指针发生变化。没有别的改变! (Intel的指令参考手册 entry for mul没有列出对计算机体系结构状态的任何其他影响。)

关于assembly - assembly 中的MUL功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40893026/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com