DevX Home Today's Headlines   Articles Archive   Tip Bank   Forums

1. Ana
Registered User
Join Date
Nov 2004
Location
Newark, New Jersey
Posts
38

I know that this is a java forum but please I need help with these assembly language program using lc-3 simulator

I have to write a program that will input a list of positive 2-digit integrs and will compute the sum of all the numbers that are multiples of three and print out the sum. The numbers are to be input from the keyboard after a prompt is written on the monitor. The value zero will act as a sentinel value at the end of the data.

Well so far I have the program working with an input of a list of positives 1-digit integers; now I want you to help me to change the program so it will have a input of a list of 2-digit integers and give me the sum of all the multiples of three in that list:

example data: 12, 11, 18, 23, 22, 16, 08, 00
if I input these data set the uotput should be as follow:
The sum of the multiples of three is 30
because 12 and 18 are multiples of three.

Code:
```.ORIG X3000
LD R2, CHANGE;FFD0 in R2
LD R4, CHANGE2;0030 in R4
AND R6, R6, #0;
ADD R1, R5, #1;1 in R1
LOOP ADD R5, R1, #0; 1 in R5
BRz END;if R5 = 0 then go to END

TRAP x23;print a prompt on the screen and read a single;character from the keyboard its ascii code àR0
ADD R1, R0, R2;ASCII prompt + ffd0 à R1
ADD R7, R1, #-3;result in R1 - 3 à R7
BRz GETNUM;if R7 = 0 go to GETNUM

ADD R7, R1, #-6;result in R1 -3 à R7
BRz GETNUM;if R7 = 0 go to GETNUM

ADD R7, R1, #-9;result in R1 -3 à R7
BRz GETNUM;if R7 = 0 go to GETNUM
BR ENDIF;Go to ENDIF

GETNUM ADD R6, R6, R1;Ascii value goes to R6
ENDIF BR LOOP;Go to LOOP
END AND R1, R1, #0;clear R1
AND R2, R2, #0;clear R2
AND R3, R3, #0;clear R3
ADD R1, R6, #0;Ascci value goes to R1
BRz RESULT1;if R1 = 0 go to RESULT1
BRp RESULT2;if R2 = positive # go to RESULT2
;
RESULT1 LEA R0, ERROR;address of ERROR à R0
TRAP x22;write a string of ascii characters to the console
TRAP x25;halt execution and print a message on the console
;
RESULT2 LEA R0, MESSAGE;address of MESSAGE à R0
TRAP x22;write a string of ascii characters to the console
BRnz RESULT3;If R1 = - or 0 go to RESULT3
BR RESULT4;Go to RESULT4
;
RESULT3 ADD R6, R6, R4;ASCII value + 0030 à R6
ADD R0, R6, #0;what is in R6 à R0
TRAP x21;Write a character in R0 to the console display
TRAP x25;halt execution and print a message on the console
;
RESULT4 ADD R0, R6, #0; what is in R6 à R0
WHILE ADD R0, R0, #-10;what is in R6 - 10 à R0
;
BRzp DOBODY;if R0 = 0 or positive go to DOBODY
BR ENDWHILE;go to ENDWHILE
;
DOBODY ADD R3, R3, #1;increment R3
BR WHILE;go to WHILE
;
ENDWHILE ADD R2, R0, #0;result of R0 goes into R2
TRAP x21;Write a character in R0 to the console display
;
TRAP x21;Write a character in R0 to the console display
TRAP x25;halt execution and print a message on the console
;
MESSAGE .STRINGZ " The sum of the multiples of three is:"
ERROR .STRINGZ "There are no multiples of three in the list"
CHANGE .FILL XFFD0
CHANGE2 .FILL x0030
.END```

2. Registered User
Join Date
Aug 2003
Posts
313
Wow, Java and LC3 are pretty different, but I think I can help a bit. Basically if I were writing this I would break the program down into input, checking and output. So for input:
Code:
```BASE_NUM :	.FILL #-48 ; 48 = '0'

LD R5, BASE_NUM		; ACII -> number converter
AND R1, R1, #0 		; Clear R1

GET_NUMBER 		; Top of get number loop
GETC 			; Get the first character
ADD R1, R0, R5		; R1 = number rep of input
ADD R1, R1, R1		; R1 *= 2
ADD R1, R1, R1		; R1 *= 2
ADD R1, R1, R0		; :: first part of next instruction ::
ADD R1, R1, R5		; R1 += number rep of input
ADD R1, R1, R1		; R1 *= 2

; At this point R1 = 10 * input number
GETC 			; Get the second character
ADD R1, R1, R0		; :: first part of next instruction ::
ADD R1, R1, R5		; R1 += number rep of input

; R1 = input number

; Process the number

; Add to accumulated if necessary

GETC                 ; Ignore the ' ' character
BRnzp GET_NUMBER

PRINT
; Print out the answer here```
Everything else should be a piece of cake since it is done the same way that you did it before. Please note that I didn't verify that this code works, so it may require some debugging.

I hope this helps.

3. Ana
Registered User
Join Date
Nov 2004
Location
Newark, New Jersey
Posts
38
thakn you.

but let me ask you where in my code do I put this code.
Whre you have GET_NUM do I write all the code starting from the .orig x3000 all the way down to the lable GETNUM. AND how do I accumulate the numbers that are multiples to compute the sum and print it out.

4. Registered User
Join Date
Aug 2003
Posts
313
I have attached a file that is a roughly complete but untested program. When you write code, any type of code, you should try to break it down into pieces. In this case, the pieces that are distinct are getting the input, testing to see if a number is a multiple of 3, managing a result, and output. In what I posted before I have a GET_NUMBER tag. That starts my section to get the number. In the attached file you will notice that it is broken down into thses 4 structures. If you are having problems finding the pieces, post back here and I'll try to give a more complete explaination.

My LC3 is rather rusty, but I hope this helps. If there is anything that is still unclear, post another reply.

5. Registered User
Join Date
Oct 2005
Posts
5
ok yeah, i need help with lc-3 as well, and didn't know where else to post, so decided to go on with this thread since it's relevant to my topic.

i have to write a program in lc-3 assembly language to detect a palindrome. the size of the work to check will be fixed at exactly 10 characters, starting at memory location x3200. if it is a palindrome, a 1 is to be stored in memory location x3400. if it's not, then a 0 is to be stored instead of the 1. each character in the string can be any printable ASCII character. one character is stored per memory word, where the higher oreder 9 bits will simply be 0's. the program must contain a loop to perform the letter comparison, and not simply a rewrite of the code a number of times.

when using the simulator, you will need to enter the string to be checked, starting at address x3200. to do this, type x3200 in the "Jump to:" box and press Enter. double click anywhere on the line starting with x3200, and when the "Set Value" dialog window pops up, type in the ASCII value in hex of the first character of the string you wish to test. do the same for the remaining 9 memory locations to set the remaining characters in the string.

i've written a program, a surprisingly short one, but i can't figure out why it's not functioning correctly... can someone take a look at it and help me out please?

Code:
```	.ORIG	x3100
ENTER	STI	R0, A
STI	R1, B
;
CHECK	NOT	R2, R1
BRz	YES
;
NO	LEA	R4, C
JMP	R4
AND	R4, R4, #0
BRnzp	DONE
;
YES	LD	R4, ONE
BRnzp	CHECK
;
DONE	HALT
A	.FILL	x3200
B	.FILL	x3209
C	.FILL	x3400
ONE	.FILL	x0001
.END```

6. Registered User
Join Date
Aug 2003
Posts
313
It looks like you are comparing incorrectly. Remember, to negate something, you need to NOT it and then ADD 1. Also, I think at the beginning you want to be doing LDI instead of STI and you will want to modify those addresses each time so that your fetch works properly.

Hope this helps.

7. Registered User
Join Date
Oct 2005
Posts
5
yeah i noticed my negation problem and corrected it some time after posting my code.... and i just substituted the STIs with LDIs like u suggested, now the code reads like this:
Code:
```	.ORIG	x3100
ENTER	LDI	R0, A
LDI	R1, B
;
CHECK	NOT	R2, R1
BRz	YES
;
NO	LEA	R4, C
JMP	R4
AND	R4, R4, #0
BRnzp	DONE
;
YES	LD	R4, ONE
BRnzp	CHECK
;
DONE	HALT
A	.FILL	x3200
B	.FILL	x3209
C	.FILL	x3400
ONE	.FILL	x0001
.END```
it still assembles with no erros, but i get nothing stored in x3400 when i use the simulator to test the code

8. Registered User
Join Date
Aug 2003
Posts
313
Your NO label seems to do the wrong stuff. Try something like:
Code:
```AND R0, R0, #0
STI R0, C```
This should store 1 in the address that is located at the label C, (so, in your code it would store a 1 in address x3400).

Hope this helps.

9. Registered User
Join Date
Oct 2005
Posts
5
ok my NO now is
Code:
```NO	AND	R4, R4, #0
STI	R4, C
BRnzp	DONE```
so now it partially works.. i entered in a palindrome and a 1 was stored in x3400, but when i altered the string so that it's not a palindrome anymore, the 1 remained; it didn't change to a 0

10. Registered User
Join Date
Aug 2003
Posts
313
For the NO part you shouldn't ADD 1. The AND R4,R4,#0 makes R4 0, and the STI stores the value of R4 in the address pointed to by C.

11. Registered User
Join Date
Oct 2005
Posts
5
i see what ur saying but for some reason removing ADD worsens things, now the program doesn't recognize palindromes at all

12. Registered User
Join Date
Oct 2009
Posts
1

## LC3 Palindrome program

#### Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts
•

 FAQ Latest Articles Java .NET XML Database Enterprise