内存地址中的位

Posted

技术标签:

【中文标题】内存地址中的位【英文标题】:Bits in a memory address 【发布时间】:2011-04-18 17:06:38 【问题描述】:

在使用 immunity 调试器在 Windows XP 32 位上进行调试时,我在堆栈上看到以下内容:

_Address_ -Value_
00ff2254 ff090045
00ff2258 00000002

我的理解是每个地址位置都包含8位。

这对吗?

【问题讨论】:

请注意,人们通常只能回答您实际提出的问题。 【参考方案1】:

如果我正确理解您的问题,答案是肯定的,每个单独的内存位置都包含 8 位。

调试器一次显示 4 个字节(32 位),以使显示更紧凑(而且由于许多数据类型占用 32 位,因此查看 32 位值通常很有用)。这就是左列中的地址相隔 4 个位置的原因。

如果调试器一次显示一个字节(8 位),则显示如下:

_Address_ -Value_
00ff2254 45
00ff2255 00
00ff2256 09
00ff2257 ff
00ff2258 02
00ff2259 00
00ff225a 00
00ff225b 00

(假设您使用的是“little-endian”机器,大多数现代台式电脑都是。)

【讨论】:

【参考方案2】:

我认为您的问题的主要问题是您要求一件事,但我发现潜伏在阴影中的另一个问题。

首先,计算机内存中的可寻址实体被组织为字节,每个字节为 8 位,所以是的,每个地址可以说是指 8 位或一个字节。

但是,您可以轻松地将更多字节组合在一起以形成更大、更复杂的数据结构。

如果您的问题确实是“为什么我在堆栈转储中的某个地址处看到一个 8 位值作为内容”,那么原因是它转储了 32 位(4 字节)值。

换句话说,您可以获取地址、地址+1、地址+2 和地址+3,从中获取每个字节,然后组合成一个 32 位值。

这真的是你的问题吗?

【讨论】:

【参考方案3】:

要完成 RH 的答案,您可能会惊讶于给定地址有这么多数字。

你应该考虑

Address  Byte (8 bits)
00ff2254 45
00ff2255 00
00ff2256 09
00ff2257 ff
00ff2258 02
... 

(在 XP 使用的 cpu 架构上)

【讨论】:

那么我可以进一步提出我的问题吗?为什么每个地址都包含 8 位。是因为内存芯片架构吗?或者是因为32位CPU。这 8 位是否适用于其他操作系统,例如 FreeBSD、Mac、Linux? 8 位或字节,是计算机中常用且方便的数据单位 (en.wikipedia.org/wiki/Byte)。方便,因为作为 2(2^3 位)的幂,它足够小,同时能够存储所有罗马字符。 8 位是您可以从内存中获取的最小数据量。具有 32 位内存总线的计算机允许在一次操作中检索 32 位 - 它更快 - 但最小数据单元仍然是 8 位。【参考方案4】:

内存位置指的是内存的一个位置,每个连续的内存位置指的是内存中的下一个字节。所以,你只能在一个字节的边界上寻址内存,每个人都应该知道一个字节是 8 位宽的。

【讨论】:

以上是关于内存地址中的位的主要内容,如果未能解决你的问题,请参考以下文章

「linux」物理地址,虚拟地址,内存管理,逻辑地址之间的关系

内存寻址能力与CPU的位宽有关系吗?

虚拟内存或物理内存

大端对齐和小端对齐

信息的标识和处理

寄存器