C P R O G R A M ( f i r s t _ p r o g . c ) : #include int main() { int A = 3; int B = 5; int C; C = A + B; } C O M P I L E D P R O G R A M ( f i r s t _ p r o g . a s m ) : .Orig x3000 ; R7 saved PC, R6 StkPtr, R5 FramePtr, R4 GlobalStkPtr INIT_CODE LEA R6, #-1 ; set StkPtr = xEFFF ADD R5, R6, #0 ADD R6, R6, R6 ADD R6, R6, R6 ADD R6, R6, R5 ADD R6, R6, #-1 ADD R5, R5, R5 ; ? (oops! "no harm" error) ADD R5, R6, #0 ; set FramePtr = xEFFF LD R4, GLOBAL_DATA_POINTER ; set GlobalStkPtr = "GLOBAL_DATA_START" LD R7, GLOBAL_MAIN_POINTER ; load R7 with address of "main" jsrr R7 ; begin "main" HALT GLOBAL_DATA_POINTER .FILL GLOBAL_DATA_START GLOBAL_MAIN_POINTER .FILL main ;;;;;;;;;;;;;;;;;;;;;;;;;;;;main;;;;;;;;;;;;;;;;;;;;;;;;;;;; main ADD R6, R6, #-2 ; PUSH space for return value STR R7, R6, #0 ; PUSH R7 (addr of HALT) ADD R6, R6, #-1 ; PUSH FramePtr STR R5, R6, #0 ADD R5, R6, #-1 ; create new FramePtr ADD R6, R6, #-3 ; PUSH space for 3 local variables (A, B, & C) ADD R7, R4, #5 ; get A=3 (L2) from GlobalStkPtr+5, str at FramePtr-0 ldr R7, R7, #0 str R7, R5, #0 ADD R7, R4, #4 ; get B=5 (L3) from GlobalStkPtr+4, str at FramePtr-1 ldr R7, R7, #0 str R7, R5, #-1 ldr R7, R5, #0 ; A+B and str into FramePtr-2 ldr R3, R5, #-1 add R7, R7, R3 str R7, R5, #-2 ADD R7, R4, #3 ; get (L4=0) from GlobalStkPtr+3, ldr R7, R7, #0 ; str at FramePtr+3 (return value space) lc3_L1_first_prog STR R7, R5, #3 ADD R6, R5, #1 ; POP local variables (A,B,C) LDR R5, R6, #0 ; POP last FramePtr ADD R6, R6, #1 LDR R7, R6, #0 ; POP last R7 (Addr of HALT) ADD R6, R6, #1 RET ; return to HALT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; void scanf(const char *format, ...) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SCANF_PERCENT .FILL -37 SCANF_C .FILL -99 SCANF_D .FILL -100 SCANF_S .FILL -115 SCANF_0 .FILL -48 SCANF_9 .FILL -57 SCANF_MINUS .FILL -45 SCANF_BUF .BLKW 6 lc3_scanf ... ; remainder of code for scanf not included ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; void printf(const char *format, ...) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRINTF_PERCENT .FILL -37 PRINTF_C .FILL -99 PRINTF_D .FILL -100 PRINTF_S .FILL -115 PRINTF_B .FILL -98 PRINTF_O .FILL -111 PRINTF_X .FILL -120 PRINTF_ASCII .FILL 48 ;postive ascii value of '0' .FILL 49 .FILL 50 .FILL 51 .FILL 52 .FILL 53 .FILL 54 .FILL 55 .FILL 56 .FILL 57 .FILL 65 ;A .FILL 66 .FILL 67 .FILL 68 .FILL 69 .FILL 70 PRINTF_MINUS .FILL 45 PRINTF_BUF .BLKW 18 lc3_printf ... ; remainder of code for printf not included GLOBAL_DATA_START L1_first_prog .FILL lc3_L1_first_prog ; <- GlobalStkPtr (follows all code) scanf .FILL lc3_scanf printf .FILL lc3_printf L4_first_prog .FILL #0 L3_first_prog .FILL #5 L2_first_prog .FILL #3 .END S T A C K S N A P S H O T S : Stk before main: xEFFC xEFFD xEFFE xEFFF <- StkPtr <- FramePtr (initially) Stk at main : xEFF6 xEFF7 xEFF8 xEFF9 xEFFA xEFFB <- FramePtr (main) xEFFC R5 FramePtr (xEFFF) xEFFD R7 Saved PC (x300B) xEFFE return value from main space xEFFF <- StkPtr <- FramePtr (initially) Stk before "C = A + B" in main: xEFF6 xEFF7 xEFF8 xEFF9 C = ? xEFFA B = 5 xEFFB A = 3(main local var) <- FramePtr (main) xEFFC R5 FramePtr (xEFFF) xEFFD R7 Saved PC (x300B) xEFFE return value from main space xEFFF <- StkPtr <- FramePtr (initially) Stk after "C = A + B" in main : xEFF6 xEFF7 xEFF8 xEFF9 C = 8 xEFFA B = 5 xEFFB A = 3(main local var) <- FramePtr (main) xEFFC R5 FramePtr (xEFFF) xEFFD R7 Saved PC (x300B) xEFFE return value from main space xEFFF <- StkPtr <- FramePtr (initially) Stk before RET to HALT : xEFFB xEFFC xEFFD xEFFE return value from main space xEFFF <- StkPtr <- FramePtr (initially)