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.