【发布时间】:2020-12-10 05:53:52
【问题描述】:
在 32 位架构中,指针的长度为 4 字节,双精度的长度为 8 字节。但是,为什么在这种架构中,指针不是像 double 那样的 8 字节长度? 这将允许更广泛的寻址,如 64 位架构!
【问题讨论】:
标签: memory architecture
在 32 位架构中,指针的长度为 4 字节,双精度的长度为 8 字节。但是,为什么在这种架构中,指针不是像 double 那样的 8 字节长度? 这将允许更广泛的寻址,如 64 位架构!
【问题讨论】:
标签: memory architecture
是的,你试图在无法概括的地方概括。
您必须查看每个特定的处理器架构。您必须查看可以执行基于寄存器寻址的指令,无论架构使用什么术语,寄存器间接或其他。我的处理器可能有 32 位通用寄存器,所有读取和写入/加载和存储事务都必须使用通用寄存器,所以从表面上看,我的处理器可能仅限于 4GB 的地址空间、32 位地址、字节可寻址内存。有些实际上并不支持这一点,因此您必须继续阅读文档,但如果没有其他解决方案,它们就不能解决更多问题。因此,如果我要为这个处理器编写一个 C 编译器,那么明智的方法是使用 32 位指针。
到目前为止,无论如何都不可能生成 64 位地址。尽管由于某种原因,英特尔在当时和现在非常普遍的做法上受到了打击,但通过在另一个位置添加更多地址位,对架构进行分段是很常见的。您通常会在 16 位架构(如 8086 以及其他架构)中看到这一点,他们希望在整个系统中超过 64Kbyte 的限制。您需要为额外的地址位创建一个解决方案,您可以执行双寄存器指令,其中地址来自两个寄存器,要么是双倍宽度,要么是一个 32 位地址,或者是偏移量,有人说一个左移 8 位并添加到另一个寄存器中24 或像英特尔一样,将 4 移位并相加,得到 20。现在英特尔没有使用通用寄存器,而是使用专用寄存器,这也很常见,其他人可能会强制进行整个库切换,这与英特尔的明智方法不同,即相同的外部地址可以在内部以 16 种不同的方式访问,您只能访问隔离的 64Kbyte 地址空间,这使得编程更加困难。
这就像说我的车有四个轮子,为什么我不能只有 8 个轮子并同时在两条车道上行驶。因为那是一辆不同的车。如果您希望处理器具有 32 位寄存器但具有 64 位地址空间,那是很有可能的,但您需要在架构级别进行设计并提供指令或其他解决方案以允许这些事务,并且足够理智设计你可以为它创建一个像 C 这样的高级语言编译器,而不是只依赖于使用它的汇编语言程序员。
可免费获得适用于 x86(8088/86、386 等)、ARM、MIPS、RISC-V、AVR 等的文档。这些文档以某种形式展示了寻址是如何工作的,尤其是那些试图使用比单个寄存器所能容纳的更宽的地址总线的旧/小型架构。那些经常使用的图片/图表来显示地址是如何创建的。
【讨论】: