From b435ab8d4433c317446684d934bc89384df50960 Mon Sep 17 00:00:00 2001 From: FReenen Date: Sun, 15 Sep 2024 12:03:22 +0200 Subject: [PATCH] W1.2: assignment 5: first try, not working --- assignment_assembly/assignment3/multiply.asm | 25 ++++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/assignment_assembly/assignment3/multiply.asm b/assignment_assembly/assignment3/multiply.asm index dc947c1..0d34cc3 100644 --- a/assignment_assembly/assignment3/multiply.asm +++ b/assignment_assembly/assignment3/multiply.asm @@ -4,15 +4,30 @@ .globl multiply .text .thumb_func + // R0 = a, R1 = b, R2 = result (m) multiply: MOVS.N R2, #0 // set result to 0 +multiply2: CMP.N R1, #0 BEQ.N exit // goto exit if b == 0 -loop: - ADDS.N R2, R0, R2 // add a to result - SUBS.N R1, #1 // substract 1 from b - BEQ.N exit // goto exit if b == 0 - B.N loop // loop otherwise + + CMP.N R1, #1 + BNE.N check_even // goto check_even if b == 1 + MOVS.N R2, R0 // move a to result + B.N exit // goto exit +check_even: + MOVS.N R3, #1 // set R3 to 1 as bit mask + ANDS.N R3, R1 // and R3 (bit mask) with b + BNE.N odd // goto exit if b == 0 +even: + LSLS.N R0, R0, #1 // a = a << 1 + LSRS.N R1, R1, #1 // b = b << 1 + B.N multiply2 // recurse +odd: + ADDS.N R2, R0 // add a to result + LSLS.N R0, R0, #1 // a = a << 1 + LSRS.N R1, R1, #1 // b = b << 1 + B.N multiply2 // recurse exit: MOVS.N R0, R2 // move result to R0 BX.N LR