如何在不使用伪指令的情况下加载内存地址?

5
我正在使用MARS模拟器自学MIPS汇编语言。
为了教学目的,我限制自己不使用伪指令。
当我尝试将某些数据的地址存储到一个寄存器中时,遇到了问题,因为我不能使用la指令。
我尝试使用lui和ori结合的方式,就像直接加载一个数字一样,但没有成功。
  .data
arr:
  .byte 0xa1
  .byte 0xb2
  .byte 0xc3
  .byte 0xd4
  .byte 0xe5
  .byte 0xf6
  .byte 0x7a
  .byte 0x8b
  .byte 0x9c
  .byte 0xad

.text

  lui $s0, mem # <--- mars just gives me errors here :(
  ori $s0, mem # ?? ... 

这可以使用MARS实现,不需要伪指令。怎么做?
提前感谢!
3个回答

7
回答经过修改的问题“是否可以仅使用MARS实现,而不使用伪指令?”:快速扫描MARS文档,似乎不行。MARS似乎是有意限制,用于教学目的。
如果你想在完整的MIPS模拟器上尝试此操作,该模拟器将模拟在MIPS上运行Linux操作系统,并运行使用gnu工具链构建的代码,请查看OVP Simulator。这是免费的,并且适用于Linux和Windows,但可能比你需要的要多得多。

你又来了!感谢你的见解。:) 是的,我怀疑这是不可能的,但只是认为伪指令做不到实际指令所不能做的事情是一个重大缺陷。我会尝试使用OVP,并等待一两天看看是否有人提出解决方案,如果没有,赏金就归你了;) - Trinidad
1
@Trinidad:我也试过了,甚至不能执行 li $t0, 2+2,所以我同意 markgz 的看法,似乎不可能实现。 - user786653

3
您需要在lui和ori指令中引用数据段中的标签。这适用于GNU汇编器(as):
    .data
lab1: .byte 0xa1
...
.text
    lui $s0, %hi(lab1)
    ori $s0, %lo(lab1)
    lw  $s2, 0($s1)
...

%hi 和 %lo 指令告诉链接器正在发生什么,以便它可以将标签“lab1”的地址放入机器代码中。


2

你的ori指令需要另一个操作数才能正常工作。根据我查看的代码,"mem"不是一个存在的标签。 试试这个:

.data 0x10000000 #or choose any other location
        #pointer section
        .word arr
        #...

        #pointed section
arr:    .byte #...  only as tip, you can separate multiple values with comma
              #behind .byte so that you don't need multiple .byte directives 
        #...

.text
        #...
        lui $s0, 0x1000
        lw $t0, 0($s0)           #get the value of "arr"
        #...

如果它不起作用,MARS很可能无法获取标签内容而无需伪指令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接