Какой стиль ASM использует g++
Мне было интересно, какой стиль ASM использует g ++ (AT&T или Intel). Я работаю над заданием, которое требует от меня определения различных инструкций ASM. Я видел ниже:
movl %esp, %ebp
where %esp = stack pointer and %ebp = base pointer
Стиль Intel гласит, что вышесказанное соответствует:
movl destination, source
Но не имеет смысла перемещать базовый указатель в указатель стека, поэтому мне интересно, использует ли g ++ стиль AT&T ASM.
Вот команда, которую я использовал для создания ASM (и информации о платформе):
g++ -S src -o out.bin
OS: Fedora Linux 14, 2.6.35.10-74.fc14.i686
Compiler: gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)
Мой вопрос: есть ли какой-либо способ точно сказать, какой стиль создает g ++? Есть какой-то переключатель.
Пожалуйста, поправьте меня, где я не прав. Заранее спасибо!
2 ответа
G++ предназначается для ассемблера GNU gas
, который использует синтаксис AT&T (op src dest), если вы не используете .intel_syntax
директива
Скорее всего, он создает синтаксис AT&T, и то, что вы видите, является правильным. Обратите внимание, что указатель стека перемещается в базовый указатель после того, как базовый указатель сам сохраняется в стеке. Это стандартный шаблон стека кадров, испускаемый gcc на x86.
Также обратите внимание, что перед вашим ret
кадр стека восстанавливается через leave
, что эквивалентно
movl %ebp,%esp
popl %ebp