CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)
description
Transcript of CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)
![Page 1: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/1.jpg)
CSCE 230, Fall 2013
Chapter 2Stacks and Subroutines (§ 2.6–2.7)
Mehmet Can Vuran, Instructor University of Nebraska-Lincoln
Acknowledgement: Overheads adapted from those provided by the authors of the textbook
![Page 2: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/2.jpg)
Stacks
A stack is a list of data elements whereelements are added/removed at top end only
Also known as pushdown stack orlast-in-first-out (LIFO) stack
We push a new element on the stack topor pop the top element from the stack
Programmer can create a stack in the memory There is often a special processor stack as well
2
![Page 3: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/3.jpg)
Processor Stack
Processor has stack pointer (SP) registerthat points to top of the processor stack
Push operation involves two instructions:Subtract SP, SP, #4StoreRj, (SP)
Pop operation also involves two instructions:Load Rj, (SP)Add SP, SP, #4
Maintenance of stack requires checking when the stack is empty or overflows – can be done by checking the SP against lower and upper bounds.
Among other things, the processor stack is useful in subroutine calls.
3
![Page 4: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/4.jpg)
NIOS-II Registers
4
Stack pointer (SP) register(should) points to top of the processor stack
![Page 5: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/5.jpg)
5
SP = 100
Initial Stack
60646872768084889296100 [something]
![Page 6: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/6.jpg)
6
SP = 92 N
#A
Add coupleinput parameters
60646872768084889296100 [something]
![Page 7: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/7.jpg)
7
#AN
SP = 72
R1R2
After register saves
R3R4R5
60646872768084889296100 [something]
![Page 8: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/8.jpg)
8
#AMax Value
SP = 72
R1R2
Update stackwith an output parameter
R3R4R5
60646872768084889296100 [something]
![Page 9: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/9.jpg)
9
SP=92
After returnfrom a function
#AMax Value
60646872768084889296100 [something]
![Page 10: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/10.jpg)
10
SP=100
After stack restoreby calling program
60646872768084889296100 [something]
![Page 11: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/11.jpg)
The first rule of stack operations is… You do not talk about…
Leave the stack as you found it *
* some exceptions apply
11
![Page 12: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/12.jpg)
Main Usages of Stack
Subroutine calls
Parameter passing
12
![Page 13: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/13.jpg)
Subroutine Linkage
During execution of Call instruction,PC upated to point to instruction after Call
Save this address for Return instruction to use Simplest method: place address in link
register (return address register) Call instruction performs two operations:
store updated PC contents in link register,then branch to target (subroutine) address
Return just branches to address in link register
![Page 14: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/14.jpg)
NIOS-II Registers
14
![Page 15: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/15.jpg)
![Page 16: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/16.jpg)
Subroutines Nesting: Example
16
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
![Page 17: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/17.jpg)
Subroutines Nesting: Example
17
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
1000
204PC
LINK
![Page 18: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/18.jpg)
Subroutines Nesting: Example
18
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
1000
204
PC
LINK
![Page 19: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/19.jpg)
Subroutines Nesting: Example
19
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
1000
204
PC
LINK
![Page 20: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/20.jpg)
Subroutines Nesting: Example
20
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
2000
1604
204
PC
LINK
![Page 21: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/21.jpg)
Subroutines Nesting: Example
21
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
2000
1604
PC
LINK
![Page 22: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/22.jpg)
Subroutines Nesting: Example
22
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
#Return+4
1604
PC
LINK
![Page 23: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/23.jpg)
Subroutines Nesting: Example
23
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
1604
1604
PC
LINK
![Page 24: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/24.jpg)
Subroutines Nesting: Example
24
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
1604
1604
PC
LINK
![Page 25: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/25.jpg)
Subroutines Nesting: Example
25
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
1604
1604
PC
LINK
![Page 26: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/26.jpg)
Subroutines Nesting: Example
26
SUB1 SUB2 SUB3
1000 First Instr.
. .
1600 Call SUB3
1604 Next Instr.
. .Return
. . .
200 Call SUB2204 Next Instr.
. . .
2000 First Instr. . .
.Return
1604
1604
PC
LINK
ERROR!
![Page 27: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/27.jpg)
Analysis and Solution
When nested calls are made, the last call made is first one to be returned, i.e. the call-return protocol is Last-In First-Out (LIFO).
The nested calls can be arbitrarily deep, e.g. for recursive routines.
Hence, subroutines use the processor stack to store the Link register values during nested calls.
27
![Page 28: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/28.jpg)
Parameter Passing
Mechanism hidden in HLL but must be explicit in assembly language.
A program may call a subroutine many times with different data to obtain different results
Information exchange to/from a subroutineis called parameter passing
Pass input parameters before the subroutine Call receive output parameters after the call
Parameters may be passed & received in registers Simple, but limited to available registers Alternative: use stack for parameter passing,
and also for local variables & saving registers28
![Page 29: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/29.jpg)
Example: Parameters Passed in Registers Convert the example program of finding the max of N
numbers to a subroutine: Calling program provides N (number of elements) and the
address of the first number (i.e., A[0]) Subroutine MAX(N, #A) returns the max value of N numbers
stored starting at location #A. Hence, there are two input parameters and one output
parameter. First, consider passing& receiving parameters in registers (we
use the register assignments in the code we developed earlier to keep it simple)▪ N in reg. R3▪ Address #A of A[0] in reg. R5▪ Max value returned in R1
Assume the values of N and A[0] are at location N and A.29
![Page 30: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/30.jpg)
Sketch of Solution Calling Program
Load parameters N and A in the designated registers (R3 & R5) Call MAX Return value should be available in the designated register (R1)
Subroutine (MAX) Push registers (other than parameter registers) used by the
subroutine on the stack (i.e. push R2 and R4) Find the value of the max element and place it in R1 (code identical
to what we already saw except for the last two lines, since the value is to be returned in register R1)
Pop registers from the stack (& update stack) Return
Note: Since MAX does not call another subroutine (it is a leaf subroutine), it does not need to save the Link register on the stack.
30
![Page 31: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/31.jpg)
Sketch of Solution (contd.)
Calling Program Load parameters in designated registers
Move R3, #N # Location of NLoad R3, (R3) # Value of NLoad R5, #A # Address of first
element
Call MAXCall MAX
Max value will be available in R1 after return
31
![Page 32: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/32.jpg)
Sketch of Solution (contd.)
Subroutine (MAX) Push registers R2 and R4 used by the subroutine on the stack
Subtract SP, SP, #8 # Create room for two itemsStore R2, 4(SP) # Push R2Store R4, (SP) # Push R4
Find the value of the max element<Code here from before except last two lines>
Pop registers from the stack (& update stack)Load R2, 4(SP) # Restore R2Load R4, (SP) # Restore R4Add SP, SP, #8 # Update stack pointer ReturnReturn
32
![Page 33: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/33.jpg)
Convert Max(N,A) Code to Subroutine: Original Code
33
Variable: Max
i #N =(Addr. N)
A[i]
#A=Addr. A[0]
Register
R1 R2
R3 R4 R5
Move R3, #NLoad R3, (R3)Move R5, #ALoad R1, (R5)Move R2, #1
Loop: Add R5, R5, #4Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) LoopMove R2, #MaxStore R1, (R2)
Assembly Code
![Page 34: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/34.jpg)
Convert Max(A,N) Code to Subroutine (1)
Break the Code into three pieces:1. Becomes part of calling
program for passing parameters
2. Becomes part of the subroutine; precede it with register saves; follow it with register restores and return
3. Becomes part of calling program to save returned value
34
Variable: Max
i #N =(Addr. N)
A[i]
#A=Addr. A[0]
Register
R1 R2
R3 R4 R5
Move R3, #NLoad R3, (R3)Move R5, #ALoad R1, (R5)Move R2, #1
Loop: Add R5, R5, #4Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) LoopMove R2, #MaxStore R1, (R2)
Assembly Code
1
2
3
![Page 35: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/35.jpg)
Convert Max(A,N) Code to Subroutine (2)
35
Variable: Max
i #N =(Addr. N)
A[i]
#A=Addr. A[0]
Register
R1 R2
R3 R4 R5
Move R3, #NLoad R3, (R3)Move R5, #A
Move R2, #MaxStore R1, (R2)
Calling Program
Load R1, (R5)Move R2, #1
Loop: Add R5, R5, #4Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) Loop
1
2
3
MAX Subroutine
![Page 36: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/36.jpg)
Convert Max(A,N) Code to Subroutine (3)
36
Variable: Max
i #N =(Addr. N)
A[i]
#A=Addr. A[0]
Register
R1 R2
R3 R4 R5
Move R3, #NLoad R3, (R3)Move R5, #A
Move R2, #MaxStore R1, (R2)
Calling Program
Load R1, (R5)Move R2, #1
Loop: Add R5, R5, #4Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) Loop
1
2
3
MAX Subroutine
Call MAX
MAX:<Save local variables and saving registers
on stack>
<Restore locals and saving registers on stack>
Return
![Page 37: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/37.jpg)
Convert Max(A,N) Code to Subroutine (4)
37
Variable: Max
i #N =(Addr. N)
A[i]
#A=Addr. A[0]
Register
R1 R2
R3 R4 R5
Move R3, #NLoad R3, (R3)Move R5, #A
Move R2, #MaxStore R1, (R2)
Calling ProgramLoad R1, (R5)
Move R2, #1Loop: Add R5, R5, #4
Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) Loop
12
3
MAX Subroutine
MAX: Subtract SP, SP, #8Store R2, 4(SP)Store R4, (SP)
Load R2, 4(SP)Load R4, (SP)Add SP, SP, #8Return
Call MAX
![Page 38: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/38.jpg)
Exercise
Convert the code for the calling program and MAX to Nios II and verify it works as expected.
38
![Page 39: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/39.jpg)
Passing Parameters on the Stack Assume A calls B with input parameters i1, …,in
and B returns resulting values o1, …, om. Assume m <= n (common case).
General Scheme: A pushes i1, …,in on the stack and calls B. B pushes any (saving) registers it would need for its
computation on the stack; also the return-address register if it is not a leaf procedure.
B performs its computation and writes the resulting values o1, …, om on the stack (reusing the space used by input parameters).
B pops the saving registers from the stack and returns.39
![Page 40: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/40.jpg)
Passing Parameters on the Stack: Example Max(A,N) Calling Program
Push input parameters onto stack (grows high to low),Subtract SP, SP, #8 # Create room for 2 itemsLoad R2, #N # Address of N in R2Load R2, (R2) # Value of N in R2Store R2, 4(SP) # Push it on the stackLoad R2, #A # Get the second parameter in R2Store R2, (SP) # push it on the stack
Call subroutineCall MAX
Get max value from the stack and restores stack (pop input parameters) Load R1,4(SP) # Result pushed on stack by MAX # Result overwrites value of N on stackAdd SP, SP, #8 #Effectively pops stack
40
![Page 41: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/41.jpg)
Passing Parameters on the Stack: Example Max(A,N) - (contd.)
Subroutine MAX Save all regs. it will use (R1 – R5) on stack
Subtract SP, SP, #20 Create room for five itemsStore R1, 16(SP) Push R1Store R2, 12(SP) Push R2… …Store R5, (SP) Push R5
Load input parameters from stack and compute sumLoad R3, 24(SP) Get N into R3Load R5, 20(SP) Get #A into R5
Body of the Subroutine: <Code from before will need to change – see later how>
Restore saved registers and pop stack, returnLoad R1, 16(SP) Restore R1Load R2, 12(SP) R2… …Load R5, (SP) R5Add SP, SP, #20 Pop stackReturn Return to calling program
41
![Page 42: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/42.jpg)
Passing Parameters on the Stack: Changes to Max(A,N)
Required Changes1. Push R1–R5 on stack2. R3 and R5 must be
initialized from the stack3. Last two lines must be
replaced with pushing the result in R1 onto stack where input parameter N was passed.
4. Restore R1-R5 and pop stack
5. Return42
Move R3, #NLoad R3, (R3)Move R5, #ALoad R1, (R5)Move R2, #1
Loop: Add R5, R5, #4Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) LoopMove R2, #MaxStore R1, (R2)
Earlier Assembly Code
![Page 43: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/43.jpg)
43
SP = 100
Initial Stack
60646872768084889296100 [something]
![Page 44: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/44.jpg)
44
SP = 92 N
#A
Add coupleparameters
60646872768084889296100 [something]
![Page 45: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/45.jpg)
45
#AN
SP = 72
R1R2
After register saves
R3R4R5
60646872768084889296100 [something]
![Page 46: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/46.jpg)
46
#AMax Value
SP = 72
R1R2
Update stackwith output parameter
R3R4R5
60646872768084889296100 [something]
![Page 47: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/47.jpg)
47
SP=92
After returnfrom a function
#AMax Value
60646872768084889296100 [something]
![Page 48: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/48.jpg)
48
SP=100
After stack restoreby calling program
60646872768084889296100 [something]
![Page 49: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/49.jpg)
Passing Parameters on the Stack: Changes to Max(A,N)
Required Changes1. Push R1–R5 on
stack
49
MAX: Subtract SP, SP, #20Store R1, 16(SP) Push R1Store R2, 12(SP) Push R2
… …Store R5, (SP) Push R5Move R3, #NLoad R3, (R3)Move R5, #ALoad R1, (R5)Move R2, #1
Loop: Add R5, R5, #4Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) LoopMove R2, #MaxStore R1, (R2)
![Page 50: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/50.jpg)
Passing Parameters on the Stack: Changes to Max(A,N)
Required Changes1. Push R1–R5 on
stack2. R3 and R5
must be initialized from the stack
50
MAX: Subtract SP, SP, #20Store R1, 16(SP) Push R1Store R2, 12(SP) Push R2
… …Store R5, (SP) Push R5Load R3, 24(SP)Load R5, 20(SP)Move R2, #1
Loop: Add R5, R5, #4Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) LoopMove R2, #MaxStore R1, (R2)
![Page 51: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/51.jpg)
Passing Parameters on the Stack: Changes to Max(A,N)
Required Changes1. Push R1–R5 on stack2. R3 and R5 must be
initialized from the stack
3. Last two lines must be replaced with pushing the result in R1 onto stack where input parameter N was passed.
51
MAX: Subtract SP, SP, #20Store R1, 16(SP) Push R1Store R2, 12(SP) Push R2
… …Store R5, (SP) Push R5Load R3, 24(SP)Load R5, 20(SP)Move R2, #1
Loop: Add R5, R5, #4Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) LoopStore R1, 24(SP)
![Page 52: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/52.jpg)
Passing Parameters on the Stack: Changes to Max(A,N)
Required Changes1. Push R1–R5 on stack2. R3 and R5 must be
initialized from the stack
3. Last two lined must be replaced with pushing the result in R1 onto stack where input parameter N was passed.
4. Restore R1-R5 and pop stack
52
MAX: Subtract SP, SP, #20Store R1, 16(SP) Push R1Store R2, 12(SP) Push R2
… …Store R5, (SP) Push R5Load R3, 24(SP)Load R5, 20(SP)Move R2, #1
Loop: Add R5, R5, #4Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) LoopStore R1, 24(SP)Load R1, 16(SP) Restore R1Load R2, 12(SP) Restore R2
… …Load R5, (SP) Restore R5Add SP, SP, #20
![Page 53: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/53.jpg)
Passing Parameters on the Stack: Changes to Max(A,N)
Required Changes1. Push R1–R5 on stack2. R3 and R5 must be
initialized from the stack
3. Last two lined must be replaced with pushing the result in R1 onto stack where input parameter N was passed.
4. Restore R1-R5 and pop stack
5. Return
53
MAX: Subtract SP, SP, #20Store R1, 16(SP) Push R1Store R2, 12(SP) Push R2
… …Store R5, (SP) Push R5Load R3, 24(SP)Load R5, 20(SP)Move R2, #1
Loop: Add R5, R5, #4Load R4, (R5)Branch_if_(R1>=R4) SkipMove R1, R4
Skip: Add R2, R2, #1Branch_if_(R3>R2) LoopStore R1, 24(SP)Load R1, 16(SP) Restore R1Load R2, 12(SP) Restore R2
… …Load R5, (SP) Restore R5Return
![Page 54: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/54.jpg)
Exercise
Convert the code for the calling program and Max to Nios II and verify it works as expected.
54
![Page 55: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/55.jpg)
ITOAH (Non-Recursive)
The next three slides show step-by-step development ofassembly code for another example of a non-recursive procedure.
You should study this carefully and then do the following exercise to convert the code to a subroutine, to understand better the process we used to convert the max-finding program
![Page 56: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/56.jpg)
Integer to ASCII-HEX conversion(Non-recursive Program)
itoah(n, S) /* Convert positive integer n to hexadecimal string S in ASCII - non recursive */
int n; char S[];
{int i, ji = 0;do {
j = n % 16; /* modulo-16 operator */if(j<10) S[i++] = j + '0'; else S[i++] = j-10+'A’ /* i++ is C syntax */
} while ((n = n/16) > 0); /* while condition checked at the end of the loop */}
1. Hand-simulate the program for the call itoah(95, S).2. Assume, input parameters n & S, and the local variables i & j are mapped to
registers R2, R3, R4, and R5 respectively. Further, assume that the programrequires no other registers to compute the body of the loop. Show the stack state: (1) before the call to itoah (2) after the call just before the first instruction in the body is executed, and (3) just before the procedureis ready to return.
61
![Page 57: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/57.jpg)
HLL to Intermediate Code
62
{int i, ji = 0;do {
j = n % 16;if(j<10) S[i++] = j +
'0'; else S[i++] = j-
10+'A’ } while ((n = n/16) > 0)
}
{int i, ji = 0;do {
j = n % 16;if(j<10) S[i++] = j +
'0'; else S[i++] = j-
10+'A’ } while ((n = n/16) > 0)
}
![Page 58: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/58.jpg)
Intermediate to Assembly Code
63
n S[i] i j
R2 R3 R4 R5Register Assignments:
i = 0LOOP:
j = n and 0xFif(j<10) toto L1S[i] = j – 10 +
‘A’goto L2
L1: S[i] = j + ‘0’L2: i = i+1
n = n/16if(n>0) goto
LOOP
Move R4, R0LOOP:
And R5, R2, #0xFBranch_if_(R5<#10) L1Subtract R3, R5, #10Add R3, R3, #41Branch L2
L1: Add R3, R5, #30L2: Add R4, R4, #1 Right_Shift R2, R2, 4
Branch_if_(R2>0) LOOP
Intermediate Code Assembly Code
![Page 59: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/59.jpg)
Exercise
Convert the itoah program to two programs: main that calls the subroutine itoah. Assume parameters n and #S are passed in registers.
Note that string S is both an input and the output parameter.
64
![Page 60: CSCE 230, Fall 2013 Chapter 2 Stacks and Subroutines ( § 2.6–2.7)](https://reader035.fdocuments.in/reader035/viewer/2022062410/568161e8550346895dd2179b/html5/thumbnails/60.jpg)
Integer to ASCII-HEX conversion(Recursive)
itoah(n, S, i) /* Convert positive integer n to hexadecimal string S in ASCII , i is index - recursive program*/
int n, i; char S[];{
int j;
if ((j = n/16) != 0) /* integer division */itoah(j, S, i+1);
j = n % 16;if(j<10) S[i] = j + '0'; else S[i] = j-10+'A'
}
1. Hand-simulate the program for the call itoah(95, S, 0).2. Assume, input parameters n, S, and i and the local variable j are mapped to
registers R2, R3, R4, and R5 respectively. Further, assume that the programrequires no other registers to compute the body of the loop. Show the stack state: (1) before each call (2) after each call just before the first instruction in the body is executed, and (3) just before the program is ready to return.
65