Assembly 如何将程序集代码%hi和%lo更改为在';火星';?
我使用“编译器资源管理器”将C++转换为MIPS。 但是由于%hi和%lo的原因,它在火星上不能很好地工作 我知道我应该换个角色,但我不知道怎么换 请帮忙Assembly 如何将程序集代码%hi和%lo更改为在';火星';?,assembly,mips,mars-simulator,Assembly,Mips,Mars Simulator,我使用“编译器资源管理器”将C++转换为MIPS。 但是由于%hi和%lo的原因,它在火星上不能很好地工作 我知道我应该换个角色,但我不知道怎么换 请帮忙 $L5: lui $2,%hi($LC1) lwc1 $f0,%lo($LC1+4)($2) lwc1 $f1,%lo($LC1)($2) b $L3 $LC1: .word 1100470148 .word
$L5:
lui $2,%hi($LC1)
lwc1 $f0,%lo($LC1+4)($2)
lwc1 $f1,%lo($LC1)($2)
b $L3
$LC1:
.word 1100470148
.word 0
顺便说一句,在火星上不可能有像气体%lo(标签)或%hi(标签)这样的功能。 一个简单的解决方法是使用标准宏
la
,该宏使用一对或lui
/ori
指令在寄存器中加载标签
代码的第一部分可以这样重写:
$L5:
la $2, $LC1
lwc1 $f0,4($2)
lwc1 $f1,0($2)
b $L3
$LC1:
.word 1100470148
.word 0
由于
la
宏扩展为两条指令,与使用%hi/%lo
相比,这是一条额外的指令,但它可以工作。使用la
加载地址。不要重复发布你的问题。这可能是你在火星上不用硬编码数字地址的最好方法,但如果la
扩展到lui
+ori
或addiu
,则会浪费指令。最初的版本能够在地址的下半部分使用寻址模式的16位立即数。您可以在MARS中执行类似于lwc1$f0、标签($零)
的操作,并且您可以选择一个内存模型,其中.data
从地址0
开始,因此16位立即数就足够了。(但是,如果汇编程序在汇编时不知道地址很小,则可以使用lui
扩展每个这样的负载。)
$L5:
la $2, $LC1
lwc1 $f0,4($2)
lwc1 $f1,0($2)
b $L3
$LC1:
.word 1100470148
.word 0