CS 230 – Introduction to Computers and Computer Systems Lecture 12 – Subroutines CS 230 - Spring 2020 2-1
Subroutines Also called functions, methods, or procedures all the same thing in assembly language examples from C: sqrt() or printf() Important technique to modularize programs separation of concerns, smaller coding units Challenges call/return – how to redirect execution? how do I get back to where I came from? arguments (parameters) and result(s) passing CS 230 - Spring 2020 2-2
Calling jal x J ump A nd L ink copy (current PC + 4) into register $31 set PC to x (where x is a label) labels mark the start of functions same type of labels we use for beq and bne x can also be an immediate (don’t do this) CS 230 - Spring 2020 2-3
Indirect Calling jalr $q J ump A nd L ink R egister copy (current PC + 4) into register $31 set PC to contents of register $q load address of label into $q with lis value in $q is called a function pointer allows functions to be passed as parameters CS 230 - Spring 2020 2-4
Returning jr $s J ump R egister set PC to $s usually jr $31 register $31 holds return address register $31 begins with the outer return address jr $31 to this address ends the program CS 230 - Spring 2020 2-5
Calling and Returning Example function addTwoNumbers: add $2, $4, $5 jr $31 Call that function jal addTwoNumbers Call that function indirectly lis $1 .word addTwoNumbers jalr $1 Need more than this (wait for slide 9) CS 230 - Spring 2020 2-6
Execution Context Subroutines can call subroutines what happens to outer subroutine’s parameters? what happens to old value of register $31? How about registers that are in use? who gets to use which registers? Save/restore current execution context when a function is called set of registers following the register conventions save to the stack CS 230 - Spring 2020 2-7
Register Conventions $2, $3 – function return values $4 - $7 – function arguments (parameters) $1, $8 - $15, $24, $25 – unsaved temporary $16 - $23 – saved temporary $26 - $29 – reserved for operating system $30 – stack pointer $31 – return address (always save on stack) CS 230 - Spring 2020 2-8
Calling Expanded Calling a function addi $30, $30, -4 sw $31, 0($30) jal addTwoNumbers lw $31, 0($30) addi $30, $30, 4 Calling a function indirectly lis $1 .word addTwoNumbers addi $30, $30, -4 sw $31, 0($30) jalr $1 lw $31, 0($30) addi $30, $30, 4 Might want to store other registers on stack too CS 230 - Spring 2020 2-9
Arguments and Return Arguments are in registers $4-$7 in order as needed example: addTwoNumbers would use $4 and $5 Return values (results) in registers $2 and $3 used in order as needed functions may have zero, one, or two results example: addTwoNumbers would place sum in $2 CS 230 - Spring 2020 2-10
Unsaved Temporaries $1, $8 - $15, $24, $25 “if I call a function, I must assume it overwrites these registers” “I am free to modify these registers at any time” “if I call a function but I want to preserve a value from one of these registers, I must store that value on the stack” “or in a saved temporary” $2, $3, $4-$7 (function results and arguments) can be treated as unsaved temporaries with extra functionality CS 230 - Spring 2020 2-11
Saved Temporaries $16 - $23 “if I call a function I can assume it will not modify these registers” “if I modify one of these registers, I must save the old value on the stack first and then restore that value after I am done using the register” CS 230 - Spring 2020 2-12
Preserving the Stack A function must preserve the value of the stack pointer Always add back any value you subtracted from the stack pointer before ending a function The stack pointer should have the same value at the begging and end of a function CS 230 - Spring 2020 2-13
Example addi $4, $0, 15 addi $5, $0, 13 addi $30, $30, -4 sw $31, 0($30) jal addTwoNumbers lw $31, 0($30) addi $30, $30, 4 jr $31 addTwoNumbers: add $2, $4, $5 jr $31 What’s the value in register $2 at the end of the program? CS 230 - Spring 2020 2-14
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C ? addi $30, $30, 4 0x80 ? SP = jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x1C 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? … 0x80 0 ? ? ? ? end of the program? CS 230 - Spring 2020 2-15
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C ? addi $30, $30, 4 0x80 ? SP = jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x20 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? 15 ? … 0x80 0 ? ? end of the program? CS 230 - Spring 2020 2-16
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C ? addi $30, $30, 4 0x80 ? SP = jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x24 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? 15 13 … 0x80 0 ? ? end of the program? CS 230 - Spring 2020 2-17
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C ? SP = addi $30, $30, 4 0x80 ? jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x28 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? 15 13 … 0x7C 0 ? ? end of the program? CS 230 - Spring 2020 2-18
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C SP = addi $30, $30, 4 0x80 ? jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x2C 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? 15 13 … 0x7C 0 ? ? end of the program? CS 230 - Spring 2020 2-19
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C SP = addi $30, $30, 4 0x80 ? jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x3C 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? 15 13 … 0x7C 0x30 0 ? ? end of the program? CS 230 - Spring 2020 2-20
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C SP = addi $30, $30, 4 0x80 ? jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x40 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? 28 ? 15 13 … 0x7C 0x30 0 end of the program? CS 230 - Spring 2020 2-21
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C SP = addi $30, $30, 4 0x80 ? jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x30 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? 28 ? 15 13 … 0x7C 0x30 0 end of the program? CS 230 - Spring 2020 2-22
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C SP = addi $30, $30, 4 0x80 ? jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x34 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? 28 ? 15 13 … 0x7C 0 end of the program? CS 230 - Spring 2020 2-23
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C addi $30, $30, 4 0x80 ? SP = jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x38 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? 28 ? 15 13 … 0x80 0 end of the program? CS 230 - Spring 2020 2-24
Example addi $4, $0, 15 ? 0x64 addi $5, $0, 13 0x68 ? 0x6C ? addi $30, $30, -4 0x70 ? sw $31, 0($30) 0x74 ? jal addTwoNumbers 0x78 ? lw $31, 0($30) 0x7C addi $30, $30, 4 0x80 ? SP = jr $31 0x84 ? 0x88 ? addTwoNumbers: add $2, $4, $5 PC = 0x3C 10 jr $31 $0 $1 $2 $3 $4 $5 ... $30 $31 What’s the value in register $2 at the ? 28 ? 15 13 … 0x80 0 end of the program? $2 = 28 10 CS 230 - Spring 2020 2-25
Example Assume there exists a subroutine fact which takes one parameter x returns x! ( x factorial). Write a MIPS assembly language program that uses that subroutine and adds the factorials of the value in register $1 and the value in register $2 together and places the result in register $2. Follow the register conventions. CS 230 - Spring 2020 2-26
Recommend
More recommend