diff options
author | Santo Cariotti <dcariotti24@gmail.com> | 2020-04-02 16:32:09 +0200 |
---|---|---|
committer | Santo Cariotti <dcariotti24@gmail.com> | 2020-04-02 16:34:12 +0200 |
commit | 07e445031ddaa4c8406fa9b26d138459a98b298c (patch) | |
tree | a322ce24c69c121fd0172cbe00d1940cf3018db5 | |
parent | 37ab582768672f4c7dc6fcc5430c3719d82ec6be (diff) |
feat: vector product in asm
-rw-r--r-- | I_anno/Architettura_Elaboratori/vector_prod.asm | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/I_anno/Architettura_Elaboratori/vector_prod.asm b/I_anno/Architettura_Elaboratori/vector_prod.asm new file mode 100644 index 0000000..f506571 --- /dev/null +++ b/I_anno/Architettura_Elaboratori/vector_prod.asm @@ -0,0 +1,103 @@ +array1 dcd 1, 3, 4, 1 +array2 dcd 1, 0, 2, 0 +arrayn dcd 4 + + mov r0, #arrayn + ldr r0, [r0] ; r0 = lunghezza array + + mov r1, #array1 ; r1 = puntatore al primo array + mov r2, #array2 ; r2 = puntatore al secondo array + +loop + cmp r0, #0 + beq loop_end + + ldr r3, [r1] ; r3 = valore a cui punta r1 + ldr r4, [r2] ; r4 = valore a cui punta r2 + + cmp r3, #0 ; se r3 è 0, la moltiplicazione sarà 0 + beq r3_store + blt after_neg3 ; se r3 è negativo, cambia il filtro a 1 +jp_before4 + cmp r4, #0 ; se r4 è 0, la moltiplicazione sarà 0 + beq r4_store + blt after_neg4 ; se r4 è negativo, controlla se il filtro è già 1, in caso lo cambia +jp_after4 + cmp r3, r4 ; confronta r3 e r4 per fare la moltiplicazione con ciclo minore + bgt mul_r3 + ble mul_r4 + +loop_back + add r1, r1, #4 ; incrementa i puntatori e decrementa contatore + add r2, r2, #4 + sub r0, r0, #1 + mov r6, #0 + + b loop + +after_neg3 + mvn r3, r3 + add r3, r3, #1 + mov r6, #1 + b jp_before4 + +restart_r6 + mov r6, #0 + b jp_afte4 + +after_neg4 + mvn r4, r4 + add r4, r4, #1 + cmp r6, #1 + beq restart_r6 ; re inserisce il valore 0 perché fa prodotto di due negativi + + mov r6, #1 + b jp_after4 + +neg3 + mvn r3, r3 + add r3, r3, #1 + add r5, r5, r3 + b loop_back + +r3_store + cmp r6, #1 + beq neg3 + str r3, [r1] + add r5, r5, r3 + b loop_back + +neg4 + mvn r4, r4 + add r4, r4, #1 + str r4, [r1] + add r5, r5, r4 + b loop_back + +r4_store + cmp r6, #1 + beq neg4 + str r4, [r1] + add r5, r5, r4 + b loop_back + +mul_r3 + cmp r4, #1 + ble r3_store + + add r3, r3, r3 + + sub r4, r4, #1 + b mul_r3 + +mul_r4 + cmp r3, #1 + ble r4_store + + add r4, r4, r4 + + sub r3, r3, #1 + b mul_r4 + +loop_end + end |