(Stack) Frame MIPS Call-Return Linkage: Stack Frames
Total Page:16
File Type:pdf, Size:1020Kb
Review: Procedure Call and Return Procedure Call Gap 0x10000 addi $a0,$0,43 int equal(int a1, int a2) 0x10004 addi $a1,$0,2 ISA Level { 0x10008 jal 0x30408 int tsame; 0x1000c ?? • Call and return instructions tsame = 0; C/C++ Level if (a1 == a2) 0x30408 addi $v0,$0,0 tsame = 1; 0x3040c bne $a0,$a1,4 • Local name scope return(tsame); 0x30410 addi $v0,$0,1 • Change tsame to same } 0x30414 jr $ra main() • Recursion { PC $ra=$31 0x10000 ?? • Arguments and return value (functions) int x,y,same; 0x10004 ?? Assembly Level x = 43; 0x10008 ?? y = 2; 0x30408 0x1000c • Must bridge gap between HLL and ISA same = equal(x,y); 0x3040c 0x1000c • Supporting local names // other computation 0x30410 0x1000c } 0x30414 0x1000c • Passing arguments (arbitrary number?) 0x1000c 0x1000c © 2012 Daniel J. Sorin 54 © 2012 Daniel J. Sorin 55 from Roth and Lebeck from Roth and Lebeck Review: Procedure Call (Stack) Frame MIPS Call-Return Linkage: Stack Frames • Procedures use a frame in the stack to: High Mem • Hold values passed to procedures as arguments Argument 6 Argument 5 Arguments and • Save registers that the callee procedure may modify, but which the local variables at procedure’s caller does not want changed FP fixed offset from FP Callee Save • To provide space for local variables Registers (variables with local scope) • To evaluate complex expressions (old FP, RA) Local Variables Grows and shrinks during Dynamic area expression evaluation SP Low Mem © 2012 Daniel J. Sorin 56 © 2012 Daniel J. Sorin 57 from Roth and Lebeck from Roth and Lebeck MIPS Register Naming Conventions MIPS/GCC Procedure Calling Conventions 0 zero constant 16 s0 callee saves Calling Procedure 1 at reserved for assembler . • Step-1: Pass the arguments 2 v0 expression evaluation & 23 s7 • First four arguments (arg0-arg3) are passed in registers $a0-$a3 3 v1 function results 24 t8 temporary (cont’d) • Remaining arguments are pushed onto the stack 4 a0 arguments 25 t9 (in reverse order, arg5 is at the top of the stack) 5 a1 26 k0 reserved for OS kernel • Step-2: Save caller-saved registers 6 a2 27 k1 • Save registers $t0-$t9 if they contain live values at the call site 7 a3 28 gp pointer to global area 8 t0 temporary: caller saves 29 sp Stack pointer • Step-3: Execute a jal instruction . 30 fp frame pointer 15 t7 31 ra return address © 2012 Daniel J. Sorin 58 © 2012 Daniel J. Sorin 59 from Roth and Lebeck from Roth and Lebeck MIPS/GCC Procedure Calling Conventions (cont.) MIPS/GCC Procedure Calling Conventions (cont.) Called Routine On return from a call • Step-1: Establish stack frame • Step-1: Put returned values in registers $v0 and $v1 • Subtract the frame size from the stack pointer (if values are returned) subiu $sp, $sp, <frame-size> • Step-2: Restore callee-saved registers • Typically, minimum frame size is 32 bytes (8 words) • Restore $fp and other saved registers: $ra, $s0 - $s7 • Step-2: Save callee saved registers in the frame • Step-3: Pop the stack • Register $fp is always saved (by convention) • Add the frame size to $sp • Register $ra is saved if routine makes a call addiu $sp, $sp, <frame-size> • Registers $s0-$s7 are saved if they are used • Step-4: Return • Step-3: Establish frame pointer • Jump to the address in $ra • Add the stack <frame size> - 4 to the address in $sp jr $ra addiu $fp, $sp, <frame-size> - 4 © 2012 Daniel J. Sorin 60 © 2012 Daniel J. Sorin 61 from Roth and Lebeck from Roth and Lebeck Example2 (will not cover in class) Example2 (cont.) # Main code segment # Program to add together list of 9 numbers .text # Code again: # Begin main loop .align 2 lw $t6, 0($s0) #\ .globl main addu $s1, $s1, $t6 #/ Actual "work" # SPIM I/O main: # MAIN procedure Entrance li $v0, 4 #\ subu $sp, 40 #\ Push the stack move $a0, $s2 # > Print a string sw $ra, 36($sp) # \ Save return address syscall #/ sw $s3, 32($sp) # \ li $v0, 1 #\ move $a0, $s1 # > Print a number sw $s2, 28($sp) # > Entry Housekeeping syscall #/ sw $s1, 24($sp) # / save registers on stack li $v0, 4 #\ sw $s0, 20($sp) # / la $a0, nln # > Print a string (eol) move $v0, $0 #/ initialize exit code to 0 syscall #/ move $s1, $0 #\ addu $s0, $s0, 4 #\ index update and la $s0, list # \ Initialization bne $s0, $s3, again #/ end of loop la $s2, msg # / la $s3, list+36 #/ © 2012 Daniel J. Sorin 62 © 2012 Daniel J. Sorin 63 from Roth and Lebeck from Roth and Lebeck Example2 (cont.) Some Details/Quirks of the MIPS ISA # Exit Code • Register zero always has the value zero move $v0, $0 #\ lw $s0, 20($sp) # \ • Even if you try to write it! lw $s1, 24($sp) # \ • jal puts the return address PC+4 into the link register ($ra) lw $s2, 28($sp) # \ Closing Housekeeping lw $s3, 32($sp) # / restore registers • All instructions change all 32 bits of the destination register lw $ra, 36($sp) # / load return address (lui, lb, lh) and read all 32 bits of sources (add, sub, and, or, addu $sp, 40 # / Pop the stack jr $ra #/ exit(0) ; …) .end main # end of program • Immediate arithmetic and logical instructions are extended # Data Segment as follows: • logical immediates are zero-extended to 32 bits .data # Start of data segment • arithmetic immediates are sign-extended to 32 bits list: .word 35, 16, 42, 19, 55, 91, 24, 61, 53 msg: .asciiz "The sum is " • lb and lh extend data as follows: nln: .asciiz "\n" • lbu, lhu are zero extended • lb, lh are sign extended © 2012 Daniel J. Sorin 64 © 2012 Daniel J. Sorin 65 from Roth and Lebeck from Roth and Lebeck .