finish assignment 5

This commit is contained in:
2024-09-15 15:56:50 +02:00
parent b435ab8d44
commit 5c5f931054
3 changed files with 17 additions and 6 deletions

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -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)