Você está na página 1de 8

Programação em Assembly

IA-32
Protocolo de chamada a funções
Protocolo de chamada a funções
• Passagem de parâmetros
• Retorno de valores
• Alojamento de variáveis locais
• Preservação de registos do processador
• Conceito de stack-frame
Passagem de parâmetros
• Através de stack
– Ordem: 1.º parâmetro no endereço mais
baixo (convenção VPL)
– Alinhamento: O espaço ocupado é sempre
múltiplo de 4 bytes
• Se for char ou short é colocado nas posições de
menor peso do espaço reservado
– Desalojamento (ajuste de stack): da
responsabilidade do chamador
Gestão do espaço dos argumentos
• O chamador tem que
– colocar os argumentos em stack antes de chamar
– libertar o espaço após o retorno
• Há dois métodos
– Empilhamento e ajuste local
• Empilha os argumentos com (PUSH ... PUSH ... etc.)
• Chama a função (CALL ...)
• Liberta o espaço ocupado (ADD ESP, ...)
– Alojamento permanente
• No início, a função aloja espaço para a maior lista de argumentos
que vai usar (SUB ESP, ...)
• Antes de cada chamada, afecta os valores
(MOV [ESP+...], ... MOV [ESP+...], ... )
• Após cada chamada não faz qualquer ajuste
• No final, liberta o espaço ocupado (ADD ESP, ...)
Retorno de valores
• Em registo – inteiros ou ponteiros
– EAX
– EDX:EAX

• Na unidade de vírgula flutuante (FPU) – float ou double


– Topo do stack interno à FPU

• Em memória – tipos struct


– A memória é reservada pelo chamador
– O endereço é passado no primeiro parâmetro (escondido)
– O endereço é também devolvido em EAX
Preservação de registos
• Preservados
– EIP, ESP, EBP
• São necessariamente modificados, sendo, por isso
armazenados em stack e repostos no final
– EBX, ESI, EDI
• Se forem modificados, têm que ser armazenados
em stack e repostos no final
• Não preservados
– EAX, ECX, EDX
– Flags
Variáveis locais
• Em registos, se suficientes
– Quaisquer registos disponíveis, se a função não chama outras
– Registos preservados, se a função chama outras (que podem
modificar os não preservados)
• Em memória de stack
– Assegura a criação de instâncias independentes no caso de
execução recursiva
– Para reservar espaço, o registo ESP é subtraído da quantidade
de bytes necessária, indicando esse espaço como ocupado
– A reserva de espaço é alinhada
• Obrigatoriamente a múltiplos de 4 bytes
• Tipicamente a múltiplos de 16 bytes, para favorecer o desempenho
da memória de cache
Stack-frame
• É a área de memória em stack associada a um contexto
de execução de cada função
• Tem uma referência de endereço permanente
– Registo EBP
• Organiza, dos endereços superiores para os inferiores
– O acesso aos parâmetros (MOV ..., [ EBP + ... ])
– O armazenamento dos registos preservados da função
chamadora
– O alojamento de variáveis locais (acesso: MOV ..., [EBP - ... ])
– O alojamento das listas de argumentos para chamar outras
funções

Você também pode gostar