EE 306 Intro to Computing – Programming Project 1

\$30.00

Description

Objective
The purpose of this assignment is to write a program in LC-3 assembly language to multiply two signed
numbers given in memory and put the result back in memory.
Details
The two signed numbers are given to you in memory locations x2FF0 and x2FF1. You may assume that
the numbers are in the range -128 to +127. This means you do not have to worry about overflow. Your
program should multiply these two signed numbers and store the result in memory location x2FF2.
Note: Signed numbers can be positive or negative.
You can start with the code given to you through Canvas(called Program1.asm) and incrementally
change it as follows:
● Increment 1: Modify it so the two numbers are not from x3007 and a constant with the result
just left in a register but, instead the input numbers are loaded from x2FF0 and x2FF1 and the
result is stored to x2FF2.
● Increment 2: Modify the code from Increment 1 so now you consider the numbers to be signed
rather than unsigned.
o If you think of the numbers as Num1 and Num2 then your goal is to add Num1+Num1+
accumulating register repeatedly, keep decrementing the register holding Num2 until it
reaches zero.
o Note that as long as Num2 is positive, it does not matter if Num1 is positive or negative
the code you wrote in Increment 1 still works. Convince yourself that this is case by
testing the program for different values of Num1 (positive or negative) but keeping
Num2 as a positive number. Set a breakpoint at the HALT statement and check to see
what the contents of x2FF2 are after you run the program.
o Now, you have to modify your code to account for the possibility that Num2 may be
negative. Here are some hints:
▪ To see if a register has a negative number just add zero to the register, this will
set the N bit to 1 if the register had a negative number, which you can check
for. Alternatively, if you want to see if a register has a zero or positive number
you do the same, except the addition will set the Z or P bit to 1 if the register
had a zero value or a non-zero positive number respectively.
▪ See if the decrement step can be changed to do increment or decrement based
on whether Num2 is negative or positive respectively. Make sure you apply a
fix to the result accordingly.
Examples: These are just examples the two numbers at x2FF0 (Num1) and x2FF1(Num2) can be any two
signed numbers.
● If the memory locations Num1, Num2 are the numbers 45 and 4 respectively your program
should multiply 45 and 4 and store the result 180 in memory location x2FF2. In terms of your
code the calculation performed is R = 45+45+45+45 = 180.
● If the memory locations Num1, Num2 are the numbers -5 and 200 respectively your program
should multiply -5 and 200 and store the result -1000 in memory location x2FF2. In terms of
your code the calculation performed is R = (-5)+(-5)+(-5)+(-5)… 200 times = -1000.
● If the memory locations Num1, Num2 are the numbers 50 and -4 respectively your program
should multiply 50 and -4 and store the result -200 in memory location x2FF2. In terms of your
code the logic performed is: Num2 is negative, so perform R = 50+50+50+50=200. Now fix it:
-200.
● If the memory locations Num1, Num2 are the numbers -10 and -20 respectively your program
should multiply -10 and -20 and store the result 200 in memory location x2FF2. In terms of your
code the logic performed is: Num2 is negative, so perform R = (-10)+(-10)+(-10)+(-10)… 20 times
= -200. Now fix it: +200.
Submission Instructions
● The first line of your program must specify the memory address using the .ORIG instruction. The
LC-3 simulator will place your program starting at that address. For this assignment, you should
place your program starting at x3000.
● It is possible that you made copies (versions) of the program and named them with names other
than Program1.asm, Make sure when you are ready to submit, the version you submit is named
Program1.asm. Wrong names will result in an automatic 5% point deduction.