160 likes | 179 Views
Csci136 Computer Architecture II Lab#4 - Stack and Nested Procedures - Project#1: due on Feb 13, 2005 - Quiz#1 Feb.9, 2005. Stack and Nested Procedures. Why? -may be modified by others… Must be saved before you go! Return address Local parameters Others How? -save to stacks!
E N D
Csci136 Computer Architecture IILab#4 - Stack and Nested Procedures - Project#1: due on Feb 13, 2005 - Quiz#1Feb.9, 2005
Stack and Nested Procedures • Why? -may be modified by others… • Must be saved before you go! • Return address • Local parameters • Others • How? -save to stacks! • Before you go… addi $sp,$sp, -framesize sw $ra, framesize-4($sp) # save $ra save other regs if need be • Before you return… restore other regs if need be lw $ra, framesize-4($sp) # restore $ra addi $sp,$sp, framesize jr $ra
Example: Fibonacci Numbers 1/7 • Definition: F(n) = F(n – 1) + F(n – 2), F(0) and F(1) are defined to be 1. • C Programming: int fib(int n) { if(n == 0) { return 1; } if(n == 1) { return 1; } return (fib(n - 1) + fib(n - 2)); }
Example: Fibonacci Numbers 2/7 • Now, let’s translate this to MIPS! • You will need space for three words on the stack • Why three? • Return addr($ra) • n($a0) • temp sum($s0) • Write the Prologue: # Space for three words # Save the return address # Save $s0 addi $sp, $sp, -12 sw $ra, 8($sp) sw $s0, 4($sp) fib: ___________________ ___________________ ___________________
Example: Fibonacci Numbers 3/7 • Now write the Epilogue: lw $s0, 4($sp) lw $ra, 8($sp) addi $sp, $sp, 12 # Restore $s0 # Restore return address # Pop the stack frame # Return to caller fin: ___________________ ___________________ ___________________ jr $ra_____________
Example: Fibonacci Numbers 4/7 • Finally, write the body. The C code is below. Start by translating the lines indicated in the comments int fib(int n) { if(n == 0) { return 1; } /*Translate Me!*/ if(n == 1) { return 1; } /*Translate Me!*/ return (fib(n - 1) + fib(n - 2)); } # $v0 = 1 # # $t0 = 1 # addi $v0, $zero, 1_ _______, _____,_fin addi $t0, $zero, 1_ _______,______,_fin Continued on next slide. . . ___________________ __if (n == 0). . . ______ ____________ __if (n == 1). . . beq $a0 $zero beq $a0 $t0
Example: Fibonacci Numbers 5/7 • Finally, write the body. The C code is below. Start by translating the lines indicated in the comments int fib(int n) { … return (fib(n - 1) + fib(n - 2)); } # $a0 = n - 1 # # # # addi $a0, $a0, -1__ sw____, ___________ ___________________ lw____,____________ addi $a0, ___,_____ $a0 0($sp) jal fib $a0 0($sp) $a0, -1 Continued on next slide. . . ___________________ __Need $a0 after jal _ fib(n – 1) ______ __Restore $a0______ __$a0 = n – 2_________
Example: Fibonacci Numbers 6/7 • Remember that $v0 is caller saved! int fib(int n) { . . . return (fib(n - 1) + fib(n - 2)); } # Place fib(n – 1) # somewhere it won’t get # clobbered # # add $s0,_ ___,______ ___________________ add $v0, $v0, $s0__ To the epilogue and beyond. . . _______ $v0 $zero jal fib ____________________ ____________________ ____________________ __fib(n – 2) __________ __$v0 = fib(n-1) + fib(n-2)
Example: Fibonacci Numbers 7/7 • Here’s the complete code for reference fib: addi $sp, $sp, -12 sw $ra, 8($sp) sw $s0, 4($sp) addi $v0, $zero, 1 beq $a0, $zero, fin addi $t0, $zero, 1 beq $a0, $t0, fin addi $a0, $a0, -1 sw $a0, 0($sp) jal fib lw $a0, 0($sp) addi $a0, $a0, -1 add $s0, $v0, $zero jal fib add $v0, $v0, $s0 fin: lw $s0, 4($sp) lw $ra, 8($sp) addi $sp, $sp, 12 jr $ra
Exercise • Show the content of the stack when computing Fib(2). • Assume the top of the stack is at address 0x7FFF and initially the stack is empty. • fib(2)=fib(1)+fib(0) • fib(1)=fib(0)=1
Project#1: MergeSort • Procedure Mergesort (input A[1:n], i,j; output B[1:n]) begin Datatype C[1:n]; If i=j then B[i] = A[i]; Return; endif Mergesort (A,i,(i+j)/2;C); /* sorts the first half*/ Mergesort (A,(i+j)/2 +1,j;C); /* sorts the second half*/ Merge(C,i,j;B); /*merges the two sorted halves * *into a single sorted list */ end
Project#1: MergeSort • Example:
Quiz#1 • Give the MIPS code to load a large constant number 0xABCD9876 into register $s0. • Why not lw? • Compile the C code A[5]=A[4]+100 into MIPS code, where A is an integer array. • MIPS Addressing mode • Immediate addressing • Register addressing • Base/Displacement addressing • PC-relative addressing
Quiz#1 • Specify the types of the following MIPS instructions. Describe the changes to PC after each instruction is executed. • Lw $s5, 8($sp) • Jr $31 • Beq $1, $2, 100 • J, Jr, Jal …
Quiz#1 • Fast multiplication: int fmult(int a,b) { if(b == 0) { return 0; } if (even(b)) return fmult(2*a,b/2); if (odd(b)) return (a+fmult(a, b-1)); } • Use stack in your programming! • Nested Procedures