assembly - 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。
解决方案
这是一个已知的气体错误,不幸的是无法修复;fdiv
带有寄存器操作数(如vs. )的 x87 非交换浮点指令的反向与非反向助记符fdivr
是错误的方式。由于编译器期望顺序是这样的,所以这个错误会一直存在。
请参阅 GAS 手册的AT&T 语法错误部分;这个语法设计错误源于 AT&T 的 UnixWare 汇编程序,GAS 选择复制该语法以实现兼容性。
它也会影响objdump
AT&T 模式。
推荐阅读
- typescript - Azure Functions - Azure IoT 中心未触发 Functions
- scala - Calculate derivative of function at point in Scala Breeze
- arrays - ARDUINO Element in array won't get assigned a value
- curl - 使用 curl 下载可执行文件
- .net-core - dotnet test 将只运行现有的 MSTest,而不包括新的 xUnit 测试
- c# - 正则表达式多次出现后正向后看
- javascript - @Output 和 @HostListener 单击会导致名称相同时超出最大调用堆栈大小
- python - max(dict, dict.get) 当 dict 项是 NamedTuple 对象时
- java - 如何在单元测试中将 src/test 数据中的属性文件发送到 src/main 应用程序
- kotlin - Kotlin:将列表拆分为分组列表的功能方法