How to load memory address without using pseudo-instructions?

后端 未结 3 1333
北海茫月
北海茫月 2020-12-19 13:11

I\'m trying to learn MIPS assembly language by myself using MARS simulator.

For didactic reasons I\'m limiting myself to not using pseudo-instructio

相关标签:
3条回答
  • 2020-12-19 13:24

    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.

    0 讨论(0)
  • 2020-12-19 13:39

    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.

    0 讨论(0)
  • 2020-12-19 13:44

    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.

    0 讨论(0)
提交回复
热议问题