【问题标题】:Memory, Stack and 64 bit内存、堆栈和 64 位
【发布时间】:2013-01-24 14:37:33
【问题描述】:

在 x86 系统上,一个内存位置可以保存 4 个字节 (32 / 8) 的数据,因此 64 位系统中的单个内存地址可以为每个内存地址保存 8 个字节。当检查 GDB 中的堆栈时,尽管情况似乎并非如此,例如:

0x7fff5fbffa20: 0x00007fff5fbffa48  0x0000000000000000
0x7fff5fbffa30: 0x00007fff5fbffa48  0x00007fff857917e1

如果我有这个权利,那么每个十六进制对 (48) 都是一个字节,因此是第一个内存地址 0x7fff5fbffa20:实际上保存的是16字节的数据,而不是8字节。

这让我非常困惑并且已经有一段时间了,所以绝对非常感谢任何输入。

【问题讨论】:

    标签: macos gdb 64-bit x86-64 memory-address


    【解决方案1】:

    简短的回答:在 x86 和 x64 上,最小可寻址实体都是一个字节:在每种情况下,每个“内存位置”都包含一个字节。您从 GDB 看到的只是格式化:它正在转储 16 个连续字节,因为地址从 ....20 增加到 ....30,(在左侧)表明。

    长答案:在架构中,32 位或 64 位用于表示许多东西:几乎总是可寻址大小(地址中有多少位 = 您可以直接寻址多少内存 - 再次,字节 内存)。它通常还指示寄存器的尺寸,以及(但不总是)本机字长。 这意味着通常,即使您可以寻址单个字节,机器也可以使用不同(更长)大小的数据“更好地”工作。 “更好”的含义是毋庸置疑的;不过,了解一些背景知识有助于理解问题中对字数大小的一些误解。

    【讨论】:

    • 好的,如果显示 16 个字节,为什么它会从 20 增加到 30?当然它应该从 20 增加到 36?为什么 GDB 显示 16 个字节,我的意思是有什么特别的原因还是只是为了让它更容易阅读?
    • @JamesParker 20-30 = 10,十六进制,或 16 十进制
    • @JamesParker 是的,它以 16 个为一组显示,以便于阅读。你甚至可以改变它:例如,如果你用“x”打印内存内容,你可以指定如何表示它(delorie.com/gnu/docs/gdb/gdb_56.html
    • 啊,太棒了。非常感谢那些清理了很多东西的人:)
    • “奇怪”的示例:) 架构:80286(16 位芯片,24 位寻址)或摩托罗拉 68000 和 Intel 386SX,它们是相反的(32 位寄存器和字长,24 位寻址)
    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 2011-06-13
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2020-10-10
    相关资源
    最近更新 更多