#include <stdio.h>
int
funcB(int *ret)
{
int x = 10;
x += *ret;;
printf("%d\n", x);
return 0;
}
int
funcA(int x, int y)
{
int ret = 0;
ret = x + y;
funcB(&ret);
ret += 10;
return ret;
}
int
main(void)
{
int ret;
ret = funcA(10, 20);
printf("%d\n", ret);
return 0;
}
As per the assembly instruction, I was expecting that 'rbp' of funcB() will be the same as 'rsp' of funcA(). But that is not the case. Looks like 'rbp' of funcB is changed somewhere? Why is it so?
(gdb) b main
Breakpoint 1 at 0x4005a6: file tmp.c, line 26.
(gdb) b funcA
Breakpoint 2 at 0x400572: file tmp.c, line 15.
(gdb) b funcB
Breakpoint 3 at 0x400539: file tmp.c, line 6.
(gdb) run
Starting program: /nobackup/ibhattac/code/./a.out
Breakpoint 1, main () at tmp.c:26
26 ret = funcA(10, 20);
(gdb) info reg rsp
rsp 0x7fffffffdd00 0x7fffffffdd00
(gdb) info reg rbp
rbp 0x7fffffffdd10 0x7fffffffdd10
(gdb) c
Continuing.
Breakpoint 2, funcA (x=10, y=20) at tmp.c:15
15 int ret = 0;
(gdb) info reg rsp
rsp 0x7fffffffdcd0 0x7fffffffdcd0
(gdb) info reg rbp
rbp 0x7fffffffdcf0 0x7fffffffdcf0
(gdb) c
Continuing.
Breakpoint 3, funcB (ret=0x7fffffffdcec) at tmp.c:6
6 int x = 10;
(gdb) info reg rsp
rsp 0x7fffffffdca0 0x7fffffffdca0
(gdb) info reg rbp
rbp 0x7fffffffdcc0 0x7fffffffdcc0 >>> Why this is not same as 'rsp' of funcA()
Does 'rsp' of funcA() change to make space for push %rbp and the return instruction counter?
Does that mean leaveq in funcB() modifies rbp and only then load it to rsp?
(gdb) disassemble funcB
Dump of assembler code for function funcB:
0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: sub $0x20,%rsp
0x0000000000400535 <+8>: mov %rdi,-0x18(%rbp)
0x0000000000400539 <+12>: movl $0xa,-0x4(%rbp)
0x0000000000400540 <+19>: mov -0x18(%rbp),%rax
0x0000000000400544 <+23>: mov (%rax),%eax
0x0000000000400546 <+25>: add %eax,-0x4(%rbp)
=> 0x0000000000400549 <+28>: mov -0x4(%rbp),%eax
0x000000000040054c <+31>: mov %eax,%esi
0x000000000040054e <+33>: mov $0x400670,%edi
0x0000000000400553 <+38>: mov $0x0,%eax
0x0000000000400558 <+43>: callq 0x400410 <printf@plt>
0x000000000040055d <+48>: mov $0x0,%eax
0x0000000000400562 <+53>: leaveq
0x0000000000400563 <+54>: retq
End of assembler dump.