Я скомпилировал следующую C функцию, чтобы увидеть, как нелокальные переменные обрабатываются в asm:
int a=1;
int b=2;
int main() {
int c = 3;
return a+b+c;
}
Компиляция с помощью $ gcc file.c -S
дает мне:
.file "isec.c"
.globl a
.data
.align 4
.type a, @object
.size a, 4
a:
.long 1
.globl b
.align 4
.type b, @object
.size b, 4
b:
.long 2
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
Меня немного смущает порядок перечисленных выше пунктов LFB0
. Например, почему не просто:
a: .long 1
b: .long 2
Для чего все остальное? И, если он собирается перечислить кучу глобальных переменных, почему он не делает что-то вроде:
.globl a
.globl b
.globl main
Я думаю, я смущен порядком и почему верхние разделы организованы так, как они .
Я невероятно новичок в asm, но я предполагаю, что, как я думаю, он будет скомпилирован следующим образом:
.globl a
.globl b
.globl main
a: .long 1
b: .long 2
main:
mov a(%rip), %eax
add b(%rip), %eax
add $3, %eax
ret
Кроме того, требуется ли a
и b
глобальный? (Какой смысл делать global? Все, что я могу сказать, это требуется для основной функции).