Я портирую встроенный код сборки Quake 2 для MSVC на MASM, а затем на GAS (для использования с MinGW). Конкретный рассматриваемый код предназначен для рисунка скина (R_PolysetCalcGradients для тех, кто хочет посмотреть его). Код почти «работает», что происходит, если кажется, что кожа неправильно растянута по модели.
Несколько интересных вещей, которые я заметил, - это когда я запускаю objdump -dwrC r_polysa.obj> r_polysa.masm и то же самое для версии GAS, код в основном похож, за исключением того факта, что fsubp и fsubrp были заменены в MASM. Обратите внимание, не операнды (я уже знаю об этой проблеме в ГАЗ).
На рисунке левая сторона - версия GAS, правая сторона - версия MASM. Исходный код MASM (и, следовательно, то, что у меня есть в GAS) - это то, что должно быть слева. Я не уверен, почему MASM явно меняет это или objdump сообщает об этом неправильно. Однако, если я поменяю местами, это не решит проблему. Это просто переворачивается другим неправильным способом.
Я упоминаю этот своп FSUBP / FSUBRP, потому что это было проблемой при переносе встроенного кода ASM смешивания частиц. У этого был один вызов, чтобы использовать FSUBRP в версии MASM, objdump сообщил, что теперь это FSUBP, и мне пришлось изменить его на FSUBP в версии GAS, чтобы он работал! Я не понимаю, почему это происходит?
В любом случае, я новичок в сборке, но понимаю некоторые основы и немного читаю. Очевидно, математика здесь не совсем верна, но кажется, что так и должно быть. Я не знаю, как или что делать дальше. Как мне исправить и отладить эту проблему?
Репозиторий кода, над которым я работаю, находится по адресу: https://bitbucket.org/neozeed/q2dos/commits/branch/win32_asm (в частности, ветка Win32_ASM). Я работаю с файлами gas \ r_polysa.s и ref_soft \ r_polysa.asm .