summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSanto Cariotti <dcariotti24@gmail.com>2020-04-02 16:32:09 +0200
committerSanto Cariotti <dcariotti24@gmail.com>2020-04-02 16:34:12 +0200
commit07e445031ddaa4c8406fa9b26d138459a98b298c (patch)
treea322ce24c69c121fd0172cbe00d1940cf3018db5
parent37ab582768672f4c7dc6fcc5430c3719d82ec6be (diff)
feat: vector product in asm
-rw-r--r--I_anno/Architettura_Elaboratori/vector_prod.asm103
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