Linuxdoc Linux Questions
Click here to ask our community of linux experts!
Custom Search

6.4. MIPS Example

As a demonstration of a fact that there's a universe other than x86, here comes an example program for MIPS by Spencer Parkin. BTW, if you've got here, you may also want to see A Collection of Assembler Hello World Programs.

# hello.S      by Spencer T. Parkin

# This is my first MIPS-RISC assembly program!
# To compile this program type:
# > gcc -o hello hello.S -non_shared

# This program compiles without errors or warnings
# on a PlayStation2 MIPS R5900 (EE Core).
# EE stands for Emotion Engine...lame!

# The -non_shared option tells gcc that we`re
# not interrested in compiling relocatable code.
# If we were, we would need to follow the PIC-
# ABI calling conventions and other protocols.

#include <asm/regdef.h>         // ...for human readable register names
#include <asm/unistd.h>         // ...for system serivices                      

                .rdata                                  # begin read-only data segment
                .align          2                       # because of the way memory is built
hello:          .asciz          "Hello, world!\n"       # a null terminated string
                .align          4                       # because of the way memory is built
length:         .word           . - hello               # length = IC - (hello-addr)
                .text                                   # begin code segment
                .globl          main                    # for gcc/ld linking
                .ent            main                    # for gdb debugging info.
main:           # We must specify -non_shared to gcc or we`ll need these 3 lines that fallow.
#               .set            noreorder               # disable instruction reordering
#               .cpload         t9                      # PIC ABI crap (function prologue)
#               .set            reorder                 # re-enable instruction reordering
                move            a0,$0                   # load stdout fd
                la              a1,hello                # load string address
                lw              a2,length               # load string length
                li              v0,__NR_write           # specify system write service
                syscall                                 # call the kernel (write string)
                li              v0,0                    # load return code
                j               ra                      # return to caller
                .end            main                    # for dgb debugging info.

# That`s all folks!