Multiplication, Division, and Data Conversion

In this lab exercise you will develop functions which multiply and divide numbers, using nested subroutine calls.

- Download the file
multest.asm. Load it into the LC-3 editor, then read it over and be
sure you understand how it works. It has a very simple main program which
calls a function MULT1. This function takes the two numbers in R0 and R1,
multiplies them, and returns the answer in R2. It leaves R0 and R1
unchanged. Note that it only works if R1 is
__strictly positive__(i.e., it is greater than zero). Can you see why? - Assemble the program,
then load it into the simulator and run it. Confirm that it works. Try
loading different values into X and Y, then run it again. Be sure to try
at least one calculation where X is negative.
- Now write a new function
called MULT and add it to the file. This function must work just like
MULT1, except that it must calculate correctly
__even if R1 is zero or negative__. It would be possible to write MULT as a self-contained function; but for__this lab you must have MULT call MULT1__(this is to give you experience with calling one function from inside another function). How would you make this work? Hint: Can you convert a multiplication where the second number is negative to one where it is positive, and still get the right answer? Note: Be sure that R0 and R1 are unchanged after calling MULT. - Remember that when you
call a function with the JSR or JSRR instruction, the return address is
stored in R7. So if you call a function from inside a function (such as
MULT1 from MULT) be sure to save R7 before calling the inner function, and
restore it after you return from the inner function; you could accomplish
the same thing by saving R7 as you enter every function, and restoring it
as you leave.
- Test MULT with several
sets of data to be sure it calculates properly.
- Now design an assembly
language function called DIV1 which works like this: It takes two numbers
in R0 and R1. It returns with R2 equal to (R0 / R1) [using integer
division], and R3 equal to (R0 % R1) [i.e., the remainder, which is equal
to R0 modulo R1]. Be sure it returns with R0 and R1 unchanged. This
function only has to work for R0 and R1 strictly positive.
__You should work this out on paper first.__ - Add your function to the
file, assemble it, and test it.
- When
done, submit your multest.asm to web-based turnin.

See you next week.