Вставляемый ниже не оптимизирован вывод блока 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
Скажите компоновщику, чтобы он поместил это в раздел исполняемого файла .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
Эти таблицы обработки исключений в основном неинтересны, но если вы хотите знать, информация о формате доступна здесь .
есть несколько строк языка ассемблера. Другие - определения (все, что начинается с точки (.)), большинство из них - выделение памяти, остальные вы легко найдете в документации gcc.
LFB2:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
leave
ret
это вход/выход из рамки стека.