Note: return address stored in register $ra; if subroutine will call other subroutines, or is recursive, return address should be copied from $ra onto stack to preserve it, since jal always places return address in this register and hence will overwrite previous value
ex Print out integer value contained in register $t2 li $v0, 1 # load appropriate system call code into register $v0; # code for printing integer is 1 move $a0, $t2 # move integer to be printed into $a0: $a0 = $t2 syscall # call operating system to perform operation ex Read integer value, store in RAM location with label int_value (presumably declared in data section) li $v0, 5 # load appropriate system call code into register $v0; # code for reading integer is 5 syscall # call operating system to perform operation sw $v0, int_value # value read from keyboard returned in register $v0; # store this in desired location ex Print out string (useful for prompts) .data string1 .asciiz "Print this.\n" # declaration for string variable .text main: li $v0, 4 # load appropriate system call code into register $v0; # code for printing string is 4 la $a0, string1 # load address of string to be printed into $a0 syscall # call operating system to perform print operation
Note: To indicate end of program, use exit system call; thus last lines of program should be:
li $v0, 10 # system call code for exit = 10 syscall # call operating system
Table of System Call Codes and Arguments
(from SPIM S20: A MIPS R2000 Simulator, James J. Larus, University of Wisconsin-Madison)
Service | System Call Code | Arguments | Result |
print integer | 1 | $a0 = value | (none) |
print float | 2 | $f12 = float value | (none) |
print double | 3 | $f12 = double value | (none) |
print string | 4 | $a0 = address of string | (none) |
read integer | 5 | (none) | $v0 = value read |
read float | 6 | (none) | $f0 = value read |
read double | 7 | (none) | $f0 = value read |
read string | 8 | $a0 = address where string to be stored $a1 = number of characters to read + 1 | (none) |
memory allocation | 9 | $a0 = number of bytes of storage desired | $v0 = address of block |
exit (end of program) | 10 | (none) | (none) |
# Compute the value of the sum 1*2 + 2*3 + 3*4 + . + 10*11, and store in register $t1 .data # variable declaration section out_string: .asciiz "The result is:\n" # declares a null-terminated string, to "prettify" output .text main: # indicates start of code li $t0, 1 # $t0 will be a counter; initialize to 1 li $t1, 0 # $t1 will hold the sum li $t2, 10 # $t2 will hold loop limit loop_top: bgt $t0,$t2,loop_end # exit loop if $t0 > 10 addi $t3,$t0,1 # $t3 = $t0 + 1 mult $t0,$t3 # special register Lo = $t0 * $t3 # (don't need Hi since values are small) mflo $t3 # $t3 = Lo (= $t0 * $t3) add $t1,$t1,$t3 # $t1 = $t1 + $t3 addi $t0, 1 # increment counter b loop_top # branch to loop_top loop_end: # print out the result string li $v0, 4 # system call code for printing string = 4 la $a0, out_string # load address of string to be printed into $a0 syscall # call operating system to perform print operation # print out integer value in $t1 li $v0, 1 # system call code for printing integer = 1 move $a0, $t1 # move integer to be printed into $a0: $a0 = $t1 syscall # call operating system to perform print # exit program li $v0, 10 # system call code for exit = 10 syscall # call operating system # blank line at end to keep SPIM happy!
Any concern about the goals, questions, or wording of this document, please send a message to Jorge Vasconcelos. Return to the CSF Homepage