这段代码中的“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/