; .TITLE AddVersion4 Calculate sums .PSECT Data, NOEXE, WRT A: .LONG 2 ; Initialize A B: .LONG 7 ; Initialize B S: .BLKL 1 ; Save room for S C: .LONG ^X10 ; Initialize C to 16 D: .LONG ^X20 ; Initialize D to 32 T: .BLKL 1 ; Save room for T .PSECT Constants, NOEXE, NOWRT ArgList: .LONG 3 ; Start arg. list with length .ADDRESS C ; Address of C (ArgList+4) .ADDRESS D ; Address of D (ArgList+8) .ADDRESS T ; Address of T (ArgList+12) .PSECT Code, EXE, NOWRT ; The main program: .Entry ProcedureCall, 0 ; Call Add (A, B, S) using CALLS ; (Push arguments in reverse order) PUSHAL S ; Push address of S PUSHAL B ; Push address of B PUSHAL A ; Push address of A CALLS #3, Add ; Call the procedure ; Call Add (C, D, T) using CALLG CALLG ArgList, Add ; Call the procedure again $EXIT_S ; Procedure Add(X, Y, Sum) for calculating Sum = X + Y ; Parameter Displacement Use Purpose Passed by X = 4; Input Value to be summed Reference Y = 8; Input Value to be summed Reference Sum = 12; Output Their sum Reference .Entry Add, ^M ; Procedure entry point MOVL @X(AP), R0 ; Get value of X MOVL @Y(AP), R1 ; Get value of Y ADDL3 R0, R1, R2 ; Z <-- X + Y MOVL R2, @Sum(AP) ; Store sum RET ; Return from procedure .END ProcedureCall