PDA

Visualizza la versione completa : [Assembly MIPS] programma conversione decimale binario


DaDiXxX
06-10-2009, 07:47
Salve a tutti...a scuola mi stato assegnato questo compito..convertire un valore decimale in un valore binario colo processore mips

allora io ho scritto questa porzione di programma


#--------------------------->area dati<----------------
.data
mex: .asciiz" il valore convertito e': "
Buffer: .word 54

#------------------------->area programma<--------------

.text
.globl main

main: la $t0,Buffer #caricamento buffer
li $t1,0 #azzeramento registri
li $t2,2
li $s1,0
li $s2,0
li $t3,0

loop:
lw $t1,($t0) #estrazione valore buffer
div $t2,$t1 #divisione per 2
mfhi $s1 #resto in s1
mflo $t3 #quoziente in t3


dopo non so pi come continuare potreste illustrarmi voi ??

DaDiXxX
06-10-2009, 07:48
il diagramma a blocchi dovrebbe essere
Prendo n
lo diviso per 2
salvo resto e quoziente
shifto il resto
confronto il quoziente e 0
quoziente = 0 finisco il programma
quoziente /=0 torno alla divisione per due

giusto???
datemi aiuto voi..

LeleFT
06-10-2009, 11:18
Ciao e benvenuto sul forum.
Prendi subito visione del Regolamento interno (http://forum.html.it/forum/showthread.php?s=&threadid=973887), dove vi sono elencati una serie di punti fermi da seguire quando si aprono nuove discussioni.

In particolare: il linguaggio va obbligatoriamente indicato nel titolo e il codice che viene postato va scritto indentato all'interno degli appositi tag CODE previsti dal forum (vedi punto 6 dello stesso regolamento).

Sistemo io la discussione.


Ciao. :ciauz:

DaDiXxX
06-10-2009, 14:44
Originariamente inviato da LeleFT
Ciao e benvenuto sul forum.
Prendi subito visione del Regolamento interno (http://forum.html.it/forum/showthread.php?s=&threadid=973887), dove vi sono elencati una serie di punti fermi da seguire quando si aprono nuove discussioni.

In particolare: il linguaggio va obbligatoriamente indicato nel titolo e il codice che viene postato va scritto indentato all'interno degli appositi tag CODE previsti dal forum (vedi punto 6 dello stesso regolamento).

Sistemo io la discussione.


Ciao. :ciauz:
chiedo scusa prendo visione del regolamento adesso...
comunque...qualcuno pu aiutami a completarlo?

ant_alt
06-10-2009, 17:35
l'algoritmo pare giusto, quindi che problema hai a tradurlo in assembler? :stordita:
se davvero sei arrivato l da solo perch ora ti sei bloccato alla fine?

sei sicuro che esista l'istruzione la?
http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html

inoltre la DIV credo sia sbagliata..in $t1 c' il numero decimale giusto? allora perch fai 2\numero? :stordita:
correggi: DIV $t1 $t2

e poi alla fine del codice aggiungi


beq $t3 $0 $END #$0 vale 0, $END l'ultimo indirizzo del programma
add $t1 $t3 $0 # sostituisci il dividendo col quoziente appena ottenuto
jump $ADD #salta all'indirizzo della div

DaDiXxX
06-10-2009, 21:06
Originariamente inviato da ant_alt
l'algoritmo pare giusto, quindi che problema hai a tradurlo in assembler? :stordita:
se davvero sei arrivato l da solo perch ora ti sei bloccato alla fine?

sei sicuro che esista l'istruzione la?
http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html

inoltre la DIV credo sia sbagliata..in $t1 c' il numero decimale giusto? allora perch fai 2\numero? :stordita:
correggi: DIV $t1 $t2

e poi alla fine del codice aggiungi


beq $t3 $0 $END #$0 vale 0, $END l'ultimo indirizzo del programma
add $t1 $t3 $0 # sostituisci il dividendo col quoziente appena ottenuto
jump $ADD #salta all'indirizzo della div


il programma adesso scritto cos
#--------------------------->area dati<----------------
.data
mex: .asciiz" il valore convertito e': "
Buffer: .word 54

#------------------------->area programma<--------------
.text
.globl main

main: la $t0,Buffer #caricamento buffer
li $t1,0 #azzeramento registri
li $t2,2
li $s1,0
li $s2,0
li $t3,0


lw $t1,($t0) #estrazione valore buffer
loop: div $t1,$t2 #divisione per 2
mfhi $s1 #resto in s1
mflo $t3 #quoziente in t3
beq $t3,$0 fine #confronto
add $t1,$t3 $0 #sostituisco il dividendo col quoziente
j loop
fine:
li $v0,4 #caricamento codice print_string
la $a0,mex #puntatore alla stringa
syscall #chiamata di sistema

li $v0, 1 #codice print_int
move $a0,$t3
syscall

li $v0,10
syscall


devo stampare a video il valore...solo che mi d 0..invece dovrebbe darmi il valore binario di 54...

ant_alt
06-10-2009, 21:33
Originariamente inviato da DaDiXxX
..

-non hai ancora risposto: "LA" che istruzione ?$t0 contiene tutto il decimale giusto?

-hai verificato se per il tuo compilatore $0 vale davvero 0? altrimenti fai una variabile che vale 0..credo che possa essere questo il problema del tuo programma

- che compilatore usi?

DaDiXxX
06-10-2009, 21:45
Originariamente inviato da ant_alt
-non hai ancora risposto: "LA" che istruzione ?$t0 contiene tutto il decimale giusto?

-hai verificato se per il tuo compilatore $0 vale davvero 0? altrimenti fai una variabile che vale 0..credo che possa essere questo il problema del tuo programma

- che compilatore usi?

si la esiste perch l'ho sempre usato in tutti i programmi
in t0 c' il buffer e ho estratto il valore in t1
il problema che non concatena il risultato e mi stampa sempre lo stesso...
io utilizzo MARS

ant_alt
06-10-2009, 22:59
Originariamente inviato da DaDiXxX
il problema che non concatena il risultato e mi stampa sempre lo stesso...


certo che non concatena, dove hai visto che ho valutato questo?:)

se mi dici qual l'istruzione che stampa aggiusto il codice

devi stampare $t3 prima dell'istruzione add $t1,$t3 $0

DaDiXxX
07-10-2009, 07:11
Originariamente inviato da ant_alt
certo che non concatena, dove hai visto che ho valutato questo?:)

se mi dici qual l'istruzione che stampa aggiusto il codice

devi stampare $t3 prima dell'istruzione add $t1,$t3 $0
ma io non devo stampare il resto scritto al contrario?
divido sempre per due ma poi il resto il risultato che devo salvare, cio la codifca, scritta al contrario

Loading