32位IR保持加载指令如何?(RISC样式32位架构)

时间:2015-11-20 15:38:20

标签: assembly operating-system cpu computer-architecture instruction-set

我对指令大小和可寻址空间感到困惑(我假设指令大小应该与地址位的大小相同。我在书中找不到足够的解释)如果我是正确的,那么理论上如果我们有一个32位体系结构(RISC样式)中2 ^ 32个可寻址单位(字节)的内存4字节大小的加载指令如何保存操作码以及地址?

4 个答案:

答案 0 :(得分:3)

您假设单个指令可以编码来自任意绝对地址的负载。在x86上也是如此,即使在64位模式下也是如此(但是有一个特殊的操作码,用于从没有位移或索引寄存器的64位绝对地址加载,并且dest必须是rax)。

在大多数RISC架构中,从绝对地址加载通常使用两个mov-immediate指令来设置寄存器的上半部分和下半部分,然后使用该寄存器作为加载的地址。

例如,

int a;
int foo(void) { return a; }

compiles to (ARM gcc 4.8.2 on godbolt)

foo():
    movw    r3, #:lower16:.LANCHOR0 @ tmp113,
    movt    r3, #:upper16:.LANCHOR0 @ tmp113,
    ldr r0, [r3]    @, a
    bx  lr  @
a:
    .space  4

答案 1 :(得分:2)

对于存储器访问指令,指令通常使用带偏移的地址寄存器。形式的一些东西:load R1, [R2 + 8]。 ARM,x86,MIPS和许多其他提供此模式。通常可以选择使用PC作为地址寄存器,以便能够获取代码旁边的常量。

对于跳转指令,除了使用地址寄存器之外,通常还有一个偏移跳转,它不使用任何寄存器,而是向前或向后跳转X指令。偏移量通常在范围内受到限制,并且可能会移动一些量(限制为2,4的倍数...),因此它可以适合小的立即数操作数。
MIPS还使用绝对跳转和相对跳转之间的混合:j指令跳转到绝对地址,但是在当前指令的区域中。确切地说,直接地址缺少一些高位(因此它可以适合),并使用当前PC的高位代替。

答案 2 :(得分:1)

您可以通过限制可在该范围内表示的值的数量,在4字节指令中对32位立即值进行编码。

ARM通过使用8位编码立即数以及指定旋转的附加4位字段来实现此目的。 CPU通过取这8位并将它们移位4位字段指示的次数来计算立即值。

答案 3 :(得分:1)

还有一个技巧(ARM也使用了这个版本):如果指令地址必须是4字节对齐,则不要包含2个最低位 - 它们必须为零。你现在有2位操作码。

有些处理器根本不支持绝对地址,只是长期的相对偏移。这些系统使用蹦床进行更长时间的跳跃。