【问题标题】:Do memory addresses contain implicit hex digits?内存地址是否包含隐含的十六进制数字?
【发布时间】:2018-11-10 20:57:11
【问题描述】:

在 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

第二行的第一部分rip = 0x40052f in main (file.s:11) 我相信当我调用info frame 时说明了指令指针的值。但是为什么它保存的内存地址不是 12 位十六进制数字呢?

另外,如果我输入 (gdb) x 0x7fffffffd968(我希望是 0x7ffff7a2d830),我会得到:

0x7fffffffd968: 0xf7a2d830

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

【问题讨论】:

    标签: gdb memory-address


    【解决方案1】:

    没有。在 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 个字节。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2019-12-26
      • 2014-03-26
      • 2016-04-09
      • 1970-01-01
      • 2016-07-24
      相关资源
      最近更新 更多