#include int main() { int A=3,B,C; scanf("%d",&B); C = A + B; printf("C = %d\n", C); } .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, #15 ; get A=3 (L2) from GlobalStkPtr+16, str at FramePtr-0 ADD R7, R7, #1 ldr R7, R7, #0 str R7, R5, #0 ADD R7, R5, #-1 ; PUSH &B ADD R6, R6, #-1 STR R7, R6, #0 ADD R7, R4, #12 ; PUSH &scanf stringz (L3) ADD R6, R6, #-1 STR R7, R6, #0 ADD R0, R4, #1 ; jsrr &lc3_scanf (&lc3_scanf in R0) LDR R0, R0, #0 jsrr R0 ldr R7, R5, #0 ; A+B, str at FramePtr-2 (C) ldr R3, R5, #-1 add R7, R7, R3 str R7, R5, #-2 ldr R7, R5, #-2 ; PUSH C ADD R6, R6, #-1 STR R7, R6, #0 ADD R7, R4, #4 ; PUSH &printf stringz (L4) ADD R6, R6, #-1 STR R7, R6, #0 ADD R0, R4, #2 ; jsrr &lc3_printf (&lc3_printf in R0) LDR R0, R0, #0 jsrr R0 ADD R7, R4, #3 ; get (L1=0) from GlobalStkPtr+3, ldr R7, R7, #0 ; str at FramePtr+3 (return value space) lc3_L1_second_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_second_prog .FILL lc3_L1_second_prog ; <- GlobalStkPtr (follows all code) scanf .FILL lc3_scanf ; GlobalStkPtr+1 printf .FILL lc3_printf ; GlobalStkPtr+2 L5_second_prog .FILL #0 ; GlobalStkPtr+3 L4_second_prog .STRINGZ "C = %d/n" ; GlobalStkPtr+4 to 12 L3_second_prog .STRINGZ "%d" ; GlobalStkPtr+13 to 15 L2_second_prog .FILL #3 ; GlobalStkPtr+16 .END Stk before call scanf: xEFF0 xEFF1 xEFF2 xEFF3 xEFF4 xEFF5 xEFF6 xEFF7 &scanf stringz xEFF8 &B (for scanf) xEFF9 C xEFFA B xEFFB A <- FramePtr (main) xEFFC FramePtr xEFFD R7 xEFFE return value space xEFFF <- StkPtr <- FramePtr (initially) Stk before call printf: xEFF0 xEFF1 xEFF2 xEFF3 xEFF4 xEFF5 xEFF6 xEFF7 &printf stringz xEFF8 C (for printf) xEFF9 C xEFFA B xEFFB A <- FramePtr (main) xEFFC FramePtr xEFFD R7 xEFFE return value space xEFFF <- StkPtr <- FramePtr (initially)