faculty of computer science © 2006 cmput 229 subroutines - part 2 calling itself
Post on 19-Dec-2015
214 views
TRANSCRIPT
Faculty of Computer Science
CMPUT 229 © 2006
Subroutines - Part 2
Calling Itself
© 2006
Department of Computing Science
CMPUT 229
Calling Itself
int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
© 2006
Department of Computing Science
CMPUT 229
Linking a Recursive Procedureint fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
D0
A6
SP
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10004000
3
Memory
SP $8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
D0
$12345678A6
$00008014SP
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$12345678
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
D0
$00008010A6
$0000800CSP
A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$12345678
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
D0
$00008010A6
$0000800CSP
A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$12345678
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
3D0
$00008010A6
$0000800CSP
A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$12345678
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008010A6
$0000800CSP
A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$12345678
2
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008010A6
$0000800CSP
A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$12345678
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008010A6
$00008008SP
A6
Assuming that call to subroutine
fact is at address $100024FC
$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008004A6
$00008000SP
A6$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008004A6
$00008000SP
A6$1000 2500
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008004A6
$00008000SP
A6$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00008004A6
$00008000SP
A6$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00008004A6
$00008000SP
A6$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00008004A6
$00007FFCSP
A6
$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FF8A6
$00007FF4SP
A6 $00008004$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FF8A6
$00007FF4SP
A6 $00008004$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FF8A6
$00007FF4SP
A6 $00008004$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
0D0
$00007FF8A6
$00007FF4SP
A6 $00008004$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
0D0
$00007FF8A6
$00007FF4SP
A6 $00008004
0
$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6) Compare with Zero
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
0D0
$00007FF8A6
$00007FF0SP
A6 $00008004
0
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$7FEC
$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
0D0
$00007FECA6
$00007FE8SP
A6
$00008004
0
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
0D0
$00007FECA6
$00007FE8SP
A6
$00008004
0
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FECA6
$00007FE8SP
A6
$00008004
0
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FECA6
$00007FE8SP
A6
$00008004
0
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FECA6
$00007FE8SP
A6
$00008004
0
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FF8A6
$00007FF0SP
A6 $00008004
0
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADDQ.L #4,SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FF8A6
$00007FF4SP
A6 $00008004
0
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP/A6
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FF8A6
$00007FF8SP
$00008004
0
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FF8A6
$00007FF0SP
$00008004
0
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
SP/A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00007FF8A6
$00007FF0SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
SP/A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00008004A6
$00007FFCSP
A6
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
SP
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
1D0
$00008004A6
$00008000SP
A6
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008004A6
$00008004SP
SP/A6
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
2
$12345678
$0008010
2
$10002500
$10004000
6
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008004A6
$00008004SP
SP/A6
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
2
$12345678
$0008010
2
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008010A6
$00008008SP
SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
2
$12345678
$0008010
2
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008010A6
$00008008SP
SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
2
$12345678
$0008010
2
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008010A6
$00008010SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
SP/A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
2
$12345678
$0008010
2
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
6D0
$00008010A6
$00008010SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
SP/A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
6
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
6D0
$00008010A6
$00008010SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
SP/A6
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
6
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
6D0
$12345678A6
$00008014SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
SP$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
6
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
6D0
$12345678A6
$00008018SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
SP
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
6
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
6D0
$12345678A6
$00008018SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$00007FF8$7FEC
1$7FE8
SP
$1000 3FFB MOVEQ #3,(SP)$1000 3FFC BSR fact$1000 4000 ….
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008010A6
$00008008SP
SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,D0$1000 3FFC BSR fact$1000 4000 ….
$00007FF8$7FEC
1$7FE8
A6
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
3
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
2D0
$00008010A6
$00008014SP
SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,D0$1000 3FFC BSR fact$1000 4000 ….
$00007FF8$7FEC
1$7FE8
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
6
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
6D0
$00008010A6
$00008010SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,D0$1000 3FFC BSR fact$1000 4000 ….
$00007FF8$7FEC
1$7FE8
SP/A6
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
6
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
6D0
$00008010A6
$00008010SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,D0$1000 3FFC BSR fact$1000 4000 ….
$00007FF8$7FEC
1$7FE8
SP/A6
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
6
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
6D0
$12345678A6
$00008010SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,D0$1000 3FFC BSR fact$1000 4000 ….
$00007FF8$7FEC
1$7FE8
SP
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
6
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
6D0
$12345678A6
$00008010SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,D0$1000 3FFC BSR fact$1000 4000 ….
$00007FF8$7FEC
1$7FE8
SP
© 2006
Department of Computing Science
CMPUT 229
Example: fact(3)int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }
M68K assembly:
fact: LINK A6,#-4
TST.L 8(A6)
BGT L6
MOVEQ #1,D0
MOVE.L D0,-4(A6)
BRA L5
L6: MOVE.L 8(A6),D0 n 1
SUBQ.L #1,D0 D0 n-1
MOVE.L D0,(SP)
BSR fact
ADD.L #4, SP
MULS.L 8(A6),D0
MOVE.L D0,-4(A6)
L5: MOVE.L -4(A6),D0
UNLK A6
RTS
$10002500
1
$12345678
$0008010
2
$10002500
$10004000
6
Memory
$8014
$8018
$8010
$800C
$8008
$8004
$8000
$7FFC
6D0
$12345678A6
$00008010SP
$00008004
1
$10002500
$7FF8
$7FF4
$7FF0
$1000 2500
$1000 3FFB MOVEQ #3,D0$1000 3FFC BSR fact$1000 4000 ….
$00007FF8$7FEC
1$7FE8
SP
© 2006
Department of Computing Science
CMPUT 229
Other Data Stored in the Stack
$sp
High Address
Low Address
$fp
Before procedurecall
$sp
High Address
Low Address
$fp
After procedurecall
$sp
High Address
Low Address
$fp
During procedurecall
Saved argumentregisters
Saved return reg.
Savedregisters
Local arraysand structures
Patt.-Hen. pp 139
© 2006
Department of Computing Science
CMPUT 229
ASCII Code
Code Char Code Char Code Char Code Char Code Char Code Char 32 Space 48 0 64 @ 80 P 96 ` 112 p 33 ! 49 1 65 A 81 Q 97 a 113 q 34 “ 50 2 66 B 82 R 98 b 114 r 35 # 51 3 67 C 83 S 99 c 115 s 36 $ 52 4 68 D 84 T 100 d 116 t 37 % 53 5 69 E 85 U 101 e 117 u 38 & 54 6 70 F 86 V 102 f 118 v 39 ‘ 55 7 71 G 87 W 103 g 119 w 40 ) 56 8 72 H 88 X 104 h 120 x 41 ( 57 9 73 I 89 Y 105 i 121 y 42 * 58 : 74 J 90 Z 106 j 122 z 43 + 59 ; 75 K 91 [ 107 k 123 { 44 , 60 < 76 L 92 \ 108 l 124 | 45 - 61 = 77 M 93 ] 109 m 125 } 46 . 62 > 78 N 94 ̂ 110 n 126 ~ 47 / 63 ? 79 O 95 _ 111 o 127 DEL
Patt.-Hen., pp 142
© 2006
Department of Computing Science
CMPUT 229
A Procedure that Doesn’t Call Another Procedure
void strcpy ( char x[ ], char y[ ]) { int i;
i = 0; while ((x[i] = y[i]) != 0) i = i + 1; }
Parameter Passing Conventionbase of array x[ ] A0base of array y[ ] A1
Assumptioni D0
M68K assembly:strcpy
ADD.L #4, SP Room in stack for 1 more itemMOVE D0, (SP) Save D0 into stackMOVEQ #0, D0 i 0
L1: MOVE.B (A1,D0), D4 D4 y[i]MOVE.B (A0,D0), D5 D5 y[i]TST D5 if y[I] = 0BEQ L2 doneADDQ #1, D0 i i + 1BRA L1 Repeat
L2: MOVE.L (SP), D0 Restore D0ADD.L #-4, SP pop one word off stackRTS return
© 2006
Department of Computing Science
CMPUT 229
A Procedure that Doesn’t Call Another Procedure
save D0 in stackvoid strcpy ( char x[ ], char y[ ]) { int i;
i = 0; while ((x[i] = y[i]) != 0) i = i + 1; }
M68K assembly:strcpy
ADD.L #4, SP Room in stack for 1 more itemMOVE D0, (SP) Save D0 into stackMOVEQ #0, D0 i 0
L1: MOVE.B (A1,D0), D4 D4 y[i]MOVE.B (A0,D0), D5 D5 y[i]TST D5 if y[I] = 0BEQ L2 doneADDQ #1, D0 i i + 1BRA L1 Repeat
L2: MOVE.L (SP), D0 Restore D0ADD.L #-4, SP pop one word off stackRTS return
Parameter Passing Conventionbase of array x[ ] A0base of array y[ ] A1
Assumptioni D0
© 2006
Department of Computing Science
CMPUT 229
A Procedure that Doesn’t Call Another Procedure
save $s0 in stack
i 0
void strcpy ( char x[ ], char y[ ]) { int i;
i = 0; while ((x[i] = y[i]) != 0) i = i + 1; }
M68K assembly:strcpy
ADD.L #4, SP Room in stack for 1 more itemMOVE D0, (SP) Save D0 into stackMOVEQ #0, D0 i 0
L1: MOVE.B (A1,D0), D4 D4 y[i]MOVE.B (A0,D0), D5 D5 y[i]TST D5 if y[I] = 0BEQ L2 doneADDQ #1, D0 i i + 1BRA L1 Repeat
L2: MOVE.L (SP), D0 Restore D0ADD.L #-4, SP pop one word off stackRTS return
Parameter Passing Conventionbase of array x[ ] A0base of array y[ ] A1
Assumptioni D0
© 2006
Department of Computing Science
CMPUT 229
A Procedure that Doesn’t Call Another Procedure
save $s0 in stack
i 0
x[i] y[i]
void strcpy ( char x[ ], char y[ ]) { int i;
i = 0; while ((x[i] = y[i]) != 0) i = i + 1; }
M68K assembly:strcpy
ADD.L #4, SP Room in stack for 1 more itemMOVE D0, (SP) Save D0 into stackMOVEQ #0, D0 i 0
L1: MOVE.B (A1,D0), D4 D4 y[i]MOVE.B D4, (A0,D0) x[i] y[i]TST D5 if y[I] = 0BEQ L2 doneADDQ #1, D0 i i + 1BRA L1 Repeat
L2: MOVE.L (SP), D0 Restore D0ADD.L #-4, SP pop one word off stackRTS return
Parameter Passing Conventionbase of array x[ ] A0base of array y[ ] A1
Assumptioni D0
© 2006
Department of Computing Science
CMPUT 229
A Procedure that Doesn’t Call Another Procedure
save $s0 in stack
y[i] = 0?
i 0
x[i] y[i]
void strcpy ( char x[ ], char y[ ]) { int i;
i = 0; while ((x[i] = y[i]) != 0) i = i + 1; }
M68K assembly:strcpy
ADD.L #4, SP Room in stack for 1 more itemMOVE D0, (SP) Save D0 into stackMOVEQ #0, D0 i 0
L1: MOVE.B (A1,D0), D4 D4 y[i]MOVE.B D4, (A0,D0) x[i] y[i]TST D5 if y[I] = 0BEQ L2 doneADDQ #1, D0 i i + 1BRA L1 Repeat
L2: MOVE.L (SP), D0 Restore D0ADD.L #-4, SP pop one word off stackRTS return
Parameter Passing Conventionbase of array x[ ] A0base of array y[ ] A1
Assumptioni D0
© 2006
Department of Computing Science
CMPUT 229
A Procedure that Doesn’t Call Another Procedure
i i + 1
save $s0 in stack
no
y[i] = 0?
i 0
x[i] y[i]
void strcpy ( char x[ ], char y[ ]) { int i;
i = 0; while ((x[i] = y[i]) != 0) i = i + 1; }
M68K assembly:strcpy
ADD.L #4, SP Room in stack for 1 more itemMOVE D0, (SP) Save D0 into stackMOVEQ #0, D0 i 0
L1: MOVE.B (A1,D0), D4 D4 y[i]MOVE.B D4, (A0,D0) x[i] y[i]TST D5 if y[I] = 0BEQ L2 doneADDQ #1, D0 i i + 1BRA L1 Repeat
L2: MOVE.L (SP), D0 Restore D0ADD.L #-4, SP pop one word off stackRTS return
Parameter Passing Conventionbase of array x[ ] A0base of array y[ ] A1
Assumptioni D0
© 2006
Department of Computing Science
CMPUT 229
A Procedure that Doesn’t Call Another Procedure
i i + 1
save $s0 in stack
no
y[i] = 0?
yes
restore $s0
return
i 0
x[i] y[i]
void strcpy ( char x[ ], char y[ ]) { int i;
i = 0; while ((x[i] = y[i]) != 0) i = i + 1; }
M68K assembly:strcpy
ADD.L #4, SP Room in stack for 1 more itemMOVE D0, (SP) Save D0 into stackMOVEQ #0, D0 i 0
L1: MOVE.B (A1,D0), D4 D4 y[i]MOVE.B D4, (A0,D0) x[i] y[i]TST D5 if y[I] = 0BEQ L2 doneADDQ #1, D0 i i + 1BRA L1 Repeat
L2: MOVE.L (SP), D0 Restore D0ADD.L #-4, SP pop one word off stackRTS return
Parameter Passing Conventionbase of array x[ ] A0base of array y[ ] A1
Assumptioni D0