subroutines - part 2

60
Faculty of Computer Science CMPUT 229 © 2006 Subroutines - Part 2 Calling Itself

Upload: shepry

Post on 15-Jan-2016

70 views

Category:

Documents


1 download

DESCRIPTION

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)); - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Subroutines - Part 2

Faculty of Computer Science

CMPUT 229 © 2006

Subroutines - Part 2

Calling Itself

Page 2: Subroutines - Part 2

© 2006

Department of Computing Science

CMPUT 229

Calling Itself

int fact ( int n ) { if (n < 1) return(1); else return(n * fact(n-1)); }

Page 3: Subroutines - Part 2

© 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

Page 4: Subroutines - Part 2

© 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 ….

Page 5: Subroutines - Part 2

© 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 ….

Page 6: Subroutines - Part 2

© 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 ….

Page 7: Subroutines - Part 2

© 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 ….

Page 8: Subroutines - Part 2

© 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 ….

Page 9: Subroutines - Part 2

© 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 ….

Page 10: Subroutines - Part 2

© 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 ….

Page 11: Subroutines - Part 2

© 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 ….

Page 12: Subroutines - Part 2

© 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 ….

Page 13: Subroutines - Part 2

© 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 ….

Page 14: Subroutines - Part 2

© 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 ….

Page 15: Subroutines - Part 2

© 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 ….

Page 16: Subroutines - Part 2

© 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 ….

Page 17: Subroutines - Part 2

© 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 ….

Page 18: Subroutines - Part 2

© 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 ….

Page 19: Subroutines - Part 2

© 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 ….

Page 20: Subroutines - Part 2

© 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 ….

Page 21: Subroutines - Part 2

© 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 ….

Page 22: Subroutines - Part 2

© 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 ….

Page 23: Subroutines - Part 2

© 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 ….

Page 24: Subroutines - Part 2

© 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 ….

Page 25: Subroutines - Part 2

© 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 ….

Page 26: Subroutines - Part 2

© 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 ….

Page 27: Subroutines - Part 2

© 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 ….

Page 28: Subroutines - Part 2

© 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 ….

Page 29: Subroutines - Part 2

© 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 ….

Page 30: Subroutines - Part 2

© 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 ….

Page 31: Subroutines - Part 2

© 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 ….

Page 32: Subroutines - Part 2

© 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 ….

Page 33: Subroutines - Part 2

© 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 ….

Page 34: Subroutines - Part 2

© 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 ….

Page 35: Subroutines - Part 2

© 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 ….

Page 36: Subroutines - Part 2

© 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 ….

Page 37: Subroutines - Part 2

© 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 ….

Page 38: Subroutines - Part 2

© 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 ….

Page 39: Subroutines - Part 2

© 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 ….

Page 40: Subroutines - Part 2

© 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 ….

Page 41: Subroutines - Part 2

© 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 ….

Page 42: Subroutines - Part 2

© 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 ….

Page 43: Subroutines - Part 2

© 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 ….

Page 44: Subroutines - Part 2

© 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 ….

Page 45: Subroutines - Part 2

© 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

Page 46: Subroutines - Part 2

© 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

Page 47: Subroutines - Part 2

© 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

Page 48: Subroutines - Part 2

© 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

Page 49: Subroutines - Part 2

© 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

Page 50: Subroutines - Part 2

© 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

Page 51: Subroutines - Part 2

© 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

Page 52: Subroutines - Part 2

© 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

Page 53: Subroutines - Part 2

© 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

Page 54: Subroutines - Part 2

© 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

Page 55: Subroutines - Part 2

© 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

Page 56: Subroutines - Part 2

© 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

Page 57: Subroutines - Part 2

© 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

Page 58: Subroutines - Part 2

© 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

Page 59: Subroutines - Part 2

© 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

Page 60: Subroutines - Part 2

© 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