Assembly 有没有简单的方法或宏将64位地址加载到mips64 GPR中

Assembly 有没有简单的方法或宏将64位地址加载到mips64 GPR中,assembly,mips,mips64,Assembly,Mips,Mips64,我想将64位地址加载到MIPS64通用寄存器(GPR)中。我可以自己做 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] 但是,还有别的办法吗 我从你那里得到一些信息 但是我想知道什么是“常量池”,以及如何创建和访问它?简单的方法是让汇编程序使用dla伪指令来处理

我想将64位地址加载到MIPS64通用寄存器(GPR)中。我可以自己做

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]
但是,还有别的办法吗

我从你那里得到一些信息

但是我想知道什么是“常量池”,以及如何创建和访问它?

简单的方法是让汇编程序使用
dla
伪指令来处理它。它将扩展到类似于您的代码:

lui $dst, LabelAddr[63:48]
lui $at, LabelAddr[31:16]
daddiu $dst, $dst, LabelAddr[47:32]
daddiu $at, $at, LabelAddr[15:0]
dsll32 $dst, $dst, 0
daddu $dst, $dst, $at
常量池是一个内存区域,您可以在其中存储可以有效寻址的常量。一些汇编器和体系结构对此有特殊支持,而在另一些汇编器和体系结构上,您必须手动操作。正如您链接的问题的答案中所述,您可以设置指向常量池的指针(使用上述方法),并为后续操作使用更高效的访问

# 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