将Quake 2中的MASM5代码移植到GAS上-意外的渲染结果

时间:2019-05-19 18:54:40

标签: c assembly masm gas x87

我正在将Quake 2的MSVC内联汇编代码移植到MASM,然后最终移植到GAS(用于MinGW)。有问题的特定代码用于外观绘图(对于要查找它的用户来说为R_PolysetCalcGradients)。该代码几乎“起作用”,发生的情况是皮肤似乎错误地延伸到了模型上。

Incorrect skin stretching 我注意到的一些有趣的事情是,当我运行 objdump -dwrC r_polysa.obj> r_polysa.masm 时,GAS版本的代码几乎相同,除了 fsubp fsubrp 已在MASM中交换。请注意不是操作数(我已经知道GAS中的这个问题)。 Swapped fsubp/fsubrp 在图片中左侧是GAS版本,右侧是MASM版本。原始的MASM代码(以及我在GAS中拥有的代码)应在左侧。我不确定为什么MASM显然在交换此消息,或者objdump错误地报告了它。但是,如果我将两者互换,则无法解决问题。它只是以另一种错误的方式被颠倒了。 Still wrong skin stretching

我提到了此FSUBP / FSUBRP交换,因为这是移植“粒子混合”内联ASM代码时的问题。有人打电话来使用MASM版本的FSUBRP,objdump报告说它现在是FSUBP,我必须将其更改为GAS版本的FSUBP才能起作用!我不明白为什么会这样?

无论如何,我是组装的新手,但了解一些基础知识并一直在阅读。显然这里的数学不是很正确,但是似乎应该是正确的。我不知道下一步该怎么做。如何解决和调试此问题?

我正在使用的代码存储库位于:https://bitbucket.org/neozeed/q2dos/commits/branch/win32_asm(特别是Win32_ASM分支)。我正在使用的文件是 gas \ r_polysa.s ref_soft \ r_polysa.asm

1 个答案:

答案 0 :(得分:1)

操作码相反,因此在fsubp之后出现GAS和fsubrp的异常现象。还有其他与该问题无关的陷阱。对于那些感兴趣的人,请参阅:https://bitbucket.org/neozeed/q2dos/commits/f5bf93e3a78e112ae1f766606471a6c5e67283d4