Tutorial 1 : Introduction to SPIM
Goal : Get comfortable with the MIPS processor simulator: SPIM.
SPIM in short
SPIM is described in appendix A.9, page A-38 in Patterson, Hennessy (the whole appendix is also available on on-line). The described version here is XSPIM, which runs under X-windows.
If you are working home, you can download SPIM for Unix/Linux, DOS or Windows.
|1||You need first to copy example.s. The file contains the program to be run. Open it with a text editor and try to understand what it does.|
|2||Start XSPIM by writing xspim on the command prompt. The new window is divided into different parts. On the top part, you will find the processor registers; under, there are a number of keys used to input commands to SPIM. Under these keys, there is the Text Segment where you can see the machine code stored in the memory. Under the Text Segment, you can find the Data Segment which displays the data stored in the memory. You can follow what is happening when you run the program in the window that appears under the Data Segment. Notice that you can scroll through both the Data and the Text segments. (if you don't find the command xspim, or if it does not seem to work, try with /it/sw/misc/bin/xspim)|
|3||Begin with reseting the memory and the registers with the clear button. You can check that you have indeed cleared both of them.|
|4||To load a program click on load. Find ex1.s and click on assembly file.|
|5||Look at the text segment. You can see the addresses to the left, followed to the right by hexadecimal code of the machine instructions and finally followed by the same machine instructions in text format. To the right, you can see the equivalent assembly code instructions. You may notice that the assembly code is not identical to the machine instruction. The reason is that MIPS has uses the, so called, pseudo instructions. These are several lower level machine instructions represented by one assembly instruction. For example, at the addresses 0x00400020 and 0x00400024 you can see the two machine instructions lui $1, 4097 and lw $3, 0($1). The sequence of these two machine codes correspond to the assembly instruction lw $3, n1($0).|
|6||Let's look at the data segment now. What is the word stored at the address 0x10010000? what base is used to represent it? on which address can you find the word 0x00000017? what is stored at the address 0x10010008?|
|7||What values do R3 and R4 have?|
|8||Start the program . Click on run. You can see from which address the program is starting. Click on ok.|
|9||What do registers R3 and R4 contain now?|
|10||Wich values have changed in the data segment? what are the new values?|
|11||We follow now the program execution. reset again the memory and the registers. Reload the file example.s. It is important that you do so, this allows you to follow the effects of running the program.|
|12||Set breakpoints in the program. Click on breakpoint. We will set three breakpoints: the first one with the label main in the program (look in the code), and after that a globally defined label, so you can write main in the square and click on add. Click now on "list" to check that the breakpoint has been set, in this case a text will appear in the bottom part of the window specifying in which address the breakpoint has been set. Look at the text segment: which instruction is at that address? (It is also the starting point for the program. The code appearing between the address 0x00400000 and the main label is a code used by the simulator to start the program execution.)|
|13||Now we want to add two more breakpoints: one of them in front of the instruction add $4, $4, $3. Search in the text segment for the address containing that instruction. What is this address? set a breakpoint there. Set another breakpoint in front of the next instruction. Which address does that breakpoint have? you can check with "list" to verify that the breakpoints are there.|
|14||Start the program. It will stop at the first breakpoint. What is stored in the registers R3 and R4? what is the value of PC? (PC is in the upper left corner.)|
|15||Continue the execution by clicking on the button with the same name. The execution stops now at the next breakpoint. what values does registers PC, R3 and R4 have?|
|16||Continue the execution. What values does registers PC, R3 and R4 have at the last breakpoint?|
|17||Try removing a breakpoint. Use list to check that the breakpoint was actually removed.|
|18||Reset the memory and the register and load again the program. We will follow what happens in the memory and the registers when stepping through the program. Click on step. the number of steps indicates the number of instructions SPIM will execute at each step. Run with an instruction per step. When you click on step, the program will execute one instruction. Further down in the window, you can see the instruction that has been just executed. PC contains (as usual) the address to the next instruction (to be executed). Continue clicking on step until PC contains the address 0x00400020, the program starts from there. Continue after by stepping through the program and following what happens in the registers and the memory.|
|19||Try to write some stuff: under print you can indicate global symbols. Down you can see which global symbols are defined in the program, in this case it is only main. what is contained in the memory addresses 0x10010000 - 0x10010010?|
|20||Clean the memory and the registers. Reload the program again. You will now make some changes directly in the memory in a way that the program will add 35 and 16 instead. Use the set value command to put the new values in the memory (numbers can be written in decimal). Run the program and control the result.|
You can find the answers here.