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!
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With