Я портирую встроенную сборку Win32 для Quake 2 на GAS.Я начал с того, что взял встроенную сборку и затем поместил ее в собственный файл ASM.Исправлены все проблемы, затем началось портирование на ГАЗ.Я знаю, что src / dst обращен в синтаксисе AT & T против Intel (включая регистры с плавающей запятой для некоторых математических операций) и некоторых других небольших проблемах, но когда я получил эту прекрасную компиляцию, я заметил, что код работает не так, как предполагалось.Я часами внимательно изучал утилиту сравнения и читал руководства по сборке и, наконец, попробовал «objdump -dwrC> out.txt» в версиях GAS и MASM.То, что я заметил, было странным.
Весь код выглядел как сгенерированный одинаково, за исключением того, что в версии 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)
Код GAS:
fsubrp %st(0), %st(1)
Код MASM согласно objdump:
fsubp %st(0), st(1)
Код GAS согласно objdump:
fsubrp %st(0), st(1)
Ожидаемые результаты: Я ожидал, что subrp будет сгенерирован в objdump файла MASM, а не fsubp.