Lecture 09 Subroutines v14 - Electrical and Computer Engineering

advertisement
ECE 2560
L9: Subroutines
Department of Electrical and
Computer Engineering
The Ohio State University
ECE 3561 - Lecture 1
1
Subroutines

Subroutines
What are they
 How they can simplify a program
 An example


Stacks
Passing data on the stack
 How subroutine calls use the stack

ECE 3561 - Lecture 1
2
Stacks

The stack –
an area of
memory for
storage of
data
accessed
through the
PUSH and
POP
instructions
ECE 3561 - Lecture 1
3
The 430 stack

After initialization – where is the stack?


After initialization the value in the SP register (R2)
is 0x0300 (can see this in Code Composer)
Placing data on the stack


Done using a PUSH(.B) instruction
PUSH(.B) src Push the source onto stack


Action is SP-2-> SP
src->@SP
Removing data from the stack


Done using a POP(.B) instruction
POP(.B) dst Pop item from stack to destination

Action is @SP-> dst
SP+2 -> SP
ECE 3561 - Lecture 1
4
Also in code composer







If you view memory it will show you data variables
names at their location
To see action of stack will do some push and pop
actions while watching memory
Will push values of 10 copies of $FFFF on the stack
Then 10 pops to get the SP back to no data – pop
into R4
Then push $0000,$0110,$0220,etc up to $0990 on
the stack
Again 10 pops back into R4
Also show what occurs when one is .B
ECE 3561 - Lecture 1
5
In Demo
After initialization, the SP is set to value
0x0300.
 Remember that the stack grows down in
memory and the SP register points to
where the last value pushed on the stack
is. So when a value is pushed on the
stack it, the SP register is decremented
by 2 and then the data is stored in
memory.

ECE 3561 - Lecture 1
6
Binary Multiplication


Need to perform integer multiplication of A*B.
Will do this by simply adding up the value B, A times in a
loop.

mult






mlp
mov
mov
clr
add
dec
jne
A,R5
B,R6
R7
R6,R7
R5
mlp
;A is in R5
;B is in R6
;R7 to accumulate sum
;add R6 to R7
;A=A-1
;repeat
;end R7=B*A
As register is 16 bits and treated as 2’s complement, can
do up to a 7-bit x 7-bit multiply for a 14 bit result.
 Number of times through the loop? 128 times max

ECE 3561 - Lecture 1
7
Now turn this into a subroutine

Could code up the previous instructions each
time you need to do a multiply OR create a
routine to do it. The routine needs the data to
multiply passed to it.
 Where to pass the data?




Could do it in registers
Could do it in memory
Could do it on the stack
Set up before call


move A and B to stack
use push instruction
ECE 3561 - Lecture 1
8
Why one an not the other?

Why pass the data on the stack?

Pass it in registers


Pass in variables in memory


Works fine but program may be using registers for other
tasks.
Works fine
Pass on the stack

Also works fine

For a simple routine like this no real advantage
of any method. Just shows how to do pass
variables on the stack.
 Will look at subroutine for all three.
ECE 3561 - Lecture 1
9
Demo of routine – use registers

Pick two register to pass data







Pick R5, and R6 for numbers to be multiplied
Pick R7 for the result
Code it up – calling routine
mov
A,R5
mov
B,R6
call
#mult
end
jmp
end
;A is in R5
;B is in R6







;the subroutine
mult
clr
mlp
add
dec
jne
ret
R7
R6,R7
R5
mlp
;R7 to accumulate sum
;add R6 to R7
;A=A-1
;repeat
;end R7=B*A





.data
A
B
RES
.word
.word
.word
3
5
0
ECE 3561 - Lecture 1
10
Subroutine call/return

At end of subroutine code need a ret instruction.
(see manual) RET




Note action of instruction
@SP  PC
SP + 2  SP
The CALL instruction action – again see manual.




dst
SP-2
PC
tmp
 tmp
 SP
 @SP
 PC (tmp is not a register you can see)
ECE 3561 - Lecture 1
11
Demo of routine – use memory

Pick memory locations to pass data







A and B are the data to be multiplied
RES is the result
Code it up – calling routine
mov
#3,&A
mov
#4,&B
call
#mult
end
jmp
end







;the subroutine
mult
clr
mlp
add
dec
jne
ret
&RES
&B,RES
&A
mlp
;RES to accumulate sum
;add B to RES
;A=A-1
;repeat
;end RES=B*A





.data
A
B
RES
.word
.word
.word
3
5
0
ECE 3561 - Lecture 1
12
A third way – the stack
First two methods work, BUT
 Limitations

REGISTER USE is fixed
 Subroutine restricted to specific registers
 For subroutine to have no side effects, must
protect any register it uses.

ECE 3561 - Lecture 1
13
The main and subroutine

In Main program









;Setup for call
mov A,R5
mov B,R6
push R5
push R6
call #srmult
;after return have to cleanup
SP will be pointing to B – result is A
pop stack twice – 2nd time is result position
ECE 3561 - Lecture 1
14
Subroutine

Now in subroutine

srmult







mlp
mov
mov
clr
add
dec
jne
mov
ret
2(SP),R6 ;B to R6
4(SP),R5 ;A to R5
R7
R6,R7
R5
mlp ;at end R7 is A*B
R7,4(SP) ;R7 for rtn
;return from sr
ECE 3561 - Lecture 1
15
But the call can be a problem


Have to make sure that call works correctly
The first time this was done, call was transferring control all over
the place or so it seemed.















;in main
mov
mov
push
push
mov
call
pop
pop
push
push
call
pop
pop
mov
A,R5
B,R6
R5
R6
#smult,R4
R4
R7
R7
R5
R6
#smult
R7
R7
R7,res
;subroutine
smult
mov
mov
ret
2(SP),R6
4(SP),R5
;this code worked
ECE 3561 - Lecture 1
16
Get code working

When having problems get some code
working and then build on it
In this case will build the subroutine
 Demo

ECE 3561 - Lecture 1
17
Multiply routine
The multiply routine is important as there
is no multiply instruction
 Note that the routine is for positive
integer multiplication only.
 With the algorithm implemented cannot
multiply a negative number
 Both A and B and the result have to be
between 0 and 215-1, positive integers

ECE 3561 - Lecture 1
18
Clean up the stack




After returning from subroutine
A ret simply pops the return address from
the stack into the PC register
So execution continues after the subroutine
call
If data was passed on the stack it needs to
be cleaned up to retrieve the result and set
the SP to before the call.

ECE 3561 - Lecture 1
19
The pop instruction

The pop instruction removes the top item
of the stack (the item currently pointed to
by the SP register) and moves it to dst.

POP(.B) dst
destination

Pop item from stack to
Action is @SP-> dst
SP+2 -> SP
ECE 3561 - Lecture 1
20
Cleanup on Return

Same code – note the pop instructions that remove
data and result from the stack












;in main
mov
mov
push
push
mov
call
call
pop
pop
mov
A,R5
B,R6
R5
R6
#smult,R4
R4
#smult
R7
R7
R7,res
;subroutine
smult mov
mov
ret
2(SP),R6
4(SP),R5
;this code worked
ECE 3561 - Lecture 1
21
Subroutine side effects

Subroutine should have no side effects!,i.e., change
the values of registers or data the main program is
using



If subroutine should have no side effects then the state
of machine (registers, memory, etc.) should be the
same after the RTS as before the call. What does that
mean?
That means that subroutine needs to preserve any
register that it will affect during execution of the
subroutine.
What are they? (refer to slide 11)


CALL and RET do not affect SR
Action in subroutine will alter sr bits, and here contents of R5,
R6, and R7
ECE 3561 - Lecture 1
22
Items to preserve

The first item to preserve is the SR


How to do it? Push it onto the stack.
What else to save? Any register used.
ECE 3561 - Lecture 1
23
Saving of the SR (R(2))

Save the register you will use and SR.
smult
mlp

mov
mov
clr
add
dec
jne
mov
ret
2(SP),R6
4(SP),R5
R7
R6,R7
R5
mlp
R7,4(SP)
smult
Becomes ------- ->
mlp
State of SR upon
 return is same as it
 was before the call.

ECE 3561 - Lecture 1
push
mov
mov
clr
add
dec
jne
mov
pop
ret
R2
4(SP),R6
6(SP),R5
R7
R6,R7
R5
mlp
R7,6(SP)
R2
24
Save other registers

Subroutine used R5,R6,R7 – push on
Stack
ECE 3561 - Lecture 1
25
What is the code?

smult
mlp


Note the change to the offsets of the
passed arguments.
mov
mov
clr
add
dec
jne
mov
ret
2(SP),R6
4(SP),R5
R7
R6,R7
R5
mlp
R7,4(SP)
smult
mlp
push
mov
mov
clr
add
dec
jne
mov
pop
ret
R2
4(SP),R6
6(SP),R5
R7
R6,R7
R5
mlp
R7,6(SP)
R2
Now subroutine has no effect on
calling program.
ECE 3561 - Lecture 1
smult
mlp
push
push
push
push
mov
mov
clr
add
dec
jne
mov
pop
pop
pop
pop
ret
R2
R5
R6
R7
10(SP),R6
12(SP),R5
R7
R6,R7
R5
mlp
R7,12(SP)
R7
R6
R5
R2
26
Assignment

Code up a positive integer multiply
subroutine as shown in this lecture

Description of this is on the webpage
and is assignment HW6
ECE 3561 - Lecture 1
27
Download