assembly - 为什么我们要在MMIX中保留一个全局寄存器?

标签 assembly cpu-registers mmix

这段代码中的“GREG @”有什么作用?我知道它保留了一个全局寄存器,但为什么我们在这里需要它?

            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

最佳答案

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

关于assembly - 为什么我们要在MMIX中保留一个全局寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74068042/

相关文章:

c - 内联汇编 - 无用的中间复制指令

assembly - 推送到浮点寄存器而不是堆栈

algorithm - 目的是通过内存操作将 MMIX 汇编中的最低有效位设置为 0?

assembly - MIX 或 MMIX - 什么是最好的

assembly - NASM 移位运算符

function - 你如何在程序集中找到函数虚拟调用地址?

assembly - 是否可以从机器代码中检测 CPU 架构?

windows - Tasm 对名称较长的文件给出错误

c - 请澄清我对 C 中位域和 union 的理解