assembly - 一个地址有多少字节?

标签 assembly memory

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

最佳答案

您的问题与this one相关.

Or does it depend on the architecture?

是的。这取决于架构:

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

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

TMS320 DSP 是一个 CPU 示例,其中一个地址代表16 位

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

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

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

还有一些内存类型并非所有地址都存在。这可能看起来如下:

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

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

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

外围设备的内存通常就是这种情况 - 例如某些微 Controller 中的以太网 Controller 的内存。

据我所知,我见过 PC 上的 PCI SCSI Controller 也表现出这种行为。将该 SCSI Controller 安装到您的 64 位计算机中,您的计算机将包含一定范围的地址,其中所有地址的 25% 代表 32 位数据,而所有地址的 75% 根本不代表任何数据。

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

顺便说一下:

On a 64bit machine, we know that an address is 8 bytes.

即使这也不一定是真的:

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

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

关于assembly - 一个地址有多少字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56717135/

相关文章:

c++ - 在 C++ 或程序集 (FASM) 中将原始字节转换为十六进制

assembly - MIPS 中如何处理五个或更多参数?

c - 分配内存的地址取决于什么?

java - 我应该在循环中重新定义或重新分配变量吗?

assembly - 使用 LLDT 并为其配置 GDT

c++ - 为什么 GCC 调用 libc 的 sqrt() 而不使用它的结果?

c - 写入二维数组时出现段错误

c - malloc(sizeof(int)) vs malloc(sizeof(int *)) vs (int *)malloc(sizeof(int))

c - 仅使用现有代码执行任意代码

assembly - 如何在 DOS 程序集中正确 Hook 中断 28h,并恢复它?