The problem is to start an arithmetic routine package by writing
a multiplication subroutine named mlt:
; On input R2 and R3 contain two non-negative integers a (multiplicand)
;and b (multiplier) respectively, and on return R1 and R0 contain
; non-negative numbers h and l such the R1,R0 together contain the product
; of a and b :
; a * b = 2^15 * h + l . No other registers should be affected.
; On return R2 is trashed and R3 contains an error flag, which in this case
; is set iff either a or b is negative.
;EXAMPLE: multiply #1000 by #2000 to obtain #2000000
; ld R2,M1000 ; address M1000 contains #1000
; add R3,R2,R2 ; R3 <-- #2000
; jsr mlt
; On return R3 is 0, R1 contains #61 and R0 contains #1152 since
; 2000000 = 2^15 * 61 + 1152
There are several algorithms for multiplication. One can be developed based on
the binary place value system and noting that doubling a number
(i.e.,adding it to itself) shifts the bits one place left.
A simpler algorithm is based on adding R2 to itself R3 times. In this case
it might be better to test the operands to make sure R2 contains the larger of a and b.
(Adding 1000 to itself 3 times is much faster than adding 3 to itself 1000 times).
The product of a and b need not fit into one word: Say you are adding R2 to R0.
Remembering that the operands are all positive, a negative sum signifies overflow,
so the msb must be cleared and R1 incremented; e.g.:
BRzp mlt_goon ; go on if no overflow
AND R0,R0,R4 ; R4 previously loaded with x7FFF = b0111111111111111
ADD R1,R1,#1 ; add in "carry" from R0
1) Complete and fully-functional working program(s) in executable form as well as complete source code of all work done.