我的 64 位机器每个内存位置只能存储 4 个字节
My 64 bit machine can only store 4 bytes each memory location
我的电脑是 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编译
0x7ffff661c020 中似乎只有4 个字节存储。 0x00007fff
存储在 0x7ffff661c024。为什么它不能在 0x7ffff661c020 中存储 0x00007ffff661b020。
谢谢
每个内存位置只能存储八位,因为内存是字节寻址的。 64 位机器不会在每个内存位置都给你 64 位,它只是意味着它可以自然地一次处理 64 位。
例如,寄存器是 64 位宽(除非你有意操作子寄存器,如 ax
或 eax
而不是 64 位 rax
),你可以加载一条指令从内存中提取那么多位。
您可以看到它是字节可寻址的,因为您的两个地址之间相差四:
0x7ffff661c020: 0xf661b020
0x7ffff661c024: 0x00007fff
\____________/ four-byte
\ difference
并且,如果您使用基于字节的输出,您会看到更多 "naturally",例如:
(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
= 巨字(八个字节)。
It seems that only 4 bytes store in 0x7ffff661c020
不:您已要求 GDB 为您提供存储在位置 0x7ffff661c020
的 4 个字节,所以这正是它给您的。试试这个:
(gdb) x/gx 0x7ffff661c020
我的电脑是 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编译
0x7ffff661c020 中似乎只有4 个字节存储。 0x00007fff
存储在 0x7ffff661c024。为什么它不能在 0x7ffff661c020 中存储 0x00007ffff661b020。
谢谢
每个内存位置只能存储八位,因为内存是字节寻址的。 64 位机器不会在每个内存位置都给你 64 位,它只是意味着它可以自然地一次处理 64 位。
例如,寄存器是 64 位宽(除非你有意操作子寄存器,如 ax
或 eax
而不是 64 位 rax
),你可以加载一条指令从内存中提取那么多位。
您可以看到它是字节可寻址的,因为您的两个地址之间相差四:
0x7ffff661c020: 0xf661b020
0x7ffff661c024: 0x00007fff
\____________/ four-byte
\ difference
并且,如果您使用基于字节的输出,您会看到更多 "naturally",例如:
(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
= 巨字(八个字节)。
It seems that only 4 bytes store in 0x7ffff661c020
不:您已要求 GDB 为您提供存储在位置 0x7ffff661c020
的 4 个字节,所以这正是它给您的。试试这个:
(gdb) x/gx 0x7ffff661c020