【问题标题】:Why we should reserve a global register in MMIX?为什么我们要在 MMIX 中保留一个全局寄存器?
【发布时间】:2022-10-14 18:52:38
【问题描述】:

做什么“格雷格@”在这段代码中做什么?我知道它保留了一个全局寄存器,但为什么我们在这里需要它呢?

            LOC Data_Segment
            GREG @ 
    Y       OCTA 0

    x       IS $1
    buf1    IS $2
    buf2    IS $3

            LOC #100

    Main    FLOT    buf1,157
            FLOT    buf2,50
            FDIV    x,buf1,buf2
            STO     x,Y
            TRAP    0,Halt,0

【问题讨论】:

    标签: assembly cpu-registers mmix


    【解决方案1】:

    MMIX 指令集没有绝对寻址模式。 相反,与 RISC 架构的典型情况一样,唯一可用的寻址模式是具有基址寄存器和 8 位立即数或寄存器索引的索引寻址模式。因此,从内存中加载变量需要您首先将附近的地址加载到寄存器中。这是通过GREG @ 指令实现的:它使用当前地址分配一个全局寄存器,允许访问附近的全局变量(在这种情况下,即变量Y)。

    在更复杂的程序中,您可能希望选择不同的方法,因为您将很快用完全局寄存器。一种解决方案是在您的代码旁边存储一个地址池,并使用 GETA 指令加载该池的地址,如下所示:

            ...
            GETA    $4, pool     @ obtain the address of the pool
            LDOU    $5, $4, 0    @ load the address of Y from the pool
            STO     x, $5, 0     @ store x to Y
            ...
    
    pool    OCTA    Y            @ literal pool holding Y
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2011-01-22
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多