9

我已经阅读了一些教程和示例,但我无法理解MUL指令的工作原理。我用过ADDSUB没有问题。显然,这条指令将其操作数乘以寄存器中的值。

哪个寄存器(eax、ebp、esp 等)乘以第一个操作数?结果存储在哪个寄存器中,所以我可以将它移到堆栈中?抱歉,我只是在学习 x86 汇编。

当我尝试编译这一行时......

mul     9

我明白了,Error: suffix or operands invalid for 'mul'。谁能帮我吗?

    global  main
    main:
    push    ebp
    movl    ebp, esp
    sub     esp, byte +8
    mov     eax, 7
    mul     9
    mov     [esp], eax
    call    _putchar
    xor     eax, eax
    leave
    ret
4

6 回答 6

13

MUL 不能使用立即数作为参数。您必须将“9”加载到寄存器中,例如,

 movl    $7, %eax
 movl    $9, %ecx
 mull    %ecx

这会将 eax 乘以 ecx 并将 64 位乘积存储在 edx:eax 中。

英特尔网站上有 x86 汇编指令的全面参考,请参见此处

http://www.intel.com/Assets/PDF/manual/253666.pdf

http://www.intel.com/Assets/PDF/manual/253667.pdf

但这可能是您现在需要的更多信息。

于 2010-12-25T05:50:36.970 回答
5

如果您查看MUL格式表,您会注意到它只接受一个寄存器参数。但是翻过来IMUL,你会看到它有很多形式可以接受立即

6B /r ib          IMUL r16, r/m16, imm8   字寄存器 ← r/m16 * 符号扩展立即字节。
6B /r ib          IMUL r32, r/m32, imm8   双字寄存器 ← r/m32 * 符号扩展立即字节。
REX.W + 6B /r ib IMUL r64, r/m64, imm8   四字寄存器 ← r/m64 * 符号扩展立即字节。
69 /r iw          IMUL r16, r/m16, imm16  字寄存器 ← r/m16 * 立即字。
69 /r id          IMUL r32, r/m32, imm32  双字寄存器 ← r/m32 * 立即双字。
REX.W + 69 /r id IMUL r64, r/m64, imm32  四字寄存器 ← r/m64 * 立即双字。

因此,要将 eax 乘以 9,您可以这样做

mov eax, 7
imul eax, eax, 9 ; eax = eax*9

仔细观察,您还可以观察到这些版本没有扩大。事实上,现在imul几乎所有乘法都专用,因为非扩展乘法对于有符号和无符号值是相同的,并且高级语言中的乘法是非扩展的(即输出类型和输入操作数的类型相同),除非您将操作数转换为更广泛的类型。因此,现代 x86 CPU 经常针对它进行优化,imul并且它还具有比mul

于 2019-01-29T04:08:45.467 回答
3

http://siyobik.info/index.php?module=x86&id=210

目标操作数是位于寄存器 AL、AX 或 EAX 中的隐含操作数(取决于操作数的大小);源操作数位于通用寄存器或内存位置

结果存储在寄存器 AX、寄存器对 DX:AX 或寄存器对 EDX:EAX(取决于操作数大小)中,乘积的高位分别包含在寄存器 AH、DX 或 EDX 中。如果乘积的高位为 0,则清除 CF 和 OF 标志;否则,设置标志。

在您的来源中,它应该mulmull

于 2010-12-25T04:12:36.583 回答
3

我不是专家,但我认为您的问题是mul在您的情况下不接受直接操作数十进制常量 9 所以尝试将 9 放入让我们说寄存器 bx 如下所示:

mov bx, 9
mul bx

要回答您mul的一般问题,它看起来像这样:

mul     reg/memory

并这样做:

dx:ax := ax*reg/mem

因此,它需要一个操作数,该操作数应该是寄存器或内存位置(存储要相乘的值,因此本质上是一个变量)并将其乘以 ax ,然后取决于寄存器/内存的长度(所以操作数你give) 将其存储在 ax 或 dx:ax 或 edx:eax 中

我希望我能帮助你,伙计!

于 2011-05-19T20:59:01.210 回答
1

我会给你一个链接,指向我最喜欢的、易于阅读但完整的 x86 参考:http ://www.ousob.com/ng/iapx86/ng1840d.php

于 2010-12-25T06:04:09.040 回答
0

如何阅读英特尔手册以查看它是不可能的

首先下载英特尔手册。当前的下载页面是: http: //www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html但只是谷歌“intel x86 手册”,因为它必然会改变。

我们想要的是包含所有指令的组合第 2 卷指令集参考 AZ。

在该手册中,找到DIV. 我们看到在指令DIV下有以下表格:

  • DIV r/m8
  • DIV r/m16
  • DIV r/m32
  • DIV r/m64

r/mX意味着它可以占用大小为 X 的寄存器或内存位置。

因此,不存在采用immX立即值或文字的形式。

所以不可能将该指令编码到处理器,现在我们知道唯一的方法是通过寄存器或内存。

寄存器更快,所以如果可能,我们当然会使用它们。

于 2015-09-20T21:21:13.137 回答