Let's look at an example where two parameters are passed to a subroutine via registers, and a value is returned in a register. Load the file clab62s.s:
* clab62s.s * parameter passing via registers 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,D2 non-zero value for illustration MOVE.L #4,D1 LEA NUMBER,A0 put address of number in A0 BSR ADD_IT execute subroutine ADD_IT BREAK done * subroutine ADD_IT * D0 is return value (16-bit number) * D1 is an integer parameter * A0 contains the address of a number (16 bit) in memory * D2 is used locally ADD_IT MOVE.L D2,-(A7) save working register on stack CLR.L D2 MOVE.W (A0),D2 get number from memory ADD.W D1,D2 add numbers MOVE.W D2,D0 save return value MOVE.L (A7)+,D2 restore working registers RTS return to caller NUMBER DC.W 13 number 13 stored in memory
Exercise.
ANU Engineering - ENGN3213