PDA

View Full Version : ASSEMBLER, Media di 5 numeri


Kuntz87
30-03-2007, 13:07
ciao, mi dite se ho fatto bene questo esercizio in assembler, devo fare la media di 5 valori presi dalla memoria


.text
.globl main

main:

lb $t0, val1 #carico con lb il valore della locazione di memoria val1 nel registro $t0
lb $t1, val2 #carico con lb il valore della locazione di memoria val2 nel registro $t1
lb $t2, val3 #carico con lb il valore della locazione di memoria val3 nel registro $t2
lb $t3, val4 #carico con lb il valore della locazione di memoria val4 nel registro $t3
lb $t4, val5 #carico con lb il valore della locazione di memoria val5 nel registro $t4
li $t5, 5 #carico con li il valore 5 nel registro $t5
add $t6,$t0,$t1 #sommo con add i contenuti dei registri $t0 e $t1 e metto il risutato nel registro $t6
add $t6,$t6,$t2 #sommo con add i contenuti dei registri $t6 e $t2 e metto il risutato nel registro $t6
add $t6,$t6,$t3 #sommo con add i contenuti dei registri $t6 e $t3 e metto il risutato nel registro $t6
add $t6,$t6,$t4 #sommo con add i contenuti dei registri $t6 e $t4 e metto il risutato nel registro $t6
div $t7,$t6,$t5 #divido il contenuto del registro $t6, ovvero la somma dei cinque valore per 5, per avere la media
sb $t7,result #memorizzo il valore del registro $t7, media dei cinque valori, nella locazione di memoria result




.data

val1: .byte 3
val2: .byte 6
val3: .byte 4
val4: .byte 9
val5: .byte 8
result: .byte 0

misterx
30-03-2007, 13:35
a occhio si direbbe corretto

andbin
30-03-2007, 13:39
mi dite se ho fatto bene questo esercizio in assemblerQuando parli di assembly dovresti sempre specificare per quale famiglia di processori. A "vista" direi che non è x86 e nemmeno 68xxx, forse per MIPS?

misterx
30-03-2007, 13:57
Quando parli di assembly dovresti sempre specificare per quale famiglia di processori. A "vista" direi che non è x86 e nemmeno 68xxx, forse per MIPS?

direi MIPS 2000

stefano_ba
30-03-2007, 14:21
Non sapendo il set di istruzioni che supporta il processore da utilizzare posso abbozzare un paio di soluzioni alternative.

Prima modifica per utilizzare un numero inferiore di registri del processore:

li $t5, 5 #carico con li il valore 5 nel registro $t5
add $t6,$t0,$t1 #sommo con add i contenuti dei registri $t0 e $t1 e metto il risutato nel registro $t6
add $t6,$t6,$t2 #sommo con add i contenuti dei registri $t6 e $t2 e metto il risutato nel registro $t6
add $t6,$t6,$t3 #sommo con add i contenuti dei registri $t6 e $t3 e metto il risutato nel registro $t6
add $t6,$t6,$t4 #sommo con add i contenuti dei registri $t6 e $t4 e metto il risutato nel registro $t6
div $t7,$t6,$t5 #divido il contenuto del registro $t6, ovvero la somma dei cinque valore per 5, per avere la media

Diventa:
add $t0,$t0,$t1 # $t0 + $t1 -> $t0
add $t0,$t0,$t2 # $t0 + $t2 -> $t0
add $t0,$t0,$t3 # $t0 + $t3 -> $t0
add $t0,$t0,$t4 # $t0 + $t4 -> $t0
li $t5, 5 #carico con li il valore 5 nel registro $t5
div $t0,$t0,$t5 # valore media in $t0

Seconda versione:

lb $t0, val1 #carico con lb il valore della locazione di memoria val1 nel registro $t0
lb $t1, val2 #carico con lb il valore della locazione di memoria val2 nel registro $t1
lb $t2, val3 #carico con lb il valore della locazione di memoria val3 nel registro $t2
lb $t3, val4 #carico con lb il valore della locazione di memoria val4 nel registro $t3
lb $t4, val5 #carico con lb il valore della locazione di memoria val5 nel registro $t4
li $t5, 5 #carico con li il valore 5 nel registro $t5
add $t6,$t0,$t1 #sommo con add i contenuti dei registri $t0 e $t1 e metto il risutato nel registro $t6
add $t6,$t6,$t2 #sommo con add i contenuti dei registri $t6 e $t2 e metto il risutato nel registro $t6
add $t6,$t6,$t3 #sommo con add i contenuti dei registri $t6 e $t3 e metto il risutato nel registro $t6
add $t6,$t6,$t4 #sommo con add i contenuti dei registri $t6 e $t4 e metto il risutato nel registro $t6
div $t7,$t6,$t5 #divido il contenuto del registro $t6, ovvero la somma dei cinque valore per 5, per avere la media
sb $t7,result #memorizzo il valore del registro $t7, media dei cinque valori, nella locazione di memoria result


diventa:

lb $t0, val1 # copio val1 in $t0
add $t0,$t0,val2 # sommo val2 a val1, risultato in $t0
add $t0,$t0,val3 # sommo val3 a val2+val1, risultato in $t0
add $t0,$t0,val4 # sommo val4 a val3+val2+val1, risultato in $t0
add $t0,$t0,val5 # sommo val5 a val4+val3+val2+val1, risultato in $t0
li $t1, 5 #valore 5 nel registro $t1
div $t0,$t0,$t1 # valore della media in $t0

In questo modo hai ridotto il numero di registri utilizzati a solo $t0 e $t1

Kuntz87
30-03-2007, 14:52
si, è mips 2000