Objdump обменивать fsubrp на fsubp на скомпилированной сборке?

Я портирую встроенную сборку Win32 в Quake 2 на ГАЗ. Я начал с того, что взял встроенную сборку и затем поместил ее в собственный файл 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)

Код ГАЗА:

fsubrp %st(0), %st(1)

MASM код в соответствии с objdump:

fsubp %st(0), st(1)

Код ГАЗА согласно objdump:

fsubrp %st(0), st(1)

Ожидаемые результаты: я ожидал, что subrp будет сгенерирован в objdump файла MASM, а не fsubp.

2 ответа

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

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

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

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

Другие вопросы по тегам