; Esta funcao faz o calculo de (A**2 + B**2) / (C**2). ; Suposicao: o resultado do calculo cabe em 16 bits. ; O resultado e' armazenado em ax. ; Os parametros de entrada C, B e A sao passados por meio ; da pilha. ; Variaveis locais usam memoria dinamicamente alocada. ; Versao para computadores de 64 bits ; ; int FUNC (int A, int B, int C) section .data ; Os parametros vem na pilha com os seguintes deslocamentos ; em relacao a EBP A: equ +16 B: equ +18 C: equ +20 ; Deslocamentos das variáveis locais temp1: equ -4 temp2: equ -6 temp3: equ -8 section .text _FUNC: push ebp ; salva a base da pilha mov ebp, esp ; e define uma nova base para a pilha da funcao push dx ; salva os registradores usados nesta funcao sub esp,6 ; abre espaço para variaveis locais mov ax,[ebp+A] ; copia A em AX imul word [ebp+A] ; A * A ; note que, para o montador, A e' uma constante que vale +4 mov [ebp+temp1],ax ; armazena A*A como uma variavel local mov ax, [ebp+B] ; copia B em AX imul word [ebp+B] ; B * B mov [ebp+temp2],ax ; armazena B*B localmente mov ax, [ebp+C] ; copia C em AX imul word [ebp+C] ; C * C mov [ebp+temp3],ax ; armazena C*C localmente mov ax,[ebp+temp1] ; obtem A*A add ax,[ebp+temp2] ; A*A + B*B idiv word [ebp+temp3] ; divide por C*C (resposta em AX) add esp,6 ; libera espaço das variaveis locais pop dx ; restaura o valor dos registradores pop ebp ; restaura a antiga base da pilha ret ; volta ao programa chamador global _start _start: ; chama FUNC (10, 20, 5) mov ax,5 ; empilha C push ax mov ax,20 ; empilha B push ax mov ax,10 ; empilha A push ax call _FUNC add esp,6 ; libera espaço dos parâmetros ; devolve o resultado que vem em ax chamando o nucleo do Linux mov ebx, eax ; primeiro parametro: exit code mov eax,1 ; numero da chamada ao sistema (sys_exit) int 80h ; executa a chamada ; o valor de retorno pode ser visto no bash com echo $?