diff --git a/assignment_assembly/assignment3/multiply.asm b/assignment_assembly/assignment5/multiply.asm similarity index 79% rename from assignment_assembly/assignment3/multiply.asm rename to assignment_assembly/assignment5/multiply.asm index 0d34cc3..e52ac60 100644 --- a/assignment_assembly/assignment3/multiply.asm +++ b/assignment_assembly/assignment5/multiply.asm @@ -4,16 +4,15 @@ .globl multiply .text .thumb_func - // R0 = a, R1 = b, R2 = result (m) + // R0 = a, R1 = b, R2 = result (m), R3 = odd/even mask/result multiply: MOVS.N R2, #0 // set result to 0 -multiply2: CMP.N R1, #0 BEQ.N exit // goto exit if b == 0 - +multiply2: CMP.N R1, #1 BNE.N check_even // goto check_even if b == 1 - MOVS.N R2, R0 // move a to result + ADDS.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 @@ -21,12 +20,12 @@ check_even: 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 + 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 + LSRS.N R1, R1, #1 // b = b >> 1 B.N multiply2 // recurse exit: MOVS.N R0, R2 // move result to R0 diff --git a/assignment_assembly/assignment5/result.png b/assignment_assembly/assignment5/result.png new file mode 100644 index 0000000..6e5e1ba Binary files /dev/null and b/assignment_assembly/assignment5/result.png differ diff --git a/assignment_assembly/readme.md b/assignment_assembly/readme.md index 30c7b2e..32e4fad 100644 --- a/assignment_assembly/readme.md +++ b/assignment_assembly/readme.md @@ -41,4 +41,16 @@ En het test resultaat: ## A smarter tail recursive multiply algorithm +Voor deze opdracht heb ik niet exect de gegeven C code na gemaakt. Ik heb de twee functies als een geschreven. Hierbij is het argument `m` van `function multiply2` verplaast als laaste argument i.p.v. de eerste en de `if (b == 0)` heb ik verplaats naar `multiply`. +Het verplatsen van argument `m` is alleen een probleem waneer er andere code is die gebruik maakt dat deze functie behalve `multiply`. + +Het verplasen van de `if (b == 0)`statement is een optimazatie. Deze statement kan nooit waar zijn na de eerste iteratie. `b` wordt steeds 1 plek naar recht geschoven tot dat de laaste bit die `1` is op de 1 positie staat. In dat geval eindigd de funcie direct. + +De asambly code: + +![slimmere vermedigvuldiging assambly](assignment5/multiply.asm) + +Het test resultaat: + +![schreenshot testresultaat](assignment5/result.png)