MIPS Simulator for Assembly Language homework (MARS)
There is a
MIPS Assembly language simulator with
free downloads
and the
online documentation of the MARS simulator.
The simulator is built on the SPIM assembler for MIPS, and there
is generous, high-quality documentation of the MIPS assembly
language with the
free, online SPIM documentation for the MIPS assembler,
and the
SPIM Quick Reference
(or an
even shorter quick reference here)
The MARS software is distributed as a Java .jar file. It requires
Java J2SE 1.5 or later. Depending on your configuration,
you may be able to directly open it from the download menu.
Java J2SE 1.5 or later. Depending on your configuration,
you may be able to directly open it from the download menu.
If you have trouble, or if you prefer to run from the
command line on your own computer, the Java SDK is is also available
for free download from the same download page. The instructions
for running it from Windows or DOS should work equally well
on Linux. The CCIS machines should already have
the necessary Java SDK installed.
Resources
-
MIPS Green Sheet
-
MIPS CPU layout
- Useful Assembler Directives
- .align n
- Align the next datum on a 2^n byte
boundary. For example, .align 2 aligns the next value on a word
boundary. .align 0 turns off automatic alignment of
.half, .word, .float, and .double directives until
the next .data or .kdata directive.
- .asciiz str
- Store the string in memory and
null-terminate it.
- .byte b1, ..., bn
- Store the n values in
successive bytes of memory.
- .word w1, ..., wn
- Store the n 32-bit
quantities in successive memory words.
- .data
- The following data items should
be stored in the data segment. If the optional argument addr
is present, the items are stored beginning at address addr.
- .space n
- Allocate n bytes of space in the
current segment (which must be the data segment in SPIM).
- .text
- The next items are put in the
user text segment. In SPIM, these items may only be instructions or
words (see the .word directive below). If the optional argument
addr is present, the items are stored beginning at address
addr.
- System Calls
service | system call code | arguments | result
| print_int | 1 | $a0 = integer |
|
print_float | 2 | $f12 = float |
|
print_double | 3 | $f12 = double |
|
print_string | 4 | $a0 = string |
|
read_int | 5 | | integer (in $v0)
|
read_float | 6 | | float (in $f0)
|
read_double | 7 | | double (in $f0)
|
read_string | 8 | $a0 = buffer, $a1 = length |
|
sbrk | 9 | $a0 = amount | address (in
$v0)
|
exit | 10 |
|
|
Gotchas
There are several important things to watch out for.
- When you hit the "Assemble" menu item, any error messages about
failure to assemble are in the
bottom window pane, tab: "Mars Messages".
Input/Output is in the bottom window pane, tab: "Run I/O"
- If you paste assembly code into the edit window pane, you must
save that code to a file before Mars will let you assemble it.
- If you have selected a box with your mouse (e.g. "Value" box in
the data window pane, or "Register" box), then Mars will not
update the value in that box. Mars assumes you prefer to write
your own value into that box, and not to allow the assembly
program to use that box.
- If your program stops at an error, read the "Mars Messages" for
the cause of the error, and then hit the "Backstep" menu item
to see what caused that error. Continue hitting "Backstep"
or "Singlestep" in order to identify the error.
- Your main routine must call the "exit" system call to terminate.
It may not simply call return ("jr $ra"). Note that page B-44
of Appendix B of the text (fourth edition) has a table of
"system services" (system calls). These allow you to do "exit"
and also I/O.
One of the nicer features of this software is a limited
backstep capability (opposite of single-step) for debugging.
In addition, the
help menu includes a short summary
of the MIPS assembly instructions.
In general, I like this IDE for assembly even better than some
of the IDEs that I have seen for C/C++/Java.
(The one feature that I found
a little unintuitive is that if you want to look at the
stack (for example) instead of data, you must go to the
Data Segment window pane, and use the drop-down menu at the
bottom of that pane to choose "current $sp" instead of ".data".)
Please note the
three sample assembly programs, along with an accompanying
tutorial on the same web page.
I'd appreciate if you could be on the lookout
for any unusual issues, and report them promptly (along with
possible workarounds), so the rest of the class can benefit.
Thanks very much for your help on this.