Note that at present, there are no floating point instructions implemented.
Instructions: It implements most of the standard R-type, I-type, and J-type instructions for arithmetic, control, and memory operations. It does not handle floating point instructions, or ANY pseudo-operations. Pseudo-ops are a lie that confuse the capabilities of the assembler, and have no real place in an introductory computer architecture setting.
Data: The following data directives are the only ones recognized:
[label] .space [bytes] [label] .word [value] [label] .asciiz [string].space asks the assembler to allocate the given number of bytes of uninitialized space in the text segment. .word asks the assembler to allocate 4 bytes initialized with the given value in the data segment. .asciiz asks the assbler to allocate the given string in the text segment. The assembler must (and does) automatically word-align data.
Labels: Because of limitations of the linker, labels can ONLY be used in conjunction with BEQ, BNE, BGTZ, BLTZ, LW, SW, LB, SB, J, JAL, ADDI, ORI. Labels may begin with [_a-zA-Z] followed by zero or more characters in [_a-zA-Z0-9]. Label definitions must end in a colon.
# compute the factorial of 9 using the following algorithm # N = 9 # result = 1 # while (N != 0) { # result = result * N # N = N - 1 # } .data # begin data section msg: .asciiz "The factorial is: " # message string .text # begin program text __start: addi $sp, $sp, -4 # make some space on the stack addi $t0, $0, 1 # $t0 will hold result, initially 1 addi $t1, $0, 9 # $t1 will hold N, initially 9 top: beq $t1, $0, bottom mult $t0, $t0, $t1 # result = result * N addi $t1, $t1, -1 # decrement N j top # goto top bottom: sw $t0, 0($sp) # we'd better save result addi $v0, $0, 4 # finished w/ loop, now print out addi $a0, $gp, msg # message, by invoking syscall 4 syscall # (print_string) addi $v0, $0, 1 # now print out result, by lw $a0, 0($sp) # invoking syscall 1 (print_int) syscall addi $sp, $sp, 4 # reset the stack addi $v0, $0, 10 # exit syscall syscall