Local em que as variáveis globais inicializadas ficam.
.data
Hello_ZEROED: .asciz "Hello World!!"
Hello_NO_ZEROED .ascii "Hello World!!"
Inteiro: .int 10
SHORT: .short 2
FLOAT: .float 3.14px
DOUBLE: .double. 2.341253234
Local em que as variáveis não inicializadas ficam.
.bss
some_static_global_var:
.lcomm 32
some_global_var:
.comm 32
Local em que as instruções do programa Ficam.
Local em que as variáveis locais da função atual ficam alocadas
int
main (void) { | push %rbp
int a = 1; | mov %rsp, %rbp
int b = 2; | sub 0x10, %rsp
int c = 3; |
int d = 4; | mov $0x01, -0x04(%rbp)
| mov $0x02, -0x08(%rbp)
| mov $0x03, -0x0c(%rbp)
return 0; | mov $0x04, -0x10(%rbp)
} |
| mov $0x00, %rax
|
| mov %rbp, %rsp
| pop %rbp
| ret
#prologo
push %rbp # salvando a base da pilha, na pulha.
mov %rsp, %rbp # Setando a nova base da pulha para o topo da antiga
sub $0x10, %rsp # alocando 4 inteiros (4*4 = 16 = 0x10)
mov $0x1, -0x4(%rbp) # atribuindo valores às variáveis
mov $0x2, -0x8(%rbp) # " "
mov $0x3, -0xc(%rbp) # " "
mov $0x4, -0x10($rbp) # " "
mov $0x0, %rax # zerando rax (retorno da função)
# epilogo
mov %rbp, %rsp # setando a topo da pilha igual a base
pop %rbp # restaurando base da natiga pilha que havia sido salva
ret # saltando para o endereço de retorno
.
.
mov $FMT_STR, %rdi # considerando STR_FMT = "%s\n"
mov $MSG, %rsi # considerando MSG = "Hello World!!"
call fpritnf
call addr
# /* Na realidade executa: */
push %rip
jmp address
/*int soma (int a, int b, int c);*/
xor %rax, %rax
mov -0x04(%rbp), %rdi #a
mov -0x08(%rbp), %rsi #b
mov -0x0c(%rbp), %rcx #c
call soma
mov %rax, %rcx #retorno da soma no rax