从大小大于指令中可用大小的内存加载

Bra*_*l0w 0 memory 64-bit assembly 32-bit instructions

现在的处理器大多是 32 位或 64 位。这意味着它们处理的指令具有这个大小。

我们经常听说 32 位操作系统的 RAM 限制为 4GB=(2^32 位),因为 RAM 地址的长度需要保存在 32 位内。

但事实上,当我们查看指令的外观时,您通常需要不到 32 位来加载一个字。

以 x86mov指令为例,您有一个操作码、一个源地址和一个目标地址。

我的问题是,我们如何才能从 32 位长的地址加载某些内容?

我们是否总是需要在内存中某个位置有一个指向该地址的指针,该位置具有可在指令中使用的较小地址?

谢谢

har*_*old 5

这个问题的前提是错误的。处理器“x 位”并不意味着所有指令都是 x 位长。这可能意味着,特别是在 RISC 架构上,x86 不是一个例子。如今,在 x86 上,一条指令的长度可以从 1 字节到 15 字节不等(以前的上限较低)。

因此 x86 在将地址(或其他常量)放入其指令中时没有任何问题。有足够的空间。顺便请注意,它永远不需要源地址目标地址,这根本就是不可编码的。在大多数指令中,它们中至少有一个必须是寄存器,并且在确实具有两个内存地址的一对指令中,这些地址是隐式的。

在其他一些体系结构上,您是绝对正确的:指令的长度不足以容纳完整的地址(因为它们的大小相同,并且不会留下任何操作码位)。常见的解决方案是提供相对于指令指针的寻址模式,然后如果需要绝对地址,可以在“附近”存储完整地址。