Top Banner
1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines
34

1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

Jan 29, 2016

Download

Documents

Marshall Sharp
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

1

ECE 372 – Microcontroller Design Assembly Programming

HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines

Page 2: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

2

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

Addressing Modes Inherent Immediate Direct Addressing Extended Addressing Indexed Addressing PC Relative Addressing

Page 3: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

3

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

Inherent Addressing No operand field (operands are implicit) Instructions have no operand or all operands are internal CPU registers

Examples: mul – D = A * B idiv – X = D / X and D = D % X inca – A = A + 1 nop – No operation

Page 4: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

4

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

Immediate Addressing Operands are constant values Operand is included in the instruction stream (ROM) No additional memory is needed (other than fetching instruction itself) Can be 8-bit or 16-bit value (usually depends on instruction)

Examples: cmpa #10 – Compare A with 8-bit constant value 10

Machine Code: $81 0A adda #$10 – Add 8-bit constant value 16 to A

Machine Code: $86 10 cpd #$0100 – Compare D with 16-bit constant value 256

Machine Code: $8C 01 00

Page 5: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

5

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

Direct Addressing 8-bit address provided along with instruction Address directly points to memory location of operand 8-bit addresses can access memory locations from $0000 to $00FF

Examples: ldaa 50 – Load A with Mem[50]

Machine Code: $96 32 adaa $FF – Add to A the value stored at Mem[255]

Machine Code: $9B FF staa 128 – Store A to Mem[128]

Machine Code: $5A 80

Page 6: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

6

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

Extended Addressing Similar to direct addressing but with 16-bit address Address directly points to memory location of operand 16-bit addresses can access memory locations from $0000 to $FFFF

Examples: ldaa $1000 – Load A with Mem[4096]

Machine Code: $B6 10 00 adaa $0100 – Add to A the value stored at Mem[256]

Machine Code: $BB 01 00 staa $3800 – Store A to first RAM location of MC9S12C32 (Mem[14336])

Machine Code: $7A 38 00

Page 7: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

7

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

PC Relative Addressing Used for branch instructions 8-bit signed offset used for short branch instructions 16-bit signed offset used for long branch instructions When instruction is fetched, the PC already ready points to the next

instruction PC + 2 for most short branch instructions PC + 4 for most long branch instructions

Examples: beq $04 – Branch if equal to PC + 2 + 4

Machine Code: $27 04 beq $FC – Branch if equal to previous instruction at PC + 2 - 4

-4 = $FC (11111100) Machine Code: $27 FC

Page 8: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

8

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

PC Relative Addressing

$4000 $86 LDAA immediate addressing

$4001 $00 Value to be stored in A

$4002 $81 CMPA immediate addressing

$4003 $0A Compare Value 10

$4004 $2C BGE (Branch if greater than or equal)

$4005 ?? PC=PC+2+Rel

$4006 $8B ADDA immediate addressing

$4007 $01 Value to add to A

$4008 $20 Branch Always

$4009 ?? PC=PC+2+Rel

ldaa #0 ; Initialize jLoop: cmpa #10 ; Compare j to 10 bge EndLoop ; Else !(j<10) ; do something adda #1 ; Increment j bra Loop ; Repeat LoopEndLoop: ; do something else

Assembly Code:

How do we calculate these values?

Page 9: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

9

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

PC Relative Addressing

$4000 $86 LDAA immediate addressing

$4001 $00 Value to be stored in A

$4002 $81 CMPA immediate addressing

$4003 $0A Compare Value 10

$4004 $2C BGE (Branch if greater than or equal)

$4005 ?? PC=PC+2+Rel

$4006 $8B ADDA immediate addressing

$4007 $01 Value to add to A

$4008 $20 Branch Always

$4009 ?? PC=PC+2+Rel

ldaa #0 ; Initialize jLoop: cmpa #10 ; Compare j to 10 bge EndLoop ; Else !(j<10) ; do something adda #1 ; Increment j bra Loop ; Repeat LoopEndLoop: ; do something else

Assembly Code:

PC = PC + 2 + Rel $400A = $4004 + 2 + RelRel = $400A - $4004 -2Rel = 4 ($04)

PC = PC + 2 + Rel $4002 = $4008 + 2 + RelRel = $4002 - $4008 - 2Rel = -8 ($F8)

Page 10: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

10

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

PC Relative Addressing

$4000 $86 LDAA immediate addressing

$4001 $00 Value to be stored in A

$4002 $81 CMPA immediate addressing

$4003 $0A Compare Value 10

$4004 $18 LBGE

$4005 $2C PC=PC+4+Rel

$4006 ?? Relative Value

$4007 ??

$4008 $8B ADDA immediate addressing

$4009 $01 Value to add to A

$400A $20 Branch Always

$400B ?? PC=PC+2+Rel

ldaa #0 ; Initialize jLoop: cmpa #10 ; Compare j to 10 lbge EndLoop ; Else !(j<10) ; do something adda #1 ; Increment j bra Loop ; Repeat LoopEndLoop: ; do something else

Assembly Code:

PC = PC + 4 + Rel $400C = $4004 + 4 + RelRel = $400C - $4004 - 4Rel = 4 ($04)

PC = PC + 2 + Rel $4002 = $400A + 2 + RelRel = $4002 - $400A - 2Rel = -10 ($F6)

Page 11: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

11

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

Indexed Addressing Address is based of o value stored within register (S)

Typically based on X or Y index registers (not required) Many index addressing modes exist

5/9-bit Constant Offset Auto Pre/Post Decrement/Increment 16-bit Constant Offset 16-bit Indirect Indexed Accumulator Offset Accumulator D Indirect

Page 12: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

12

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

5/9/16-bit Constant Offset Indexed Addressing Calculates addressed based on index register, stack pointer, or

PC Address is 5/9/16-bit offset added to address within X/Y/SP/PC

Offsets are assumed to be signed values

Example ldaa 0,X – Load A with value stored at Mem[X+0] (5-bit) stab -8,Y – Store B to Mem[Y-8] (5-bit) stab -20, Y – Store B to Mem[Y-20] (9-bit)

Page 13: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

13

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

Accumulator Offset Indexed Addressing Calculates addressed based on index register, stack pointer, or

PC and accumulators A, B, or D Address is the unsigned A/B/D offset added to address within

X/Y/SP/PC

Example ldaa B,X – Load A with value stored at Mem[X+B] stab D,Y – Store B to Mem[Y+D]

Page 14: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

14

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

16-bit Constant Indirect Indexed Addressing Calculates indirect address based on index register, stack

pointer, or PC and a 16-bit offset Indirect address points to memory location of pointer providing

memory address of operand Direct address is value stored in memory location provided by

indirect address

Example ldaa [10,X] – Load A with value stored at Mem[Mem[X+10]]

If X = $1000 and Mem[$100A:$100B] = $2000 Indirect address = X+10 = $1000 + $0A = $100A Direct Address = Mem[$100A] = $2000 A = Mem[$2000]

Page 15: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

15

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

Accumulator D Indirect Indexed Addressing Calculates indirect address based on index register, stack

pointer, or PC and 16-bit accumulator D Indirect address points to memory location of pointer providing

memory address of operand Direct address is value stored in memory location provided by

indirect address

Example ldaa [D,X] – Load A with value stored at Mem[Mem[X+D]]

If X = $1000, D = $0C, and Mem[$100C:$100D] = $3800 Indirect address = X+12 = $1000 + $0C = $100C Direct Address = Mem[$100C] = $3800 A = Mem[$3800]

Page 16: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

16

ECE 372 – Microcontroller Design Assembly Programming – Addressing Modes

Auto Pre/Post Decrement/Increment Indexed Addressing Calculates address based on index register or stack pointer Provides four methods for automatically adjusting the index

register during the instruction Pre-decrement/Pre-Increment

Decrements or Increments the index register before calculating address Post-decrement/Post-Increment

Decrements or Increments the index register after calculating address Can be decremented/increment in ranges from -1 to -8 and 1 to 8

Example ldaa 1,-X – Load A with value stored at Mem[X-1], X = X - 1 staa 2,X+ – Store A to Mem[X], X = X + 2

Page 17: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

17

ECE 372 – Microcontroller Design Assembly Programming

Create an assembly program to add together two 32-bit unsigned numbers stored in memory at location $3800 and $3804 storing the result in location $3808.

Page 18: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

18

ECE 372 – Microcontroller Design Assembly Programming – Stack Pointer

Stack Pointer (SP) Points to memory location corresponding to the top of the stack Must be initialized within your assembly program Initialize to location $4000 for MC9S12C32

Basic Stack Pointer Instructions des – Decrement stack pointer (SP) ins – Increment stack pointer (SP) psha/pshb/pshd/pshx/pshy – Push A/B/D/X/Y to stack

Automatically adjusts stack pointer pula/pulb/pulb/pulx/puly – Pull (Pop) A/B/D/X/Y from stack

Automatically adjusts stack pointer lds – Load stack pointer (SP) with from memory (or immediate

value) sts – Store stack pointer (SP) to memory

Page 19: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

19

ECE 372 – Microcontroller Design Assembly Programming – Stack Pointer

Storing and Retrieving from top of Stack

Utilized stack to store temporary data

Push data onto stack Pop data from stack

Example:

ldaa #0 ; A = 0psha ; Push A(0) onto stackldaa #20 ; A = 20psha ; Push A(20) onto stackldd #300 ; D = 300pshd ; Push D(300) onto stack

...

puld ; D = 300pula ; A = 20pulb ; B = 0

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000

SP: $4000

00

$3FFF

Page 20: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

20

ECE 372 – Microcontroller Design Assembly Programming – Stack Pointer

Storing and Retrieving from top of Stack

Utilized stack to store temporary data

Push data onto stack Pop data from stack

Example:

ldaa #0 ; A = 0psha ; Push A(0) onto stackldaa #20 ; A = 20psha ; Push A(20) onto stackldd #300 ; D = 300pshd ; Push D(300) onto stack

...

puld ; D = 300pula ; A = 20pulb ; B = 0

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000

SP:

00

$3FFF$3FFE

14

Page 21: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

21

ECE 372 – Microcontroller Design Assembly Programming – Stack Pointer

Storing and Retrieving from top of Stack

Utilized stack to store temporary data

Push data onto stack Pop data from stack

Example:

ldaa #0 ; A = 0psha ; Push A(0) onto stackldaa #20 ; A = 20psha ; Push A(20) onto stackldd #300 ; D = 300pshd ; Push D(300) onto stack

...

puld ; D = 300pula ; A = 20pulb ; B = 0

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000

SP:

00

$3FFE$3FFC

142C

01

Page 22: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

22

ECE 372 – Microcontroller Design Assembly Programming – Stack Pointer

Storing and Retrieving from top of Stack

Utilized stack to store temporary data

Push data onto stack Pop data from stack

Example:

ldaa #0 ; A = 0psha ; Push A(0) onto stackldaa #20 ; A = 20psha ; Push A(20) onto stackldd #300 ; D = 300pshd ; Push D(300) onto stack

...

puld ; D = 300pula ; A = 20pulb ; B = 0

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000

SP:

00

$3FFC$3FFE

142C

01

Page 23: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

23

ECE 372 – Microcontroller Design Assembly Programming – Stack Pointer

Storing and Retrieving from top of Stack

Utilized stack to store temporary data

Push data onto stack Pop data from stack

Example:

ldaa #0 ; A = 0psha ; Push A(0) onto stackldaa #20 ; A = 20psha ; Push A(20) onto stackldd #300 ; D = 300pshd ; Push D(300) onto stack

...

puld ; D = 300pula ; A = 20pulb ; B = 0

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000

SP:

00

$3FFE$3FFF

14

Page 24: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

24

ECE 372 – Microcontroller Design Assembly Programming – Stack Pointer

Storing and Retrieving from top of Stack

Utilized stack to store temporary data

Push data onto stack Pop data from stack

Example:

ldaa #0 ; A = 0psha ; Push A(0) onto stackldaa #20 ; A = 20psha ; Push A(20) onto stackldd #300 ; D = 300pshd ; Push D(300) onto stack

...

puld ; D = 300pula ; A = 20pulb ; B = 0

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000

SP:

00

$3FFF$4000

Page 25: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

25

ECE 372 – Microcontroller Design Assembly Programming – Arrays

unsigned short a[10];for(j=0; j<10; j++){ if(a[j]==1) PORTT=0x04; else PORTT=0x00;}

Array For Loop Example:

1. Initialize J2. Compare J to 103. If Not Less than 10,

1. End Loop4. Else

1. Load a[j]2. If a[j] == 1

1. PORT T = 43. Else

1. PORT T = 04. Increment J5. Repeat Loop (Step 2)

Programming Steps:

Assembly Code: ldaa #0 ; Initialize J ldx #$3800 ; Initialize index to A[0]Loop: cmpa #10 ; Compare J to 10 bge EndLoop ; Else !(J<10) staa $3814 ; Store J to RAM ldd 0,X ; load A[J] cpd #1 ; Compare J to 1 bne Else ; Else !(A[J]==1) ldab #4 ; Value to write to PORT T bra EndIf Else: ldab #0 ; Value to write to PORT TEndIf:stab PTT ; Write value to PORT T ldaa $3814 ; Read J from RAM adda #1 ; Increment J inx ; Increment A[J] inx ; Need to increment by 2 bra Loop ; Repeat LoopEndLoop: ; do something else

We could store these values on the stack instead (temporary

value).

Page 26: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

26

ECE 372 – Microcontroller Design Assembly Programming – Arrays

unsigned short a[10];for(j=0; j<10; j++){ if(a[j]==1) PORTT=0x04; else PORTT=0x00;}

Array For Loop Example:

1. Initialize J2. Compare J to 103. If Not Less than 10,

1. End Loop4. Else

1. Load a[j]2. If a[j] == 1

1. PORT T = 43. Else

1. PORT T = 04. Increment J5. Repeat Loop (Step 2)

Programming Steps:

Assembly Code: lds #$4000 ; Initialize SP ldaa #0 ; Initialize J ldx #$3800 ; Initialize index to A[0]Loop: cmpa #10 ; Compare J to 10 bge EndLoop ; Else !(J<10) psha ; Push J to stack ldd 0,X ; load A[J] cpd #1 ; Compare J to 1 bne Else ; Else !(A[J]==1) ldab #4 ; Value to write to PORT T bra EndIf Else: ldab #0 ; Value to write to PORT TEndIf:stab PTT ; Write value to PORT T pula ; Pull(Pop) J from Stack adda #1 ; Increment J inx ; Increment A[J] inx ; Need to increment by 2 bra Loop ; Repeat LoopEndLoop: ; do something else

Replace ldaa and staa with psha and pula.

Initialize stack pointer

Page 27: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

27

ECE 372 – Microcontroller Design Assembly Programming – Stack Pointer

Accessing items within stack (not at the top) Push/Pull only provide access to top of stack Can use index addressing to access stack items not at top of stack

...

ldab 1,SP ; B = Mem[SP-1] = $2Cldd 2,SP ; D = Mem[SP-2] = $2000

...

SP: $3FFC

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000

00

142C

01

Page 28: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

28

ECE 372 – Microcontroller Design Assembly Programming – Subroutines

Subroutines Similar to functions in C/C++

Allows program to call routine Parameter passing must be done explicitly

Basic Subroutine Instructions bsr – Brach to subroutine (PC Relative Addressing)

Return address will be pushed onto stack Uses 16-bit address of following instruction (PC + 2)

jsr – Jump to subroutine Return address will be pushed onto stack Uses 16-bit address of following instruction (varies depending on addressing

mode) rts – Return from subroutine

PC will pulled (popped) from top of stack

Page 29: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

29

ECE 372 – Microcontroller Design Assembly Programming – Subroutines

Simple Subroutine Example

for(j=0; j<10; j++){ FuncA();}

void FuncA() { // do something}

C Function Example: Assembly Code: ldaa #0 ; Initialize jLoop: cmpa #10 ; Compare j to 10 bge EndLoop ; Else !(j<10) bsr FuncA ; Call FuncA adda #1 ; Increment j bra Loop ; Repeat LoopEndLoop:

FuncA: ; do something rts ; Return from FuncA

Page 30: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

30

ECE 372 – Microcontroller Design Assembly Programming – Subroutines

Assembly Code: ldaa #0 ; Initialize jLoop: cmpa #10 ; Compare j to 10 bge EndLoop ; Else !(j<10) bsr FuncA ; Call FuncA adda #1 ; Increment j bra Loop ; Repeat LoopEndLoop:

FuncA: ; do something rts ; Return from FuncA

$4000 $86 LDAA immediate addressing

$4001 $00 Value to be stored in A

$4002 $81 CMPA immediate addressing

$4003 $0A Compare Value 10

$4004 $2C BSR (Branch to FuncA)

$4005 ?? PC=PC+Rel

$4006 $8B ADDA immediate addressing

$4007 $01 Value to add to A

$4008 $20 Branch Always

$4009 $04 PC=PC+2+Rel

$4014 $3D

RTS (Return from FuncA)

How do we calculate offset?PC = PC + Rel

$4014 = $4004 + RelRel = $4014 - $4004 Rel = 16 ($10)

Page 31: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

31$4004

ECE 372 – Microcontroller Design Assembly Programming – Subroutines

Assembly Code: ldaa #0 ; Initialize jLoop: cmpa #10 ; Compare j to 10 bge EndLoop ; Else !(j<10) bsr FuncA ; Call FuncA adda #1 ; Increment j bra Loop ; Repeat LoopEndLoop:

FuncA: ; do something rts ; Return from FuncA

$4000 $86 LDAA immediate addressing

$4001 $00 Value to be stored in A

$4002 $81 CMPA immediate addressing

$4003 $0A Compare Value 10

$4004 $2C BSR (Branch to FuncA)

$4005 $10 PC=PC+Rel

$4006 $8B ADDA immediate addressing

$4007 $01 Value to add to A

$4008 $20 Branch Always

$4009 $04 PC=PC+2+Rel

$4014 $3D

RTS (Return from FuncA)

SP: $3FFC

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000

00

142C

01

$3FFA

06

40

PC: $4014

Page 32: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

32$4014

ECE 372 – Microcontroller Design Assembly Programming – Subroutines

Assembly Code: ldaa #0 ; Initialize jLoop: cmpa #10 ; Compare j to 10 bge EndLoop ; Else !(j<10) bsr FuncA ; Call FuncA adda #1 ; Increment j bra Loop ; Repeat LoopEndLoop:

FuncA: ; do something rts ; Return from FuncA

$4000 $86 LDAA immediate addressing

$4001 $00 Value to be stored in A

$4002 $81 CMPA immediate addressing

$4003 $0A Compare Value 10

$4004 $2C BSR (Branch to FuncA)

$4005 $10 PC=PC+Rel

$4006 $8B ADDA immediate addressing

$4007 $01 Value to add to A

$4008 $20 Branch Always

$4009 $04 PC=PC+2+Rel

$4014 $3D

RTS (Return from FuncA)

SP: $3FFA

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000

00

142C

01

$3FFC

06

40

PC: $4006

Page 33: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

33

ECE 372 – Microcontroller Design Assembly Programming – Subroutines

Subroutines with Parameters Utilize stack to pass parameters (in addition to return address) Caller Initialize Steps:

Push function parameters onto stack Allocate space on stack for return value Call subroutine

Caller Steps: Access parameters on using index addressing

Caller Finishing Steps: Pull (Pop) return value from stack Deallocate space on stack previously used by parameters

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000

Initial SP:

Parameters:

Return Value:

Return Address: for(j=0; j<10; ){ j = FuncA(j);}

byte FuncA(byte a) { return a+2;}

C Function Example:

Page 34: 1 ECE 372 – Microcontroller Design Assembly Programming HCS12 Assembly Programming Addressing Modes Stack Operations Subroutines.

34

ECE 372 – Microcontroller Design Assembly Programming – Subroutines

for(j=0; j<10; ){ j = FuncA(j);}

byte FuncA(byte a) { return a+2;}

C Function Example: Assembly Code: ldaa #0 ; Initialize jLoop: cmpa #10 ; Compare j to 10 bge EndLoop ; Else !(j<10) psha ; Push parameter J onto Stack des ; Allocate space for return value bsr FuncA ; Call FuncA pula ; Pull return value from stack ins ; Deallocate space from stack bra Loop ; Repeat LoopEndLoop:

FuncA: ldaa 3,SP ; Load parameter from stack adda #2 ; Add 2 to A staa 2,SP ; Store return value to stack rts ; Return from FuncA

$3FF9

$3FFA

$3FFB

$3FFC

$3FFD

$3FFE

$3FFF

$4000…

SP:

RetVal:

Param: