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

时间:2013-11-28 10:19:21

标签: memory assembly 64-bit 32-bit instructions

这些天的处理器大多是32位或64位。这意味着他们处理的指令具有这样的大小。

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

但实际上,当我们查看指令的外观时,通常会有少于32位的字加载一个字。

我们采用x86 mov指令,您有操作码,源和目标地址。

我的问题是,我们怎么可能从32位长的地址加载一些东西?

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

谢谢

3 个答案:

答案 0 :(得分:4)

这个问题的前提是错误的。处理器为“x位”并不意味着所有指令都是x位长。 可以意味着,特别是在RISC架构上,x86不是 的一个例子。这些天在x86上,一条指令可以在1字节到15字节之间(上限通常更低)。

因此x86在其指令中放置地址(或其他常量)没有问题。充足的空间。顺便提一下,请注意,它始终不需要源目标地址,这根本就是不可编码的。其中至少有一个必须是大多数指令中的寄存器,并且在实际上有两个存储器地址的指令中,地址是隐式的。

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

答案 1 :(得分:2)

  

这些天的处理器大多是32位或64位。这意味着   他们处理的说明就是这么大。

这是不真实的。当涉及来自x86系列的处理器时,处理器的“位”指的是它们执行AMD64 / EM64T(通常通用为x86-64或x64)指令集的指令的能力。这些指令扩展了现有的指令,以便在64位寄存器上工作,并且 - 通常 - 允许处理器使用64位地址,这会将地址空间扩展到2 ^ 64字节。但是,这些CPU的大多数实际实现都没有物理64地址线,尽管虚拟地址空间显然仍然是64位宽。顺便提一下,大多数指令仍然在32位数据上运行,即使在x64中,32位操作数也是默认值。只有一条指令可以采用64位操作数 - mov

x86系列的处理器都具有可变大小的指令编码。这意味着每个指令的大小取决于指令的类型和使用的操作数。在寄存器(xor eax, eax)上操作时,相同的指令只能占用两个字节,在指定完整(32位)立即数操作数(xor eax, 0xf0f0f0f0)时,相同的指令只需要5个字节。

答案 2 :(得分:1)

  

这些天的处理器大多是32位或64位。这意味着他们处理的指令具有这样的大小。

x86的这个假设是错误的,因为指令的长度可以是1个字节,最多15个字节。您可以查看有关如何解码指令的intel手册。