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是否可行?如何?

提前致谢!

4

3 回答 3

7

要回答修改后的问题“在没有伪指令的情况下使用专门的 MARS 是否可行? ”:快速浏览 MARS 文档,看来不是。MARS 似乎出于教学目的而受到有意限制。

如果您想在一个完整的 MIPS 模拟器上尝试这个,它将模拟在 MIPS 上运行的 Linux 操作系统并运行使用 gnu 工具链构建的代码,请查看OVP Simulator。这是免费的,可以在 Linux 和 Windows 上运行,但它可能比你需要的要多得多。

于 2011-09-28T18:56:04.933 回答
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”的地址放入机器代码中。

于 2011-09-01T00:02:23.840 回答
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 很可能在没有伪指令的情况下无法获取标签内容。

于 2015-12-20T19:17:31.580 回答