summaryrefslogtreecommitdiff
path: root/Year_1/Computer_Architecture/vector_prod.asm
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2021-02-06 19:56:36 +0100
committerSanto Cariotti <santo@dcariotti.me>2021-02-06 19:56:36 +0100
commitd2edbc38cac8da52f58c5cd3da6c0c625fa05736 (patch)
treea51e9a4e56fc9d4c7c9e37576dceedca3a0c72b4 /Year_1/Computer_Architecture/vector_prod.asm
parent98f34040820dc3a964b7be59a698323e8cc6c8a3 (diff)
conf: rename
Diffstat (limited to 'Year_1/Computer_Architecture/vector_prod.asm')
-rw-r--r--Year_1/Computer_Architecture/vector_prod.asm103
1 files changed, 103 insertions, 0 deletions
diff --git a/Year_1/Computer_Architecture/vector_prod.asm b/Year_1/Computer_Architecture/vector_prod.asm
new file mode 100644
index 0000000..cf5e4ef
--- /dev/null
+++ b/Year_1/Computer_Architecture/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