Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to load memory address without using pseudo-instructions?

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!

like image 783
Trinidad Avatar asked Aug 31 '11 23:08

Trinidad


2 Answers

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.

like image 82
markgz Avatar answered Oct 20 '22 03:10

markgz


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.

like image 31
Fellow MIPSer Avatar answered Oct 20 '22 03:10

Fellow MIPSer