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, вы должны изменить это. Как только это было сделано, он генерировал правильные коды операций. Не уверен, что это ультра-скрытый вопрос.