глобальные вары в c в asm - PullRequest
       168

глобальные вары в c в asm

0 голосов
/ 04 августа 2020

Я скомпилировал следующую 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? Все, что я могу сказать, это требуется для основной функции).

...