Какой стиль ASM использует g ++ - PullRequest
2 голосов
/ 11 апреля 2011

Мне было интересно, какой стиль 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 ]

3 голосов
/ 11 апреля 2011

G ++ предназначается для ассемблера GNU gas, который использует синтаксис AT & T ( op src dest ), если вы не используете директиву .intel_syntax.

2 голосов
/ 11 апреля 2011

Скорее всего, он создает синтаксис AT & T, и то, что вы видите, является правильным. Обратите внимание, что указатель стека перемещается в базовый указатель после того, как базовый указатель сам сохраняется в стеке. Это стандартный шаблон стека кадров, выдаваемый gcc на x86.

Также обратите внимание, что перед вашим ret кадр стека восстанавливается через leave, что эквивалентно

movl %ebp,%esp
popl %ebp
...