fidiv:按寄存器分割时不正确的操作数类型错误

时间:2014-12-23 11:07:15

标签: assembly x86 fpu

采取以下代码:

void calculate(int int_number) {
    __asm {
        fld1
        mov eax, 5
        fidiv eax    ; A
    }
}

如果我尝试编译它,A行将失败并显示error C2415: improper operand type。如果我用整数常量替换eax,就会出现同样的问题。但是,如果我将int_number作为fidiv参数传递:

void calculate(int int_number) {
    __asm {
        fld1
        fidiv int_number
    }
}

代码编译正确。

那么除以寄存器有什么问题?

我在Windows 8.1 64位上使用Visual Studio。

1 个答案:

答案 0 :(得分:1)

尽管答案已经是注释:操作数必须是内存操作数。

查看手册,它说:

  

DA / 6 FIDIV m32int
  DE / 6 FIDIV m16int

如果您也可以选择该操作数的寄存器,它不会列出FIDIV r/m32int。一些FPU指令组(基于它们的第一个字节的组)被分成两个子组,这两个子组中有不同的指令(所有组都被拆分,但有些组,如D8,被分成两个子组,只有两个子组不同操作数)。 DADE组是分组为两个完全不同的子组的组的示例。这些组基于" mod" ModR / M字节中的字段,00表示10表示一组,11表示另一组表示。

在第二组为" normal"的组中,mod字段11表示使用ST(i)操作数。在#34;怪异的"群体,它使指令意味着完全不同的东西。

例如DA F0,您可能想要表示FIDIV eax,实际上意味着......没有。桌子上有一个洞。另一方面,DA C0,你可能想要表示 FIADD eax,实际上意味着FCMOVB st(0), st(0)