Objdump обменивать fsubrp на fsubp на скомпилированной сборке? - PullRequest
3 голосов
/ 19 мая 2019

Я портирую встроенную сборку 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.

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

Это известная ошибка с газом, которая, к сожалению, не может быть исправлена; обратная и нереверсивная мнемоника для некоммутативных команд с плавающей запятой x87 с операндами регистра (например, fdiv против fdivr) является неправильным способом. Поскольку компиляторы ожидают, что порядок будет таким, эта ошибка останется.

См. Раздел Ошибки синтаксиса AT & T в руководстве по GAS; эта ошибка проектирования синтаксиса возникла в UnixWare на ассемблере AT & T, и GAS решила скопировать этот синтаксис для совместимости.

Также влияет на objdump в режиме AT & T.

1 голос
/ 20 мая 2019

Я понял это.Благодаря Питеру Кордесу я работал с -Mintel на версиях MASM и GAS.Опкоды были неверны, как он заявил.По какой-то причине с GAS, если у вас есть и fsubp, а затем fsubrp, вы должны изменить это.Как только это было сделано, он генерировал правильные коды операций.Не уверен, что это очень неясная проблема.

...