assembly - assembly 中的MUL功能

标签 assembly x86 x86-16 multiplying

我正在尝试在汇编中进行简单的乘法运算,但是由于某些原因,当标记了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/

相关文章:

assembly - 使用 SHR 指令除以 8

linux - 虚拟化环境下的CLFLUSH

linux-kernel - 鼓励 CPU 乱序执行 Meltdown 测试

assembly - 是否可以在赋值中使用段寄存器?

c++ - C/C++ 在幕后按值返回结构

c - avr内联汇编错误: impossible constraint

assembly - 位图 ASM 中的颜色特定行

c - 汇编成C

assembly - 汇编中的 LONG 和 FAR 跳转之间有什么区别(如果有的话)?

c - Dosbox 是模拟 32 位环境还是 16 位环境?