In this you will construct an assembly routine that puts the ASCII representation of an input string in memory at a specified location. The LC-3 machine language provides several useful TRAP calls for I/O (Patt 2e Appendix A, p 541). For example, GETC (TRAP x20) gets one character from the keyboard and places its ASCII code in R0. OUT (TRAP x21) performs the opposite function – it takes the contents of R0 and outputs the specified character (using ASCII encoding) to the display. The LC-3 provides two output TRAPS for strings: PUTS (TRAP x22) and PUTSP (TRAP x24). Both of these expect (in R0) a starting address for a string, and output the encoded string to the display. Your task is to produce two programs that provide the “opposite” function of PUTS and PUTSP – that is, they take a string as input and place the string into memory at a location specified in R0. You will create two separate stand-alone programs: one for GETS and one for GETSP. The programs do not need to be implemented as subroutines or TRAP calls. Using the LC-3 simulator, you will construct an assembly-level program that prompts the user for a string (the end of the string will be delimited by the character x0A, the ASCII character “Enter”). You will store the ASCII string representation of this input (including a terminating NULL character) in memory. The “Enter” character should not be considered part of the string and thus should not be stored. For the purposes of demonstration, I would like you to store the string at address x3100 (add the appropriate code to your program) and show that you have successfully stored the string by printing it back to the display using PUTS or PUTSP. Your program will be located in memory at location x3000. The following is an example output for both GETS.asm and GETSP.asm: Enter string to echo: Go Raiders! Go Raiders! ----- Halting the processor ----- ; Main program to test the subroutine GETSP ; This program simply prompts for two strings and ; displays them back using PUTSP ; ------------------------------------------------------------------------- .ORIG x3000 ; Set up the user stack: LD R6, STKBASE ; Sets up the stack by loading the base address into R6 ; Prompt for the first string: LEA R0, PRMPT1 ; Loads the address of PRMPT1 into R0 PUTS ; Call GETS to get first string: LEA R0, STRNG1 ; Loads the address of STRNG1 ADD R6, R6, #-1 ; Push the address to store the string at STR R0, R6, #0 JSR GETSP ; Call GETSP ADD R6, R6, #2 ; Clean up (pop parameter & return value) ; Prompt for second string: LEA R0, PRMPT2 ; Loads the address of PRMPT2 PUTS ; Call GETS to get second string: LEA R0, STRNG2 ; Loads the address of STRNG2 ADD R6, R6, #-1 ; Push the second address to store the string at STR R0, R6, #0 JSR GETSP ; Call GETSP ADD R6, R6, #2 ; Clean up (pop parameter & return value) ; Output both strings: LEA R0, OUT1 ; First string... PUTS LEA R0, STRNG1 PUTSP LD R0, LF ; Print a linefeed OUT ; Write character to console (TRAP x21) LEA R0, OUT2 ; Second string. PUTS LEA R0, STRNG2 PUTSP HALT ; We are done ; GLOBAL VARIABLES ; ---------------- STKBASE .FILL xFDFF ; The bottom of the stack will be xFDFF LF .FILL x0A ; A linefeed character. Change this to x0D if you are using UNIX desktop sim PRMPT1 .STRINGZ "Please enter the first string: " PRMPT2 .STRINGZ "Please enter the second string: " OUT1 .STRINGZ "The first string was: " OUT2 .STRINGZ "The second string was: " CLU .FILL x00FF ; Clear upper byte of a value in a register CLL .FILL xFF00 ; Clear lower byte of a value in a register STRNG1 .BLKW #80 ; Room for 79 characters (unpacked) + NULL STRNG2 .BLKW #80 ; Room for 79 characters (unpacked) + NULL ; Professor's notes: ;===================================================================================== ; Place your GETSP subroutine below the notes: ;===================================================================================== ; Subroutine GETSP ; Parameters: Address - the address to store the string at ; ; Returns: Nothing ; ; Local variables ; Offset Description ; 0 Callee-saved register R0 ; -1 Callee-saved register R1
In this you will construct an assembly routine that puts the ASCII representation of an input string in memory at a
specified location. The LC-3 machine language provides several useful TRAP calls for I/O (Patt 2e Appendix A, p 541). For
example, GETC (TRAP x20) gets one character from the keyboard and places its ASCII code in R0. OUT (TRAP x21)
performs the opposite function – it takes the contents of R0 and outputs the specified character (using ASCII encoding)
to the display.
The LC-3 provides two output TRAPS for strings: PUTS (TRAP x22) and PUTSP (TRAP x24). Both of these expect (in R0) a
starting address for a string, and output the encoded string to the display. Your task is to produce two programs that
provide the “opposite” function of PUTS and PUTSP – that is, they take a string as input and place the string into memory
at a location specified in R0. You will create two separate stand-alone programs: one for GETS and one for GETSP. The
programs do not need to be implemented as subroutines or TRAP calls.
Using the LC-3 simulator, you will construct an assembly-level program that prompts the user for a string (the end of the
string will be delimited by the character x0A, the ASCII character “Enter”). You will store the ASCII string representation
of this input (including a terminating NULL character) in memory. The “Enter” character should not be considered part
of the string and thus should not be stored. For the purposes of demonstration, I would like you to store the string at
address x3100 (add the appropriate code to your program) and show that you have successfully stored the string by
printing it back to the display using PUTS or PUTSP. Your program will be located in memory at location x3000.
The following is an example output for both GETS.asm and GETSP.asm:
Enter string to echo: Go Raiders!
Go Raiders!
----- Halting the processor -----
-
; Main program to test the subroutine GETSP
-
; This program simply prompts for two strings and
-
; displays them back using PUTSP
-
; -------------------------------------------------------------------------
-
-
.ORIG x3000
-
-
; Set up the user stack:
-
LD R6, STKBASE ; Sets up the stack by loading the base address into R6
-
-
; Prompt for the first string:
-
LEA R0, PRMPT1 ; Loads the address of PRMPT1 into R0
-
PUTS
-
-
; Call GETS to get first string:
-
LEA R0, STRNG1 ; Loads the address of STRNG1
-
ADD R6, R6, #-1 ; Push the address to store the string at
-
STR R0, R6, #0
-
JSR GETSP ; Call GETSP
-
ADD R6, R6, #2 ; Clean up (pop parameter & return value)
-
-
; Prompt for second string:
-
LEA R0, PRMPT2 ; Loads the address of PRMPT2
-
PUTS
-
-
; Call GETS to get second string:
-
LEA R0, STRNG2 ; Loads the address of STRNG2
-
ADD R6, R6, #-1 ; Push the second address to store the string at
-
STR R0, R6, #0
-
JSR GETSP ; Call GETSP
-
ADD R6, R6, #2 ; Clean up (pop parameter & return value)
-
-
; Output both strings:
-
LEA R0, OUT1 ; First string...
-
PUTS
-
LEA R0, STRNG1
-
PUTSP
-
LD R0, LF ; Print a linefeed
-
OUT ; Write character to console (TRAP x21)
-
LEA R0, OUT2 ; Second string.
-
PUTS
-
LEA R0, STRNG2
-
PUTSP
-
-
HALT ; We are done
-
-
; GLOBAL VARIABLES
-
; ----------------
-
STKBASE .FILL xFDFF ; The bottom of the stack will be xFDFF
-
LF .FILL x0A ; A linefeed character. Change this to x0D if you are using UNIX desktop sim
-
PRMPT1 .STRINGZ "Please enter the first string: "
-
PRMPT2 .STRINGZ "Please enter the second string: "
-
OUT1 .STRINGZ "The first string was: "
-
OUT2 .STRINGZ "The second string was: "
-
CLU .FILL x00FF ; Clear upper byte of a value in a register
-
CLL .FILL xFF00 ; Clear lower byte of a value in a register
-
STRNG1 .BLKW #80 ; Room for 79 characters (unpacked) + NULL
-
STRNG2 .BLKW #80 ; Room for 79 characters (unpacked) + NULL
-
-
; Professor's notes:
-
;=====================================================================================
-
; Place your GETSP subroutine below the notes:
-
;=====================================================================================
-
; Subroutine GETSP
-
; Parameters: Address - the address to store the string at
-
;
-
; Returns: Nothing
-
;
-
; Local variables
-
; Offset Description
-
; 0 Callee-saved register R0
-
; -1 Callee-saved register R1
Trending now
This is a popular solution!
Step by step
Solved in 4 steps