一个地址有多少字节?

use*_*897 0 memory assembly

在 64 位机器上,我们知道一个地址是 8 个字节。但是,我并不完全清楚一个地址中有多少字节的信息。虚拟内存中的每个字节都有地址吗?或者内存中的每 64 位都有一个地址?还是取决于架构?如果它取决于架构,那么我应该如何找出?

Mar*_*nau 5

您的问题与 这个

还是取决于架构?

是的。这取决于架构:

对于大多数 CPU,一个地址代表8 位

内存中的每个字节都有一个单独的地址。

TMS320 DSP为CPU,其中一个地址表示的示例的16位

这意味着每个 16 位字 (uint16内存中的 ) 都有一个单独的地址。

还有一些计算机(其中许多是历史的),其中每个地址代表121314162436 位(也许甚至更多)...

(不幸的是,我不知道使用 64 位地址而不使用每个地址 8 位的 CPU 的示例,但我很确定这样的 CPU 也存在。)

然后是不是所有地址的内存类型存在的。这可能如下所示:

可被 4 整除的地址代表32 位信息;不能使用其他地址 - 这意味着这些地址不代表任何信息

所以地址的“平均值”是 8 位,但没有代表 8 位的地址。

通常,您会在安装了两种不同类型内存的计算机中看到这种行为,一种类型允许 8 位和 32 位访问,而另一种类型只允许 32 位访问。

外围设备的存储器通常就是这种情况——例如某些微控制器中以太网控制器的存储器。

据我记得正确,我见过一个用于 PC 的 PCI SCSI 控制器也显示出这种行为。将该 SCSI 控制器安装到您的 64 位计算机中,您的计算机包含一些地址范围,其中所有地址的 25% 代表 32 位数据,而所有地址的 75% 根本不代表任何数据。

我还见过由大学学生设计的 CPU,其中“商业原版”允许对内存进行 8 位和 32 位访问,但学生的复制品仅允许 32 位访问。在这种情况下,整个地址范围都显示了这种行为。

顺便一提:

在 64 位机器上,我们知道一个地址是 8 个字节。

甚至这也不一定是真的:

据我所知,x86-64 CPU 只使用 48 位地址。因此,编译器制造商可以将每个地址存储在仅 6 个字节的内存中。

当然,嵌入式设备的 CPU 内核可以设计为使用 x86-64 指令集的子集,但通常保存地址(例如rsp)的寄存器只有 48 位宽。


归档时间:

查看次数:

3200 次

最近记录:

6 年,4 月 前