Assembly 32位IR如何保持加载指令?(RISC风格的32位体系结构)

Assembly 32位IR如何保持加载指令?(RISC风格的32位体系结构),assembly,operating-system,cpu,computer-architecture,instruction-set,Assembly,Operating System,Cpu,Computer Architecture,Instruction Set,我对指令大小和可寻址空间有点困惑(我假设指令大小应该和地址位的大小相同。我在书中没有找到足够的解释),如果我是正确的,那么理论上如果我们在32位体系结构(RISC风格)中有2^32个可寻址单元(字节)的内存4字节大小的加载指令如何保存操作码和地址 通过限制可在该范围内表示的值的数量,可以在4字节指令内对32位立即数进行编码 ARM通过将立即数编码为8位,再加上一个指定旋转的额外4位字段来实现这一点。CPU通过获取这8位并将其移位4位字段指示的次数来计算立即值。对于内存访问指令,指令通常使用带偏移

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

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


ARM通过将立即数编码为8位,再加上一个指定旋转的额外4位字段来实现这一点。CPU通过获取这8位并将其移位4位字段指示的次数来计算立即值。

对于内存访问指令,指令通常使用带偏移量的地址寄存器。形式如下:
加载R1,[R2+8]
。ARM、x86、MIPS和许多其他产品都提供这种模式。通常可以选择使用PC作为地址寄存器,以便能够获取代码旁边的常量

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

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


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

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

在大多数RISC体系结构上,从绝对地址加载通常使用两条mov立即指令来设置寄存器的上半部分和下半部分,然后将该寄存器用作加载地址

比如说,

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


您甚至可以在指令中没有地址位,这取决于您打算使用的寻址模式您假设一条指令可以从任意绝对地址编码负载。有一些技巧可以使跳转变得灵活,但代码通常不需要包含可能非常遥远的数据的硬编码地址。因此,通常我们不能使用即时模式访问任何任意地址?
foo():
    movw    r3, #:lower16:.LANCHOR0 @ tmp113,
    movt    r3, #:upper16:.LANCHOR0 @ tmp113,
    ldr r0, [r3]    @, a
    bx  lr  @
a:
    .space  4