This assignment must be submitted as a single file named yourlastname.asm for Assignment 5 of the CSCI 255 section on UNCA moodle by 11:00 PM on Friday, 4 December.
Be sure to read the first half of the Guide to Using the Windows version of the LC-3 Simulator and LC3Edit by Kathy Buchheit before attempting to run the LC-3 Simulator. This will save you a lot of time.
Write an LC-3 program similar to the following semi-legal C program.
int Table[10] ;
main() {
int nextC ;
int i ;
for (i=0; i<10; ++i)
Table[i] = 0 ;
while ((nextC = getchar()) > 16) {
if ('0' <= nextC && nextC <= '9')
++Table[nextC-'0'] ;
}
PrintTable(Table) ;
}
Of, if you prefer, similar to the
main of this complete Java program.
public class Main {
static void PrintTable(int[] t) {
for (int i=0; i<10; ++i)
System.out.println("Slot " + (i+'0')
+ " has " + (t[i]+'0') + " elements") ;
}
static int Table[] = new int[10] ;
public static void main(String[] args) {
int nextC ;
int i ;
for (i=0; i<10; ++i)
Table[i] = 0 ;
try {
while ((nextC = System.in.read()) > 16) {
if ('0' <= nextC && nextC <= '9')
++Table[nextC-'0'] ;
}
} catch(java.io.IOException ignore) { }
PrintTable(Table) ;
}
}
The PrintTable routine will be given to you a
LC-3 assembly code. It must not be changed by your
program. It is located at address x3800 and is
called by putting the address of the table into register R0.
The PrintTable routine saves no registers. This should
not be a problem since your program returns right after
PrintTable returns.
Your program should echo the characters that it reads.
This is done automatically by the operating system on most computers,
but for the LC-3, you need to call OUT immediately following
your call to GETC.
Your program must be located at address x3000.
When you test your program, load the assembled object file for
PrintTable.
You will need to use the JSRR instruction
to call PrintTable.
Your seqeuence to do this and end the
program will look something like the following:
LEA R0,Table
LD R4,FUNCADD
JSRR R4
HALT
FUNCADD .FILL x3800
Table .BLKW #10
Your program must be able to run more than once without
being reloaded. This is why the ten-element array corresponding
to Table must be zeroed at the beginning of each run.
I suggest write your program in the following stages.
'0' and
'9'. The easiest way to do this is to subtract
48, the ASCII code for the digit '0', from the input character.Table for each input digit.PrintTable at location x3800.The print table routine can be download or cut-and-pasted from below.
;; Table printing routine for Assignment 5
;; R0 should contain address of histogram table with ten elements
.ORIG x3800
ST R7,SaveR7
ADD R1,R0,#0 ;; R1 <- R0
LD R2,X ;; R2 <- 10
LD R3,ASC0 ;; R3 <- '0'
ADD R4,R3,#0 ;; R4 <- '0'
;; Do this loop 10 times
Loop LEA R0,MSG1 ;; R0 <- MSG1
STR R4,R0,#5 ;; MSG1[5] <- R4 next character to print
LDR R5,R1,#0 ;; R5 <- *R1 value of next element
ADD R5,R5,R3 ;; R5 <- R5+R3 add in offset '0'
STR R5,R0,#11 ;; MSG1[5] <- R5
PUTS ;; Print the message
ADD R4,R4,#1 ;; ++R4 '0','1','2',....
ADD R1,R1,#1 ;; ++R1 elements of histogram
ADD R2,R2,#-1 ;; --R2
BRp Loop ;; do the loop ten times
LD R7,SaveR7
RET
SaveR7 .BLKW 1
X .FILL #10
ASC0 .FILL #48
MSG1 .STRINGZ "Slot X has Y elements\n"
.END
My solution has 31 lines of LC-3 code when comments are omitted.
Here, for a limited time only, is a rather crude flowchar