rbp: 0x7fffffffdd00
rbp-14: 0x7fffffffdcf2
C语言代码:
int *p=(int *)0x7fffffffdcf0;
rax(保存了0x7fffffffdcf2): 0x7fffffffdcec *0x7fffffffdcec=5
0x7fffffffdcec就是rbp -14的值, 0x14
0x7fffffffdcf2是rbp-14 14是10进制
注意: gdb print $rbp-14是10进制, 而汇编代码是0x14
rax:0x7fffffffdcec
rbp - 0x14: 0x7fffffffdcec
rbp -0x10: 0x7fffffffdcf0
C语言代码:
int *p=(int *)0x7fffffffdcf0;
反汇编代码:
Dump of assembler code for function main:
0x00000000004004d6 <+0>: push %rbp
0x00000000004004d7 <+1>: mov %rsp,%rbp
0x00000000004004da <+4>: movabs $0x7fffffffdcf0,%rax
0x00000000004004e4 <+14>: mov %rax,-0x8(%rbp)
=> 0x00000000004004e8 <+18>: mov $0x0,%eax
0x00000000004004ed <+23>: pop %rbp
0x00000000004004ee <+24>: retq
End of assembler dump.
(gdb) print /x $rax
$48 = 0x7fffffffdcf0
(gdb) print $rbp-0x8
$32 = (void *) 0x7fffffffdcf8
问题: 为什么print $rbp-0x8之后,是0x7fffffffdcf8???
$rax 之类的不是输出寄存器的值么, 为啥不是0x7fffffffdcf0???
(
(gdb) print /x *0x7fffffffdcf8
$46 = 0xffffdcf0 #rbp-0x8只保留了0x7fffffffdcf0的低八位
(gdb) print $rax
为啥只保留了低八位??
再看下一个案例
0x0000000000400546 <+0>: push %rbp
0x0000000000400547 <+1>: mov %rsp,%rbp
0x000000000040054a <+4>: sub $0