【发布时间】:2016-03-02 12:53:21
【问题描述】:
我在网上找到了一些建议。
- C Inline assembly - Operand type mismatch for 'fst'
- Why am I getting these assembler errors?
- Why will I have operand type mismatch error when compiling the assembly codes with gcc?
我有类似的问题,但没有任何建议有帮助(或者我没有弄清楚如何根据我的程序正确实施它们)。
代码以asm(...) 的形式插入到C 程序中。
用-masm=intel编译后,使用时:
asm ("FLD EBX \n" "FSQRT \n" "FST EBX \n").
我得到编译错误:
“错误:'fld' 的操作数类型不匹配” “... 'fst' 不匹配”。
EBX 在这些命令之前保存一些整数正值。
那么获取 ebx = sqrt(ebx) 的正确方法是什么?
【问题讨论】:
-
您不能从通用寄存器加载到 FPU。你需要通过记忆。请参阅指令集参考。
push ebx; fild dword [esp]; fsqrt; fistp dword [esp]; pop ebx。请注意,通常不需要汇编,而且 gcc 内联汇编是一个复杂的野兽。 -
请使用minimal reproducible example 而不是单纯的sn-p。
-
@Jester 嘿,我在某个网站上看到过这个方案,但不明白我应该插入什么来代替 dword 和 esp?
-
esp是堆栈指针,您不要插入任何“代替”它的东西。dword可能需要为dword ptr,这只是表示操作数的大小。 -
@Jester 你对 esp 的看法是对的 .. 我有点困惑(顺便说一句,我需要组装)
标签: assembly compiler-errors x86 mismatch