我正在将 Quake 2 的内联 Win32 程序集移植到 GAS。我首先采用内联程序集,然后将其放入它自己的 ASM 文件中。修复了所有问题,然后开始移植到 GAS。我确实知道 src/dst 在 AT&T 与 Intel 语法(包括一些数学运算的浮点寄存器)和其他一些小问题中是相反的,但是当我编译正常时,我注意到代码没有按预期工作。我用比较实用程序仔细查看了几个小时并阅读了汇编手册,最后在 GAS 和 MASM 版本上尝试了“objdump -dwrC > out.txt”。我注意到的很奇怪。
所有代码看起来都是一样的,除了在 MASM 版本中有一个“fsubp st(1), st(0)”行,而在 GAS 中它是“fsubrp st(1), st(0)”。这很奇怪,因为 MASM 和 GAS 中的实际汇编代码都使用了 fsubrp。将其更改为 fsubp 允许粒子绘制代码按预期工作。
为什么会这样?
采取的步骤:
使用比较实用程序逐行验证 src/dst,阅读 x87 汇编手册,包括教程和 GCC ASM 手册以了解任何怪癖。
代码片段:
原始 MASM 代码:
fsubrp st(1), st(0)
气体代码:
fsubrp %st(0), %st(1)
根据 objdump 的 MASM 代码:
fsubp %st(0), st(1)
根据 objdump 的 GAS 代码:
fsubrp %st(0), st(1)
预期成绩:
我希望在 MASM 文件的 objdump 中生成 subrp 而不是 fsubp。
最佳答案
这是一个已知的 gas 错误,不幸的是无法修复;带有寄存器操作数(如 fdiv
与 fdivr
)的 x87 非交换浮点指令的反向助记符与非反向助记符是错误的。由于编译器希望顺序是这样,所以这个错误会一直存在。
参见 GAS 手册的 AT&T Syntax bugs 部分;这个语法设计错误源于 AT&T 的 UnixWare 汇编器,GAS 选择复制该语法以实现兼容性。
也会影响 AT&T 模式下的 objdump
。
关于assembly - Objdump 在编译的程序集上将 fsubrp 交换为 fsubp?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56210264/