270 likes | 303 Views
Dive deep into MIPS J-type instructions, addressing modes, call conventions, and stack management. Learn how MIPS handles jump instructions and large immediate values. Understand the protocol for calling functions and preserving register values.
E N D
J-type Instruction Encoding • We have jump and jump-and-link instructions • Note that we have 26 bits for the target fields, which represents the number of instructions (words) instead of bytes • In terms of bytes, it represents 28 bits in terms of bytes • But PC requires 32 bits • Where do we get the other 4 bits? week04-3.ppt
J-type Instruction Encoding • Pseudo-direct addressing • In J-type instructions, the jump address is formed by upper 4 bits of the current PC, 26 bits of the target address field in the instruction, and two bits of 0’s • What is the largest program a J-type instruction works properly? week04-3.ppt
Peek into the Future week04-3.ppt
Jump Register Instruction • Jump register (jr) • Unconditionally jump to the address given by register rs week04-3.ppt
Big Immediates • We know that we can use 16-bit immediate numbers in MIPS instructions such as addi • What about large numbers? • We also need to load 32 bit addresses in order to use jr • Load address (la) • Load the address of a label into the register (note: not the content of the address) week04-3.ppt
MIPS Addressing for 32-bit Immediates • In MIPS, the immediate field has 16 bits • In order to handle 32-bit immediate operands, the MIPS includes load upper immediate (lui) • Which sets the upper 16 bits of a constant in a register and fills the lower 16 bits with 0’s • Then one can set the lower 16 bits using ori week04-3.ppt
Example • To load the following 32-bit constant in $s0, • We first need to do lui $s0, 61 • Why? • Then we need to do ori $s0, $s0, 35072 • Why? week04-3.ppt
Branching Far Away • Note that for conditional branch instructions the offset is 16 bits • What can we do if the branch is further away than the 16-bit offset can represent? week04-3.ppt
Branching Far Away • Note that for conditional branch instructions the offset is 16 bits • What can we do if the branch is further away than the 16-bit offset can represent? • We can replace it using a pair of instructions bne $s0, $s1, L2 j L1 L2: week04-3.ppt
MIPS Assembly Instructions week04-3.ppt
Procedures and Functions • We programmers use procedures and functions to structure and organize programs • To make them easier to understand • To allow code to be reused week04-3.ppt
A Simple Example Note that there are steps involved in the calling function as well as in the one being called week04-3.ppt
MIPS Calling Conventions • MIPS assembly follows the following convention in using registers • $a0 - $a3: four argument registers in which to pass parameters • $v0 - $v1: two value registers in which to return values • $ra: one return address register to return to the point of origin week04-3.ppt
Registers • Remember that the same registers are used by both the caller and callee • What do we need to do in order to guarantee the correctness of the program? • For the following code for example, what do we need to do? week04-3.ppt
Register Spilling • The callee has to save all the registers it uses and restore the values before it returns • By storing them on the stack • At the beginning • Then restoring them • At the end week04-3.ppt
Simple Example week04-3.ppt
The Stack Pointer week04-3.ppt
MIPS Calling Conventions - more • MIPS software divides 18 of the registers into two groups • $t0 - $t9: 10 temporary registers that are not preserved by the callee on a procedure call • These are caller-saved registers since the caller must save the ones it is using • $s0 - $s7: 8 saved registers that must be preserved on a procedure call • These are callee-saved registers since the callee must save the ones it uses week04-3.ppt
Caller Must Do • Before it calls a procedure/function, it must • Pass parameters • Up to four parameters are passed by $a0 - $a3 • Save caller-saved registers on the stack • It includes $a0 - $a3 (since the callee may change these values), $s0 - $s9, and $ra • Why $ra? • Execute a jal instruction, which jumps to the callee’s first instruction and save the next instruction in $ra week04-3.ppt
Caller Must Do – cont. • After the procedure/function call, it needs to • Read the returned values from $v0 and $v1 • Restore caller-saved registers week04-3.ppt
Callee Must Do • Before it does its calculations, the callee must do the following • Allocate memory for its frame by subtracting its frame size from the stack pointer • Save callee-saved registers in the frame • It must save $s0 - $s7, $fp, $ra before changing them • $ra needs to be saved if the callee itself makes a call • When needed, establish the frame pointer $fp by loading $sp to it • In this case, $fp must be saved week04-3.ppt
Allocating Space for Local Data on Stack • In MIPS, local variables are also stored on the stack • The segment of the stack containing a procedure’s saved registers and local variables is called a procedure frame (or activation record) week04-3.ppt
Callee Must Do • After its calculations and before it returns to the caller, the callee must • Place the return values in $v0 and $v1 (if needed) • Restore all the callee-saved registers that were saved at the procedure entry • Pop the stack frame by adding the frame size to $sp • Return by jumping to the address in register $ra using jr week04-3.ppt
Earlier Example week04-3.ppt
Revised Version week04-3.ppt