问题
I'm trying to learn MIPS assembly language by myself using MARS simulator.
For didactic reasons I'm limiting myself to not using pseudo-instructions.
While trying to get the address of some data into a register, I ran into a problem because I cannot use la
.
I tried using lui
in combination with ori
, the same as if I was to load a number directly, to no avail:
.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 # ?? ...
Is this doable using specifically MARS, without pseudo-instructions? How?
Thanks in advance!
回答1:
To answer the modified question "is this doable using specifically MARS, without pseudo-instructions?": From a quick scan of the MARS documentation, it appears not. MARS appears to be intentionally restricted for pedagogical purposes.
If you want to try this on a full MIPS simulator that will simulate the Linux OS running on MIPS and run code built with the gnu toolchain, take a look at the OVP Simulator. This is free and runs on Linux and Windows, but it's probably a lot more than you need.
回答2:
You need to refer to a label in the data section in the lui and ori instructions. This works for gnu assembler (as):
.data
lab1: .byte 0xa1
...
.text
lui $s0, %hi(lab1)
ori $s0, %lo(lab1)
lw $s2, 0($s1)
...
The %hi and %lo directives tell the linker what is going on, so that it can put the address of the label "lab1" in the machine code.
回答3:
Your ori
instructions needs still another operand to work and as far as I looked over your code, "mem" is no existing label.
Try this one:
.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"
#...
If it doesn't work, MARS likely won't be able to get label content without pseudo instructions.
来源:https://stackoverflow.com/questions/7264532/how-to-load-memory-address-without-using-pseudo-instructions