Gdb 内存地址是否包含隐式十六进制数字?

Gdb 内存地址是否包含隐式十六进制数字?,gdb,memory-address,Gdb,Memory Address,64位计算机上小于12个十六进制数字的内存地址的值是多少 例如,当我在一个简单的汇编程序上运行gdb并运行(gdb)info frame时,我得到: Stack level 0, frame at 0x7fffffffd970: rip = 0x40052f in main (file.s:11); saved rip = 0x7ffff7a2d830 source language asm. Arglist at 0x7fffffffd960, args: Locals at 0x7

64位计算机上小于12个十六进制数字的内存地址的值是多少

例如,当我在一个简单的汇编程序上运行gdb并运行
(gdb)info frame
时,我得到:

Stack level 0, frame at 0x7fffffffd970:
 rip = 0x40052f in main (file.s:11); saved rip = 0x7ffff7a2d830
 source language asm.
 Arglist at 0x7fffffffd960, args: 
 Locals at 0x7fffffffd960, Previous frame's sp is 0x7fffffffd970
 Saved registers:
  rbp at 0x7fffffffd960, rip at 0x7fffffffd968
0x7fffffffd968: 0xf7a2d830
main(file.s:11)中第二行的第一部分
rip=0x40052f
我相信在调用
info frame
时说明了指令指针的值。但为什么它的内存地址不是12个十六进制数字

此外,如果我键入
(gdb)x 0x7fffffd968
(我希望是
0x7ffff7a2d830
),我会得到:


这是否意味着任何少于12个十六进制数字的内存地址都包含一个隐式的
7ff…

否。在x86或x86_64上,内存地址只是一个数字,但通常使用十六进制显示。和大多数数字符号系统一样,一个较短的数字只意味着一个更小的值,或者如果你愿意,在它前面有隐式的零

因此,就像十进制字符串“12”比“12654321”小得多一样,地址
0x40052f
比地址
0x7ffff7a2d830
小得多。这两个地址几乎肯定位于不同的虚拟内存映射中。(在Linux上,您可以通过
cat/proc/{pid}/maps
查看虚拟内存映射)

当您使用gdb
x
命令时,您没有看到预期的值,因为gdb猜测了您的地址指向的数据类型。第一次在gdb会话中使用
x
时,它默认为每个元素显示4个字节(32位),就像地址指向
uint32\t
数组一样。因为x86_64上的地址是8字节(64位),所以需要
x/g
告诉gdb元素大小是8字节