Stack frames permit the dynamic creation of local storage space for use within subroutines.
Load the file clab64s.s:
* clab64s.s * parameter passing via stack * stack frame for local variable ORG $0 DC.L $8000 Stack pointer value after a reset DC.L START Program counter value after a reset ORG $2000 Start at location 2000 Hex START CLR.L D0 clear D0 MOVE.L #$1234,D0 non-zero value for illustration MOVEA.L #$2468,A0 non-zero value for illustration MOVEA.L #$22223333,A6 non-zero value for illustration MOVE.W #4,-(A7) put integer on stack MOVE.L #NUMBER,-(A7) put address of number in stack BSR ADD_IT3 execute subroutine ADD_IT3 LEA 6(A7),A7 clean up stack BREAK done * subroutine ADD_IT3 * D0 is return value (16-bit number) * 16-bit integer parameter on stack * address of a number (16 bit) in memory on stack * local variable stack frame used ADD_IT3 LINK A6,#-2 create stack frame for local variable MOVEM.L A0,-(A7) save working registers on stack CLR.L D0 MOVE.W 18(A7),-2(A6) get 16-bit integer from stack, store in local variable MOVE.L 14(A7),A0 get address of number in memory from stack MOVE.W (A0),D0 get number from memory ADD.W D0,-2(A6) add the numbers, store in local variable MOVE.W -2(A6),D0 save return value MOVEM.L (A7)+,A0 restore working registers UNLK A6 collapse stack frame RTS return to caller NUMBER DC.W 13 number 13 stored in memory
Exercise.
ANU Engineering - ENGN3213