Búsqueda personalizada

Anuncios Google

Procedimientos

Pase de parámetros por valor

El siguiente es un programa con una función que calcula el cuadrado de un número entero. Paso de un parámetro por valor. Retorna el resultado como un entero.

Programa en C:

#include <stdio.h>

int cuadrado(int x);

int t=10;

int s;

main()

{

s=cuadrado(t);

printf("cuadrado: %d\n", s);

}

int cuadrado(int x)

{

x=x*x;

return x;

}

Programa en ensamblador

.section .data
t: .long 10
formato: .asciz "cuadrado: %d\n"
.section .text
.globl _start
_start:
pushl t # se apila el parámetro t
call cuadrado # llamada al procedimiento
addl $4, %esp # limpieza de la pila (4 bytes)
pushl %eax # mostrar el resultado por pantalla
pushl $formato
call printf
movl $1, %eax # fin del programa
movl $0, %ebx
int $0x80
cuadrado: pushl %ebp # preserva marco de pila anterior
movl %esp, %ebp # actualiza marco de pila
movl 8(%ebp), %eax # obtiene el parámetro
imull %eax, %eax # calcula x². Resultado en %eax
leave
ret

Estado de la pila

Se denotan los cambios en las direcciones sólo con un desplazamiento a partir de la dirección inicial de %ebp.

pushl t (apilar el parámetro)

%ebp %esp Dirección Contenido
-4 t
0

call cuadrado (llamada al procedimiento

%ebp %esp Dirección Contenido
-8 dirección de retorno
-4 t
0

pushl %ebp (preservar marco de pila)

%ebp %esp Dirección Contenido
-12 %ebp=0
-8 dirección de retorno
-4 t
0

movl %esp, %ebp (actualizar marco de pila)

%ebp %esp Dirección Contenido
-12 %ebp=0
-8 dirección de retorno
-4 t
0

movl 8(%ebp), %eax (obtiene el parámetro)

%ebp %esp Dirección Contenido
-12 %ebp=0
-8 dirección de retorno
-4 t
0

leave es equivalente a dos instrucciones: movl %ebp, %esp y popl %ebp

movl %ebp, %esp

%ebp %esp Dirección Contenido
-12 %ebp=0
-8 dirección de retorno
-4 t
0

popl %ebp

%ebp %esp Dirección Contenido
-12 %ebp=0
-8 dirección de retorno
-4 t
0

ret

%ebp %esp Dirección Contenido
-12 %ebp=0
-8 dirección de retorno
-4 t
0

addl $4, %esp

%ebp %esp Dirección Contenido
-12 %ebp=0
-8 dirección de retorno
-4 t
0