在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

上一篇: Loading an address in MIPS64

下一篇: How Do I Delete a DNS Domain Programmatically?