вывод блока x86 gcc помогает

Вставляемый ниже не оптимизирован вывод блока GCC для "международного основного () {}". Я относительно хорош с x86 блоком, но часть этого незнакома. Кто-то мог сделать линию за линией пошаговая демонстрация того, что продолжается здесь?

Спасибо!

    .text
.globl _main
_main:
LFB2:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    leave
    ret
LFE2:
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
    .set L$set$0,LECIE1-LSCIE1
    .long L$set$0
LSCIE1:
    .long   0x0
    .byte   0x1
    .ascii "zR\0"
    .byte   0x1
    .byte   0x78
    .byte   0x10
    .byte   0x1
    .byte   0x10
    .byte   0xc
    .byte   0x7
    .byte   0x8
    .byte   0x90
    .byte   0x1
    .align 3
LECIE1:
.globl _main.eh
_main.eh:
LSFDE1:
    .set L$set$1,LEFDE1-LASFDE1
    .long L$set$1
LASFDE1:
    .long   LASFDE1-EH_frame1
    .quad   LFB2-.
    .set L$set$2,LFE2-LFB2
    .quad L$set$2
    .byte   0x0
    .byte   0x4
    .set L$set$3,LCFI0-LFB2
    .long L$set$3
    .byte   0xe
    .byte   0x10
    .byte   0x86
    .byte   0x2
    .byte   0x4
    .set L$set$4,LCFI1-LCFI0
    .long L$set$4
    .byte   0xd
    .byte   0x6
    .align 3
LEFDE1:
    .subsections_via_symbols
5
задан kelf 24 May 2010 в 00:19
поделиться

2 ответа

Скажите компоновщику, чтобы он поместил это в раздел исполняемого файла .text :

    .text

Экспорт main как внешний символ:

.globl _main

Определите main сама функция:

_main:
LFB2:

Сохранить указатель предыдущего кадра:

    pushq   %rbp
LCFI0:

Установить указатель нового кадра:

    movq    %rsp, %rbp
LCFI1:

Восстановить указатель старого кадра и вернуться к вызывающей стороне:

    leave
    ret

Следующие директивы устанавливают .eh_frame раздел, содержащий информацию, требуемую средой выполнения C ++ для обработки исключений.

LFE2:
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support

Это таблица ввода общей информации:

EH_frame1:

Она начинается с длины, рассчитанной из разницы меток LSCIE1 и LECIE1 :

    .set L$set$0,LECIE1-LSCIE1
    .long L$set$0

( ] .long , .byte , .ascii и .quad заставляют ассемблер напрямую генерировать значение соответствующего типа). Затем следует сама таблица CIE:

LSCIE1:
    .long   0x0
    .byte   0x1
    .ascii "zR\0"
    .byte   0x1
    .byte   0x78
    .byte   0x10
    .byte   0x1
    .byte   0x10
    .byte   0xc
    .byte   0x7
    .byte   0x8
    .byte   0x90
    .byte   0x1
    .align 3
LECIE1:

Другой внешний символ, на этот раз для записи описания кадра функции main (все еще является частью информации об обработке исключений):

.globl _main.eh
_main.eh:

Опять же, FDE начинается с длины :

LSFDE1:
    .set L$set$1,LEFDE1-LASFDE1
    .long L$set$1

.. и продолжается с остальной частью таблицы FDE.

LASFDE1:
    .long   LASFDE1-EH_frame1
    .quad   LFB2-.
    .set L$set$2,LFE2-LFB2
    .quad L$set$2
    .byte   0x0
    .byte   0x4
    .set L$set$3,LCFI0-LFB2
    .long L$set$3
    .byte   0xe
    .byte   0x10
    .byte   0x86
    .byte   0x2
    .byte   0x4
    .set L$set$4,LCFI1-LCFI0
    .long L$set$4
    .byte   0xd
    .byte   0x6
    .align 3
LEFDE1:
    .subsections_via_symbols

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

11
ответ дан 13 December 2019 в 05:31
поделиться

есть несколько строк языка ассемблера. Другие - определения (все, что начинается с точки (.)), большинство из них - выделение памяти, остальные вы легко найдете в документации gcc.

LFB2:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    leave
    ret

это вход/выход из рамки стека.

1
ответ дан 13 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: