首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MIPS64中加载地址

在MIPS64中加载地址
EN

Stack Overflow用户
提问于 2010-10-12 19:38:30
回答 2查看 2.9K关注 0票数 7

这可能是我没有注意到的一件简单而明显的事情,但是如何在MIPS64处理器中加载地址呢?在MIPS32处理器中,以下汇编程序伪指令:

代码语言:javascript
复制
la $at, LabelAddr

扩展为:

代码语言:javascript
复制
lui $at, LabelAddr[31:16]
ori $at,$at, LabelAddr[15:0]

查看MIPS64指令集,我发现lui仍然将16位立即数加载到32位字的上半部分。似乎没有任何类型的扩展指令将立即数加载到64位字的高位区域。看起来,要做la伪指令的等价物,我需要扩展成类似下面这样的代码:

代码语言:javascript
复制
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]

这让我觉得有点...对于像加载地址这样基本的事情,我很费解,所以它让我确信我忽略了一些东西。

我忽略了什么(如果有的话)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-28 22:10:26

我认为如果你需要加载很多常量,你应该把它放在当前代码附近的常量池(也就是"literal pool")中,然后通过ld指令加载它。

例如:$s0包含池的基地址,而您要加载的常量位于偏移量48处,您可以通过指令ld $t1, 48($s0)将其加载到$t1

这种技术在ARM中非常常见,指令只能加载12位立即数(只有更高版本的ARM才能加载16位立即数,但有一些限制)。它也在Java中使用。

然而,不知何故,MIPS编译器仍然总是generate multiple instructions to load a 64-bit immediate。例如,要在MIPS上加载0xfedcba0987654321,gcc使用

代码语言:javascript
复制
    li      $2,-9568256       # 0xffffffffff6e0000
    daddiu  $2,$2,23813
    dsll    $2,$2,17
    daddiu  $2,$2,-30875
    dsll    $2,$2,16
    daddiu  $2,$2,17185

许多其他RISC体系结构有更有效的方法来加载立即数,因此它们需要更少的指令,但仍然至少需要4条指令。在这些情况下,指令缓存成本可能低于数据缓存成本,或者可能有人只是不喜欢这种想法

Here's an example of handwritten constant pool on MIPS

代码语言:javascript
复制
# load pool base address
    dla $s0, pool
foo:
# just some placeholder
    addu $t0, $t0, $t1
bar:
# load from pool
    ld $a0, pool_foo($s0)
    ld $a1, pool_bar($s0)

.section pool
# macro helper to define a pool entry
.macro ENTRY label
pool_entry_\label\(): .quad \label
.equ pool_\label\(), pool_entry_\label - pool
.endm
ENTRY foo
ENTRY bar

我没能说服任何MIPS编译器发出一个文字池,除了here's a compiler-generated example on ARM

票数 3
EN

Stack Overflow用户

发布于 2016-07-22 10:30:02

地址,所以它让我确信我忽略了一些东西。我忽略了什么(如果有的话)?

您遗漏的是,即使在Mips64中,指令大小也保持为32位(4字节)。在这个32位机器码编码系统中,翻译成'lui‘+ 'ori’的'la‘组合最多可以处理32位的值(地址)。4字节机器指令中没有足够的位来轻松地对64位地址进行编码。为了处理64位地址,使用了更多的相同地址的迭代(lui+ori)和移位(DSL1)。

Paxym

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3914210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档