section .text

global _start

_start:

push 4       ;a pilha decresce 8 bytes, esse será o endereço mais profundo na pilha  
push 5       ;a pilha decresce + 8 bytes = 16 bytes
call soma    ;ao chamar a função soma, o S.O. salvará o endereço da proxima instrução, para poder voltar, +8 bytes
mov rcx,rax  ;                                                     <--------|        
mov eax,1                  ; exit(0)
mov ebx,0
int 0x80

;                                                                             |Var Locais, se existir |   ...
;                                                                             |Var Locais, se existir |  BP - 16
soma:                                                                        ;|Var Locais, se existir |  BP - 8    
  ;ao chegar aqui já guardou o endereço de retorno (RIP) na pilha, 8 bytes    |      BP Antigo        |  <-BP,SP   o novo BP aponta para a posicao do BP salvo 
  push rbp        ;guarda bp antigo, decresce 8 bytes                         |       Retorno         |  BP+8
  mov rbp,rsp     ;bp é o ponteiro base (referência), o sp fica à vontade     |          5            |  BP+16
  mov rax,[rbp+24]    ;1o arg                                                 |          4            |  BP+24
  add rax,[rbp+16]    ;2o arg                                                 |          ?            |   ...  
  mov rsp,rbp     ;recupera o valor de sp                                     |          ?            |   ...
  pop rbp         ;recupera valor anterior de bp                              |          ?            |   ... 
ret  16        ;SP = SP+16, é como fazer pop 5, pop 4
