I am writing an assembly program on the LC3 machine.
My assembly program is an LC3 program that multiplies R2 and R3 and stores the result in R1.
Here is my source code(with comments)
;Sets pc to this address at start of program
.ORIG x3000
;R1 will store the result lets clear it(ANd with 0)
AND R1,R1,x0
;R2 will be multiplied by R3, let's clear both of them
AND R2,R2,x0
AND R3,R3,x0
;Test case 4 * 3 = 12;
ADD R2,R2,4
ADD R3,R3,3
;Add to increment zone
LOOP Add R1,R1,R2;
;Decrement the counter, in this case the 3 or R3
ADD R3,R3,x-1
BrP LOOP
HALT
.END
My test case is multiplying 4 * 3. The result should be 12 and that should be stored in R1. However when I run this program in my LC3 simulator, this is what i get for the output
R3 holds the correct value at the end but R1 holds -1.... Does anyone see an issue with my code? I made sure to clear R1 at the beginning and to keep adding R3 to R1 and storing the result to R1 while the counter, R3, or 3 in this case is greater than zero.
HALT
is just a "pseudo-instruction" for a TRAP instruction used to halt the machine.You could write:
But in this way you need to remember the position in the TRAP vector, in this case
x25
. So is better to just useHALT
instead.Others common TRAPs also have pseduo-instructions:
IN
,OUT
, etc.I asume you want to store your results somewhere. You could do something like:
---------------------EDIT--------------------------
About you last question (in comments):
This is more a question about how assemblers works.
The answer is because: Assembly Time != Execution Time
Directives are considered at Assembly Time.
In fact, Assembly Time is composed in two passes:
This is a very common way to implement assemblers, and the LC3 assembler is not the exception.