2015-06-03 219 views
3

我的电脑是64位的mac。我的64位机器每个内存位置只能存储4个字节

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

当我在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。

感谢

回答

8

每个内存位置只能存储八位,是因为内存字节寻址。 64位机器在每个存储器位置都不会给你64位,它只是意味着它一次可以自然处理64位数据。

例如,寄存器是64个位宽(除非有意操纵子寄存器像axeax代替64位rax),并且可以从存储器用一条指令装入许多比特。

你可以看到,它的字节寻址的事实,你的两个地址有四个它们之间的区别:

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

,如果你使用基于字节的输出,你会看到更多的“自然”,如:

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

因此,在0x7ffff661c02064位值是实际上0x00007ffff661b020如预期,你只需要调整gdb命令把它作为一个完整的64位值,是这样的:

x/1xg first 

其中1xg意味着一个值,十六进制格式,巨字(八个字节)。在x命令的详细信息,可以发现here,为您的问题重要的一点是单位的大小(我的粗体)的说明:

  • b =字节。
  • h =半字(两个字节)。
  • w =单词(四个字节)。 这是初始默认值。
  • g =巨词(八个字节)。
+0

谢谢,真的有帮助。我甚至怀疑我的代码完全错误。 –

+0

小问题,目前有些处理器不是“字节可寻址”的处理器,它们往往是嵌入式处理器(例如DSP),在这种处理器中,每桶滚筒是一块非常大的硅片(例如乘以一千个处理器)。 – user3710044

3

似乎只有4个字节商店0x7ffff661c020

不,你问过GDB给你存储在位置0x7ffff661c020 4个字节,所以这也正是它给了你。试试这个:

(gdb) x/gx 0x7ffff661c020