.ORIG x3000 ; Note that main's activation record is of size 6 MAIN LD R6, STACKSTART ADD R5, R6, -1 ADD R6, R6, -3 ; (allocate stack space for a, b, c) AND R1, R1, #0 ; allocate a to R1 ADD R1, R1, #7 AND R2, R2, #0 ; allocate b to R2 ADD R2, R2, #4 ADD R6, R6, -1 ; push arg a onto stack STR R1, R6, 0 JSR SUM LDR R1, R6, 0 ; pop return value ADD R6, R6, 1 ADD R6, R6, 1 ; pop arguments ADD R2, R2, R1 ; b = b + c ST R2, RESULT HALT ;------------------------------------ SUM ADD R6, R6, -1 ; allocate spot for return value ADD R6, R6, -1 ; Push R7 STR R7, R6, 0 ADD R6, R6, -1 ; Push R5 STR R5, R6, 0 ADD R5, R6, -1 ; set new FP ADD R6, R6, -2 ; allocate space for local vars i, z STR R1, R6, #-1 ; save R1 STR R2, R6, #-2 ; save R2 STR R3, R6, #-3 ; save R3 STR R4, R6, #-4 ; save R4 ADD R6, R6, -4 ; adjust stack pointer LDR R1, R5, #4 ; first argument AND R2, R2, #0 ADD R2, R2, #1 ; initialize R2 as counter i AND R3, R3, #0 ; initialize R3 as accumulator z NOT R1, R1 ADD R1, R1, #1 ; R1 = -(myval) SUM_LOOP ADD R4, R2, R1 BRp LOOP_DONE ADD R3, R3, R2 ADD R2, R2, #1 BR SUM_LOOP LOOP_DONE STR R3, R5, 3 ; store return value ADD R6, R6, 4 ; adjust stack pointer LDR R4, R6, -4 ; pop R4 LDR R3, R6, -3 ; pop R3 LDR R2, R6, -2 ; pop R2 LDR R1, R6, -1 ; pop R1 ADD R6, R6, 2 ; pop local variables LDR R5, R6, 0 ; pop frame pointer (dynamic link) ADD R6, R6, 1 ; LDR R7, R6, 0 ; pop return address ADD R6, R6, 1 ; RET STACKSTART .FILL xd000 RESULT .FILL x0000 .END