【问题标题】:Operand type mismatch for idividiv 的操作数类型不匹配
【发布时间】:2011-12-06 06:45:00
【问题描述】:

我目前正在编写一个生成 x86-32 代码的编译器。

但是,我在尝试执行除法时遇到了问题。

idivl %ecx, %ebx

这段代码给了我以下错误:

Error: operand type mismatch for `idiv'

有人知道为什么吗?以上几行是idiv 唯一一次出现在我的代码中。

【问题讨论】:

  • 我可能错了,但idiv不是单操作数指令吗?
  • @Mysticial - 是的,它计算edx:eax / r32,其中edx:eaxedxeax 的按位连接以形成64 位值,r32 是任何32 位寄存器或指针。结果放在eax 中,其余的放在edx 中。

标签: assembly x86


【解决方案1】:

根据我的参考,IDIV 将 64 位整数 EDX:EAX 除以提供的寄存器值。

idiv — 整数除法

idiv 指令将 64 位整数 EDX:EAX(通过将 EDX 视为最高有效四个字节来构造 和 EAX 作为最低有效四个字节)由指定的操作数 价值。除法的商结果存储到 EAX 中,而 其余的放在 EDX 中。

语法

idiv <reg32>
idiv <mem>

例子

idiv ebx ; divide the contents of EDX:EAX by the contents of EBX. Place the quotient in EAX and the remainder in EDX.
idiv DWORD PTR [var] ; divide the contents of EDX:EAS by the 32-bit value stored at memory location var. Place the quotient in EAX

以及 EDX 中的其余部分。

idivl 指令的行为与 idiv 完全相同,只是 idivl 是一个有符号除法。

http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

另一个伟大的参考:http://ref.x86asm.net/

【讨论】:

  • 这可能对你有些用处,它本质上是一个普通指令的外行术语列表以及它们的作用:programminggroundup.blogspot.com/2007/01/…
  • idiv 是有符号的除法。 div 未签名。 idivl 只是 idiv,在 AT&T 语法中具有 32 位的显式操作数大小。
【解决方案2】:

idivl 只接受一个参数。见here。 它将 EDX:EAX 的内容除以参数的内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2023-03-27
    • 2018-11-02
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多