Вопросы re: сборка, сгенерированная из моего C ++ от gcc - PullRequest
3 голосов
/ 02 марта 2011

Составление этого кода:

int main ()
{
    return 0;
}

с помощью:

gcc -S filename.cpp

... создает эту сборку:

        .file   "heloworld.cpp"
    .text
.globl main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    .cfi_personality 0x0,__gxx_personality_v0
    pushl   %ebp
    .cfi_def_cfa_offset 8
    movl    %esp, %ebp
    .cfi_offset 5, -8
    .cfi_def_cfa_register 5
    movl    $0, %eax
    popl    %ebp
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
    .section    .note.GNU-stack,"",@progbits

Мои вопросы:

  1. Это все после "." комментарий?
  2. Что такое .LFB0:?
  3. Что такое .LFE0:?
  4. Почему такой большой код только для "int main ()" и "return 0;"?

P.S. Я прочитал много сборочных сетевых книг, много (по крайней мере, 30) учебников, и все, что я могу сделать, это скопировать код и вставить его или переписать его. Сейчас я пробую другой подход, чтобы попытаться как-то научиться этому. Проблема в том, что я понимаю, что такое movl, pop и т. Д., Но не понимаю, как объединить эти вещи, чтобы сделать код «потоком». Я не знаю, где и как правильно начать писать программу в asm. Я все еще не динамический, как в C ++, но хочу изучать ассемблер.

Ответы [ 3 ]

7 голосов
/ 02 марта 2011

Как уже говорилось, .file, .text, ... - это директивы ассемблера, а .LFB0, .LFE0 - локальные метки.Единственная инструкция в сгенерированном коде:

pushl   %ebp
movl    %esp, %ebp
movl    $0, %eax
popl    %ebp
ret

Первые две инструкции являются прологом функции.Указатель кадра сохраняется в стеке и обновляется.Следующее хранилище интрукции 0 в регистре eax (ABI i386 утверждает, что целочисленное возвращаемое значение возвращается через регистр eax).Две последние инструкции являются функциональным эпилогом.Указатель кадра восстанавливается, и затем функция возвращается к вызывающей стороне с помощью инструкции ret.

Если вы скомпилируете свой код с помощью -O3 -fomit-frame-pointer, код будет скомпилирован всего в две инструкции:

xorl    %eax,%eax
ret

Первый набор eax равен 0 (для кодирования требуется всего два байта, в то время как movl 0,%eax занимает 5 байтов), а второй - инструкция ret.Манипулирование указателем кадра предназначено для облегчения отладки (без него можно получить обратную трассировку, но это сложнее).

3 голосов
/ 02 марта 2011

.file, .text и т. Д. Являются директивами ассемблера.

.LFB0, .LFE0 - локальные метки, которые обычно используются в качестве адресатов ветвления внутри функции.

Что касается размера, на самом деле есть только несколько фактических инструкций - большая часть приведенного выше списка состоит из директив и т. Д. Для дальнейшего использования вы можете также захотеть повысить уровень оптимизации, чтобы удалить в противном случае избыточные инструкции, т.е. gcc -Wall -O3 -S ....

2 голосов
/ 02 марта 2011

Просто ваша простая программа многое делает.

Если вы собираетесь читать выходные данные ассемблера, ни в коем случае не компилируйте C ++.Используйте простой C, вывод намного яснее по ряду причин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...