【问题标题】:How 32 bit IR hold load instruction?(RISC style 32bit architechture)32 位 OR 如何保持加载指令?(RISC 风格的 32 位架构)
【发布时间】:2016-02-23 04:01:00
【问题描述】:

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

【问题讨论】:

  • 指令中甚至可以有 no 地址位,这取决于您打算使用的寻址模式
  • 您假设一条指令可以对来自任意绝对地址的加载进行编码。有一些技巧可以使跳转变得灵活,但代码通常需要包含可能很远的数据的硬编码地址。
  • 那么,通常我们不能使用立即模式访问任意地址?

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


【解决方案1】:

您假设一条指令可以对来自任意绝对地址的加载进行编码。在 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-26
          • 2015-08-03
          • 2016-08-09
          • 2018-04-02
          • 2010-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多