【问题标题】:My 64 bit machine can only store 4 bytes each memory location我的 64 位机器每个内存位置只能存储 4 个字节
【发布时间】:2015-08-17 01:11:13
【问题描述】:

我的电脑是 64 位 mac。

在内存中的这些位置之一中存储了多少字节的信息?

当我在 gdb 中尝试某些东西时

x /2x first
0x7ffff661c020: 0xf661b020      0x00007fff 

我的代码是

#define PUT(p, val) (*((size_t *)(p)) = (val))
PUT(first, (size_t)some pointers);

我使用 gcc -g 编译

似乎只有 4 个字节存储在 0x7ffff661c020 中。 0x00007fff存储在 0x7ffff661c024 中。为什么它不能在 0x7ffff661c020 中存储 0x00007ffff661b020。

谢谢

【问题讨论】:

    标签: c memory gdb 64-bit 32bit-64bit


    【解决方案1】:

    每个内存位置只能存储八位,因为内存是字节可寻址的。 64 位机器不会在每个内存位置为您提供 64 位,它只是意味着它可以自然地一次处理 64 位。

    例如,寄存器是 64 位宽(除非您有意操作像 axeax 这样的子寄存器,而不是 64 位 rax),您可以使用单个说明。

    您可以看到它是字节可寻址的,因为您的两个地址之间相差 4:

    0x7ffff661c020: 0xf661b020
    0x7ffff661c024: 0x00007fff
                  \____________/ four-byte
                               \ difference
    

    而且,如果您使用基于字节的输出,您会更“自然”地看到它,例如:

    (gdb) x/8xb first
    0x7ffff661c020: 0x20 0xb0 0x61 0xf6 0xff 0x7f 0x00 0x00
    

    所以0x7ffff661c020 处的 64 位值 实际上是 0x00007ffff661b020,正如预期的那样,您只需调整 gdb 命令即可将其作为完整的 64 位值输出,类似:

    x/1xg first
    

    其中1xg 表示一个值,十六进制格式,巨字(八个字节)。 x 命令的详细信息可以找到here,您的问题的重要一点是单位大小的描述(我的粗体):

    • b = 字节。
    • h = 半字(两个字节)。
    • w = 字(四个字节)。 这是初始默认设置。
    • g = 巨字(八字节)。

    【讨论】:

    • 谢谢,真的很有帮助。我什至怀疑我的代码完全错误。
    • 次要的一点,今天有一些处理器不是“字节可寻址”的,它们往往是嵌入式处理器(例如 DSP),其中每桶滚动是一块非常大的硅片(乘以一千例如处理器)。
    【解决方案2】:

    0x7ffff661c020 中好像只存储了 4 个字节

    不:你已经要求 GDB 给你 4 个字节存储在位置 0x7ffff661c020,所以这正是它给你的。试试这个:

    (gdb) x/gx 0x7ffff661c020
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-21
      • 2021-03-04
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 2019-02-21
      相关资源
      最近更新 更多