我目前正在编写一个生成x86-32代码的编译器.
但是,在尝试实现除法时遇到问题.
idivl %ecx, %ebx
Run Code Online (Sandbox Code Playgroud)
此代码给出了以下错误:
Error: operand type mismatch for `idiv'
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么?以上行是idiv我的代码中唯一出现的时间.
根据我的参考,IDIV将64位整数EDX:EAX除以提供的寄存器值.
idiv - 整数分部
idiv指令通过指定的操作数值划分64位整数EDX的内容:EAX(通过将EDX视为最重要的四个字节,EAX作为最不重要的四个字节构造).除法的商结果存储在EAX中,而余数存放在EDX中.
句法
Run Code Online (Sandbox Code Playgroud)idiv <reg32> idiv <mem>例子
Run Code Online (Sandbox Code Playgroud)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/