Para resumir função como um exemplo
int sum(int a,int b)
{
return a+b;
}
Seu código de montagem
.text
.global sum
sum:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
addl 12(%ebp),%eax
leave
ret
Em seguida, a função principal
int main(void)
{
int a;
int b=12;
int c=24;
a=sum(b,c);
return 0;
}
código assembler para
.text
.global main
main:
pushl %ebp
movl %esp,%ebp
subl $12,%esp
movl $12,-8(%ebp)
movl $24,-12(%ebp)
pushl -12(%ebp)
pushl -8(%ebp)
call sum
addl $8,%esp
movl %eax,-4(%ebp)
movl $0,%eax
leave
ret
As variáveis locais são usadas para aplicar subi US $ 12,% esp no espaço de pilha aplicativo para segurar a 12 bytes a, b, c. um é -4 (% ebp), b é -8 (% ebp), e assim por diante.
Register convenções de uso
de acordo com a prática estabelecida, o registo% eax,% edx,% ecx registo é dividido chamador salva. Quando o procedimento chama p q, q pode substituir esses registros, sem interromper quaisquer dados desejado p. Por outro lado, o% ebx registo,% ESI,% edi chamador é dividido em uma economia de registo. Isso significa q deve ser coberto antes destes registos, salvá-los primeiro para a pilha e restaurá-los antes de retornar, caso esses valores podem ser necessários no futuro para p computação.