1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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
|