La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Ejemplo didáctico – Convención de Llamada a Funciones ANSI C: _CDECL.

Presentaciones similares


Presentación del tema: "Ejemplo didáctico – Convención de Llamada a Funciones ANSI C: _CDECL."— Transcripción de la presentación:

1 Ejemplo didáctico – Convención de Llamada a Funciones ANSI C: _CDECL

2 Nota: Se recomienda ver esta presentación teniendo a mano una copia de la convención de llamadas _CDECL, o en su defecto del apunte de cátedra.

3 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp retmain.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } Cómo compilar: nasm –f elf funciones.asm –o funciones.o gcc –c main.c –o main.o ld –oformat elf main.o funciones.o –o suma. a b c

4 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESP EBP Dirección de crecimiento del Stack c b a

5 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESP EBP Dirección de crecimiento del Stack 1 EIP (APROX)

6 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESP EBP Dirección de crecimiento del Stack EIP (APROX) 1 Y=5

7 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESP EBP Dirección de crecimiento del Stack EIP (APROX) Y=5 X=2

8 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESP EBP Dirección de crecimiento del Stack EIP (APROX) 2 Y=5 X=2 EIP del main

9 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESP EBP Dirección de crecimiento del StackEIP Y=5 X=2 EIP del main EBP del main 3

10 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESP EBP Dirección de crecimiento del StackEIP Y=5 X=2 EIP del main EBP del main 4

11 Y=5 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESPEBP Dirección de crecimiento del StackEIP X=2 EIP del main EBP del main EBP EAX= 2

12 EAX= Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESPEBP Dirección de crecimiento del StackEIP X=2 EIP del main EBP del main EBP + 12 Y=5 6

13 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESPEBP Dirección de crecimiento del StackEIP X=2 EIP del main EBP del main 7 EAX= 7

14 Y=5 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } ESP EBP Dirección de crecimiento del StackEIP X=2 EIP del main 8 EAX= 7 ---BASURA---

15 Y=5 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x, y,z); } ESP Dirección de crecimiento del StackEIP X=2 EIP del main EBP EAX= 7 ---BASURA---

16 Y=5 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x, y,z); } ESP EBP Dirección de crecimiento del StackEIP X=2 9 EAX= 7 ---BASURA---

17 Y=5 Ejemplo sencillo – sumar dos enteros. funciones.asm GLOBAL sumar sumar: pushebp movebp, esp moveax,[ebp+8] addeax,[ebp+12] movesp, ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x, y,z); } ESP EBP Dirección de crecimiento del Stack EIP X=2 10 EAX= 7

18 Ahora continúa la ejecución de la función llamadora.

19 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret main.c extern int sumar(int x, int y); void main (void) { int x=2, y=5, z; z = sumar(x, y); printf("x = %d, y = %d, z = %d \n",x,y,z); } 1

20 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP ESP EBP 2

21 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP ESP EBP

22 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP ESP EBP 2

23 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP ESP EBP EBX val. original 3

24 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP ESP EBP 4 EBX val. original EBX= 2

25 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP ESP EBP EBX val. original EBX= 2 EBP + 8

26 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP ESP EBP EBX val. original 7 EBX= EBP + 12

27 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP ESP EBP EBX val. original 7 EBX= EBP - 4 5

28 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP ESP EBP 6 EBX val. original 7 EBX= 7 EAX= 7

29 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP ESP EBP EBX val. original 7 EBX= 7 EAX= 7

30 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP EBP 7 7 ESP EBX= XXXX EAX= 7

31 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP EBP 7 ESP EBX= XXXX EAX= 7

32 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP 8 7 ESP EBP

33 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP 7 EBP ESP

34 Ejemplo sencillo – sumar dos enteros. Ahora utilizando variables locales al stack funciones.asm global sumar sumar: pushebp movebp,esp subesp,4 pushebx movebx,[ebp+8] addebx,[ebp+12] mov[ebp-4],ebx moveax,[ebp-4] popebx movesp,ebp popebp ret Hacia direcciones inferiores de la memoria... 0x0000h 0x14h 0X18h 0X1Ch 0X20h 0x24h 0x28h 0X2Ch Variables locales al main Hacia direcciones superiores de la memoria... 0xffffh Dirección de crecimiento del Stack X=2 EIP del main EBP del main Y=5EIP 9 ---BASURA--- ESP EBP 10

35 Su pregunta no molesta!!!!!


Descargar ppt "Ejemplo didáctico – Convención de Llamada a Funciones ANSI C: _CDECL."

Presentaciones similares


Anuncios Google