采取以下代码:
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。
答案 0 :(得分:1)
尽管答案已经是注释:操作数必须是内存操作数。
查看手册,它说:
DA / 6 FIDIV m32int
DE / 6 FIDIV m16int
如果您也可以选择该操作数的寄存器,它不会列出FIDIV r/m32int
。一些FPU指令组(基于它们的第一个字节的组)被分成两个子组,这两个子组中有不同的指令(所有组都被拆分,但有些组,如D8
,被分成两个子组,只有两个子组不同操作数)。 DA
和DE
组是分组为两个完全不同的子组的组的示例。这些组基于" 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)
。