首页 > 解决方案 > Objdump 在已编译的程序集中将 fsubrp 交换为 fsubp?

问题描述

我正在将 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。

标签: assemblymingwmasmdisassemblyx87

解决方案


这是一个已知的气体错误,不幸的是无法修复;fdiv带有寄存器操作数(如vs. )的 x87 非交换浮点指令的反向与非反向助记符fdivr是错误的方式。由于编译器期望顺序是这样的,所以这个错误会一直存在。

请参阅 GAS 手册的AT&T 语法错误部分;这个语法设计错误源于 AT&T 的 UnixWare 汇编程序,GAS 选择复制该语法以实现兼容性。

它也会影响objdumpAT&T 模式。


推荐阅读