Esta actividad no es para entregar.
Se tiene el siguiente programa en lenguaje C para un sistema x86-64:
01: #include <stdio.h> 02: 03: void super_punch(void) { 04: static int c = 0; 05: long s[2] = { 0xdeadbeaf, 0xcafebabe }; 06: s[3] += (c < 3 ? -15: 10); 07: c++; 08: } 09: 10: int main(void) { 11: puts("She loves you,"); 12: puts("yeah,"); 13: super_punch(); 14: puts("And you know you should be glad."); 15: return 0; 16: }
NOTA: Probablemente este programa funcione de manera errática y/o incorrecta en algunos sistemas.
En gdb
, después de colocar un breakpoint en la
línea 6 y correrlo, podemos inspeccionar el estado actual del programa
justo cuando se detiene en dicho breakpoint:
(gdb) p $rbp $1 = (void *) 0x7fffffffe030 (gdb) p &s[0] $2 = (long int *) 0x7fffffffe020 (gdb) x/2xg $rbp 0x7fffffffe030: 0x00007fffffffe040 0x0000000000400567 (gdb) x/4xg &s[0] 0x7fffffffe020: 0x00000000deadbeaf 0x00000000cafebabe 0x7fffffffe030: 0x00007fffffffe040 0x0000000000400567 (gdb) disassemble /m main Dump of assembler code for function main: 10 int main(void) { 0x000000000040054a <+0>: push %rbp 0x000000000040054b <+1>: mov %rsp,%rbp 11 puts("She loves you,"); 0x000000000040054e <+4>: mov $0x400670,%edi 0x0000000000400553 <+9>: callq 0x4003f0 <puts@plt> 12 puts("yeah,"); 0x0000000000400558 <+14>: mov $0x40067f,%edi 0x000000000040055d <+19>: callq 0x4003f0 <puts@plt> 13 super_punch(); 0x0000000000400562 <+24>: callq 0x4004f4 <super_punch> 14 puts("And you know you should be glad."); 0x0000000000400567 <+29>: mov $0x400688,%edi 0x000000000040056c <+34>: callq 0x4003f0 <puts@plt> 15 return 0; 0x0000000000400571 <+39>: mov $0x0,%eax 16 } 0x0000000000400576 <+44>: leaveq 0x0000000000400577 <+45>: retq End of assembler dump.
A partir de la información anterior, indica qué imprime el programa
(corriéndolo fuera de gdb
) y explica porqué se produce la
salida correspondiente.
La salida producida es:
She loves you, yeah, yeah, yeah, yeah,
La explicación queda como ejercicio.