PDA

Visualizza la versione completa : [Assembler MIPS] Manipolazione stringhe


gogetassj4dp
09-07-2005, 12:04
Ho un piccolo problema con un programma che dovrebbe acquisire una stringa da tastiera che rappresenta un'istruzione mips e convertirla con rispettivo codice binario. Io pensavo di acquisire la stringa e guardare il primo carattere per cominciare a vedere che tipo di istruzione è. Nel senso: se immetto lw $t1, 0($t2) vado a vedere la l e comincio già a capire che è una load. Il mio problema è però che nn riesco a capire come fare per prendere uno o + caratteri dalla stringa. Qualcuno mi può aiutare?? ve ne sarei molto grato!

floyd
10-07-2005, 07:59
usa load byte che è simile a load word lb %t1 0($t2)

gogetassj4dp
10-07-2005, 21:20
grazie quello sono riuscito a farlo, però una volta che ho capito che è una load ad esempio, devo riuscire a capire qual'è il codice del registro. come faccio senza usare una marea di stringhe e confronti? in pratica quello che voglio fare io è: se il registro è a0 deve restituirmi il codice 4, per a1 il codice 5 e così via...

floyd
10-07-2005, 22:35
alla fine sono pochi i registri, $t $s $a $v
una buona ottimizzazione sarebbe guardare il carattere e il numero in modo separato, ad esempio i $a e $v ricordo che sono consecutivi, dunque se sai che $a parte da 4 dopo aggiungi il numero, in pratica $a0 = 4+0, $a1 = 4+1 :ciauz:

gogetassj4dp
10-07-2005, 22:42
si infatti era quello che volevo fare, però il problema è uno... se io leggo la prima lettera del registo, supponiamo sia a, so che dovrò sommare a qualcosa il numero 4. Poi vado a leggere il secondo carattere, però questo me lo restituisce come stringa e nn come intero. quindi se leggo 0 nn leggo il numero ma la stringa. come faccio a fargli capire che deve interpretarlo come intero?

floyd
11-07-2005, 09:04
facile questo
$t1 = '1'
addi $t1 $t1 -48
:fighet:

gogetassj4dp
11-07-2005, 10:40
grazie mille! nn so come avrei fatto senza di te! ora provo, al massimo torno a rompere le scatole...

gogetassj4dp
11-07-2005, 10:59
altro piccolo problemino...
perchè se scrivo questa cosa

addi $t4, $t3, 4
li $v0, 1
move $a0, $t4
syscall

avendo t3=0 mi stampa 467?? nn riesco a capire! anche guardando i registri in t4 ottengo 4, però poi mi cambia il contenuto di a0 e nn capisco perchè..
edit: come nn detto, c'era una parte di codice che nn serviva a niente e mi stampava cose strane!

gogetassj4dp
11-07-2005, 11:40
scusa se disturbo ancora ma questa volta ho un problema serio. ti riporto una parte di codice per farti capire cosa dovrei fare

beq $t2, $s2, sa
beq $t2, $s5, sv
beq $t2, $s6, st
beq $t3, $s7, sp
beq $t2, $s4, ss
proc:
.
.
.
proc1
beq $t2, $s2, sa
beq $t2, $s5, sv
beq $t2, $s6, st
beq $t3, $s7, sp
beq $t2, $s4, ss

j rit
in pratica dovrebbe eseguire la prima parte, tornare a proc, andare avanti, eseguire il secondo pezzo di beq e ritornare a proc1. Come faccio però usando sempre le stesse procedure (sa, sv, st, sp, ss) a tornare una volta da una parte e una volta dall'altra? pensavo di memorizzare lo sp in $ra però nn riesco e nn so come fare...

edit: già che ci sono chiedo anche un altra cosa. una volta che ho tutto, codice operativo, e codice dei vari registri, come faccio a metterli assieme per creare un numero esadecimale o binario che mi rappresenta tutto?
inoltre vorrei chiederti una cosa. se io dovessi riconoscere una addiu i primi due operandi sono registri ma il terzo è un numero. se è di un solo byte riesco a convertirlo, ma se è di + byte come faccio a prenderlo tutto intero e nn a pezzi?
scusa se ti rompo così tanto ma è una cosa molto importante. grazie infinite! :)

Loading