PDA

Visualizza la versione completa : [Assembly MIPS] Divisione intera e arrotondamento


Frabina
27-09-2012, 17:46
Ciao a tutti!
E' il mio primo post nel forum! :ciauz:
Vi presento il mio problema:
sto studiando per sostenere l'esame di Programmazione in Assembly (RISC MIPS); nello specifico sto scrivendo un piccolo programmino che calcoli la velocitÓ e l'accelerazione di un veicolo in base allo spazio (in metri) e al tempo (secondi) forniti dall'utente.
Ora effettuando l'equivalenza che trasformi i secondi in ore, mi trovo dinnanzi ad una divisione con opportuno resto, il resto Ŕ contenuto nel registro LO del pannello dei registri di Spim, giusto?
Ecco come mi devo comportare con il resto secondo voi? Pi¨ in generale come posso, in seguito ad una divisione, gestire l'approssimazione per eccesso o per difetto del mio risultato?
Anche di fronte ad una semplice divisione 11:2, com approssimo in assembly a 6 piuttosto che a 5?

Grazie a tutti!
:D

MItaly
27-09-2012, 17:53
Logicamente ti direi "se il resto Ŕ maggiore della metÓ del divisore aggiungi uno al quoziente", poi non ho idea se in assembly MIPS ci sia qualche trucco per fare tutto ci˛ in maniera compatta...

Who am I
27-09-2012, 18:30
Quando fai una divisione (DIV), il risultato va in $LO, il resto in $HI.

linoma
27-09-2012, 19:21
Potresti provare cn le istruzioni SET* altrimenti dovresti scrivere del codice un po piu complesso

Frabina
28-09-2012, 16:22
ciao :ciauz:
ci ho ragionato un pochino sopra sfruttando i vostri preziosi consigli ( vi ringrazio per la disponibilitÓ e la passione con cui avete risposto);
ed ecco cio' che ho partorito:

##ALGORITMO DIVISIONE

#regola per arrotondamento: SE IL RESTO E' MAGGIORE DELLA META' DEL DIVISORE, AGGIUNGI UNO
#AL QUOZIENTE

#$LO:contiene il risultato(quoziente);
#$HI:contiene il resto
.data
dividendo: .asciiz "Inserisci dividendo: "
divisore: .asciiz "Inserisci divisore: "
risultato: .asciiz "Il risultato Ŕ: "

.text
.globl __start
.globl arrot
.globl exit

__start: ##ACQUISIZIONE DATI
li $v0, 4
la, $a0, dividendo
syscall
li $v0, 5
syscall #dividendo
move $t0, $v0
li $v0, 4
la, $a0, divisore
syscall
li $v0, 5
syscall #divisore
move $t1, $v0
div $s0, $t0, $t1 #quoziente

mfhi $t9 #copio il resto in $t9
div $s1, $t1, 2 #metÓ del divisore
slt $t2, $t9, $s1 #$t2=1 se resto Ŕ minore della metÓ del divisore;0 altrimenti
bne $t2, $zero, exit
arrot:
addi $s0, $s0, 1
j exit #incremento il quoziente di uno

exit:
li $v0, 4
la $a0, risultato
syscall
move $a0, $s0
li $v0, 1
syscall
li $v0, 10
syscall




Il programma funziona bene su spim, nonostante a volte venga approssimata per eccesso anche una divisione il cui quoziente Ŕ del tipo x,4 .
Ovviamente esisterÓ un maniera pi¨ compatta per esprimere un corretto arrotondamento.
Mi piacerebbe sentire il parere di qualche utente pi¨ esperto.
Grazie ancora a tutti :D

linoma
29-09-2012, 10:44
Il j exit sembra essere inutile.

Frabina
29-09-2012, 10:50
Originariamente inviato da linoma
Il j exit sembra essere inutile.

quindi se lo rimuovo non accade nulla perchŔ le istruzioni restano comunque consequenziali?
Per il resto, il codice risulta sufficientemente compatto?

Grazie! :D

linoma
29-09-2012, 11:04
Forse potresti togliere il branch dopo slt e sommare direttamente $t2 a $s0. Nn emulatore installato nn riesco a testarlo

Loading