在MIPS64中加载地址
这可能是一个简单而明显的事情,我只是没有看到,但我如何在MIPS64处理器中加载地址? 在MIPS32处理器中,使用以下汇编伪指令:
la $at, LabelAddr
扩展为:
lui $at, LabelAddr[31:16]
ori $at,$at, LabelAddr[15:0]
看看MIPS64指令集,我发现lui
仍然将16位立即数加载到32位字的上半部分。 似乎没有任何类型的扩展指令将立即加载到64位字的上部区域。 这似乎是,做相当于一个la
伪指令,我需要扩展到代码如下:
lui $at, LabelAddr[63:48]
ori $at, $at, LabelAddr[47:32]
sll $at, 16
ori $at, $at, LabelAddr[31:16]
sll $at, 16
ori $at, $at, LabelAddr[15:0]
这让我感到有点......对于加载地址这样的基本事情而言,这是令人费解的,因此让我相信我忽略了某些东西。
我忽略了什么(如果有的话)?
我认为如果你需要加载很多常量,你应该把它放在一个常量池(也称为“文字池”)中,然后通过ld指令加载它。
例如: $s0
包含池的基地址,并且您想要加载的常量是加偏移量48,您可以通过指令ld $t1, 48($s0)
将其加载到$t1
,
这种技术在ARM中非常常见,其中指令只能加载12位立即数。 它也用于Java。
我只知道基本的MIPS32,因此可能指令语法不是很正确,但这就是主意。
编辑:这里有一个例子
所以它让我相信我忽略了一些东西。 我忽略了什么(如果有的话)?
你所缺少的是,即使在Mips64中, 指令大小仍然是32位(4字节) 。 在这个32位机器码编码系统中,'la'翻译成'lui'+'ori'组合可以处理最大32位值(地址)。 4字节机器指令中没有足够的位来轻松编码64位地址。 为了处理64位地址,使用相同的更多迭代(lui + ori)和shift(dsll)。
Paxym
链接地址: http://www.djcxy.com/p/3193.html