600 likes | 710 Views
Calling Itself. Subroutines - Part 2. Calling Itself. int fact ( int n ) { if (n < 1) return (1); else return (n * fact(n-1)); }. D0. Linking a Recursive Procedure. int fact ( int n ) { if (n < 1) return (1); else return (n * fact(n-1));
E N D
Calling Itself Subroutines - Part 2 CMPUT 229
CMPUT 229 Calling Itself int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); }
CMPUT 229 D0 Linking a Recursive Procedure int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 SP 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 $7FFC $8000 $8004 $8008 $800C $8010 $8014 $8018 SP
CMPUT 229 D0 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $12345678 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 SP $00008014 Memory $7FFC $8000 $8004 $8008 $800C $8010 SP $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008010 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 SP $0000800C Memory $7FFC $8000 $8004 $8008 $800C SP $8010 $12345678 A6 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008010 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 SP $0000800C Memory $7FFC $8000 $8004 $8008 $800C SP $8010 $12345678 A6 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 3 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008010 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 SP $0000800C Memory $7FFC $8000 $8004 $8008 $800C SP $8010 $12345678 A6 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 2 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008010 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 SP $0000800C Memory $7FFC $8000 $8004 $8008 $800C SP $8010 $12345678 A6 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 2 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008010 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 SP $0000800C Memory $7FFC $8000 $8004 $8008 $800C 2 SP $8010 $12345678 A6 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 Assuming that call to subroutine fact is at address $100024FC D0 2 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008010 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 SP $00008008 Memory $7FFC $8000 $8004 $1000 2500 SP $8008 $10002500 $800C 2 $8010 $12345678 A6 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 2 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008004 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 SP $00008000 Memory $7FFC SP $8000 A6 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 2 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008004 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 SP $00008000 Memory $7FFC SP $8000 A6 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 2 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008004 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 SP $00008000 Memory $7FFC SP $8000 A6 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008004 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 SP $00008000 Memory $7FFC SP $8000 A6 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008004 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 SP $00008000 Memory $7FFC SP $8000 1 A6 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00008004 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 SP $00007FFC Memory $7FF0 $7FF4 $7FF8 $7FFC $10002500 SP $8000 1 A6 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00007FF8 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 SP $00007FF4 Memory $7FF0 $7FF4 SP $7FF8 A6 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00007FF8 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 SP $00007FF4 Memory $7FF0 $7FF4 SP $7FF8 A6 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00007FF8 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 SP $00007FF4 Memory $7FF0 $7FF4 SP $7FF8 A6 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 0 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00007FF8 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 SP $00007FF4 Memory $7FF0 $7FF4 SP $7FF8 A6 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 0 Example: fact(3) int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } A6 $00007FF8 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 SP $00007FF4 Memory $7FF0 $7FF4 SP 0 $7FF8 A6 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 0 Example: fact(3) A6 $00007FF8 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FF0 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 $7FE8 $7FEC $7FF0 SP $10002500 $7FF4 0 $7FF8 A6 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 0 Example: fact(3) A6 $00007FEC int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FE8 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 Memory SP $7FE8 $7FEC A6 $00007FF8 $7FF0 $10002500 $7FF4 0 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 0 Example: fact(3) A6 $00007FEC int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FE8 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 Memory SP $7FE8 $7FEC A6 $00007FF8 $7FF0 $10002500 $7FF4 0 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) A6 $00007FEC int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FE8 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 Memory SP $7FE8 $7FEC A6 $00007FF8 $7FF0 $10002500 $7FF4 0 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) A6 $00007FEC int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FE8 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 Memory SP $7FE8 1 $7FEC A6 $00007FF8 $7FF0 $10002500 $7FF4 0 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) A6 $00007FEC int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FE8 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 Memory SP $7FE8 1 $7FEC A6 $00007FF8 $7FF0 $10002500 $7FF4 0 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) A6 $00007FF8 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FF0 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 Memory $7FE8 1 $7FEC $00007FF8 SP $7FF0 $10002500 $7FF4 0 A6 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) A6 $00007FF8 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FF4 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 SP $7FF4 0 A6 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) A6 $00007FF8 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FF8 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 0 SP/A6 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) A6 $00007FF8 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FF0 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 0 SP/A6 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) A6 $00007FF8 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FF0 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 SP/A6 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) A6 $00008004 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00007FFC 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC SP $10002500 $8000 1 $8004 $0008010 A6 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 1 Example: fact(3) A6 $00008004 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008000 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 SP $8000 1 $8004 $0008010 A6 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 2 Example: fact(3) A6 $00008004 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008004 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 SP/A6 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 2 Example: fact(3) A6 $00008004 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008004 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 2 $8004 $0008010 SP/A6 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 6
CMPUT 229 D0 2 Example: fact(3) A6 $00008010 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008008 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 2 $8004 $0008010 $1000 2500 SP $8008 $10002500 $800C 2 A6 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 2 Example: fact(3) A6 $00008010 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008008 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 2 $8004 $0008010 $1000 2500 $8008 $10002500 SP $800C 2 A6 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 2 Example: fact(3) A6 $00008010 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008010 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 2 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 SP/A6 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 6 Example: fact(3) A6 $00008010 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008010 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 2 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 SP/A6 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 6 Example: fact(3) A6 $00008010 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008010 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 6 SP/A6 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 6 Example: fact(3) A6 $12345678 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008014 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 6 $8010 $12345678 SP $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. $8018 3
CMPUT 229 D0 6 Example: fact(3) A6 $12345678 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008018 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 6 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. SP $8018 3
CMPUT 229 D0 6 Example: fact(3) A6 $12345678 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008018 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 6 $8010 $12345678 $8014 $10004000 $1000 3FFB MOVEQ #3,(SP) $1000 3FFC BSR fact $1000 4000 …. SP $8018 3
CMPUT 229 D0 2 Example: fact(3) A6 $00008010 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008008 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 SP $800C 2 A6 $8010 $12345678 $1000 3FFB MOVEQ #3,D0 $1000 3FFC BSR fact $1000 4000 …. $8014 $10004000 $8018 3
CMPUT 229 D0 2 Example: fact(3) A6 $00008010 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008014 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $1000 3FFB MOVEQ #3,D0 $1000 3FFC BSR fact $1000 4000 …. $8014 $10004000 SP $8018 3
CMPUT 229 D0 6 Example: fact(3) A6 $00008010 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008010 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 SP/A6 $8010 $12345678 $1000 3FFB MOVEQ #3,D0 $1000 3FFC BSR fact $1000 4000 …. $8014 $10004000 $8018 6
CMPUT 229 D0 6 Example: fact(3) A6 $00008010 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008010 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 SP/A6 $8010 $12345678 $1000 3FFB MOVEQ #3,D0 $1000 3FFC BSR fact $1000 4000 …. $8014 $10004000 $8018 6
CMPUT 229 D0 6 Example: fact(3) A6 $12345678 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008010 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 SP $1000 3FFB MOVEQ #3,D0 $1000 3FFC BSR fact $1000 4000 …. $8014 $10004000 $8018 6
CMPUT 229 D0 6 Example: fact(3) A6 $12345678 int fact ( intn ) { if (n < 1) return(1); else return(n * fact(n-1)); } SP $00008010 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 Memory $7FE8 1 $7FEC $00007FF8 $7FF0 $10002500 $7FF4 1 $7FF8 $00008004 $7FFC $10002500 $8000 1 $8004 $0008010 $1000 2500 $8008 $10002500 $800C 2 $8010 $12345678 $1000 3FFB MOVEQ #3,D0 $1000 3FFC BSR fact $1000 4000 …. $8014 $10004000 SP $8018 6