; CPE 221 Assembly Example ; 11/1/2012 ; This program multiplies two numbers by shifting and addition. ; First, take absolute values of both numbers, do multiplication, ; then adjust result as necessary. data: .org 200 num1: .dc 66524 num2: .dc 1258 result: .dw 1 mask: .dc 1 max: .dc 32767 code: .org 1000 lar r30, ready lar r29, done lar r28, one_pos lar r27, adjust lar r26, next lar r25, skip lar r24, check_max ld r1, num1 ; Put num1 in r1. ld r2, num2 ; Put num2 in r2. ld r6, mask ; Put mask in r6 ld r10, max ; Put maximum value in r10 sub r3, r3, r3 ; Set r3 to 0, it will hold the result. brzr r29, r1 ; If num1 = 0, we are done, result = 0. brzr r29, r2 ; If num2 = 0, we are done, result = 0. la r7, 16 addi r4, r1, 0 ; r4 = num1, multiplicand to be added. addi r5, r2, 0 ; r5 = num2, multiplier brpl r26, r4 ; Take absolute value of num1. neg r4, r4 next: brpl r24, r5 ; Take absolute value of num2. neg r5, r5 check_max: sub r9, r10, r4 brmi r29, r9 sub r9, r10, r5 brmi r29, r9 ready: and r8, r6, r5 ; And mask to r5 to examine bit. brzr r25, r8 ; Skip adding if bit = 0. add r3, r3, r4 ; Add. skip: shl r4, r4, 1 ; Shift multiplicand left by 1. shr r5, r5, 1 ; Look at next bit of multiplier. addi r7, r7, -1 ; Decrement loop count. brnz r30, r7 ; Need to execute loop again. adjust: brpl r28, r1 ; Done adding, adjust sign of result. neg r3, r3 ; If num1 negative, negate result. one_pos: brpl r29, r2 neg r3, r3 ; If num2 negative, negate result. done: st r3, result stop