Oppure

Loading
24/05/10 15:57
DidyMond
Ciao ragazzi!
Vorrei chiedere un parere su questo linguaggio...
Io dovrei acquisire una stringa messa dall'utente solo che non mi è molto chiaro dove va a finire tale stringa cioè, io acquisisco la sringa in questo modo:

.data
stringa: .space 50

[...cut codice...]

li $v0,8       # Predispone la lettura da tastiera
la $a0,stringa 	
li $a1,50 
syscall 


Quello che mi serve a me, se ho capito finisce in $a0, ma come faccio a riempire un array?
E se poi devo stampare queste stringhe come faccio? Non posso usare il metodo 4 del system service per stampare questa stringa...

Sbaglio io a capire?
aaa
24/05/10 17:18
pierotofy
Postato originariamente da DidyMond:
Quello che mi serve a me, se ho capito finisce in $a0


$a0 conterrà l'indirizzo del primo carattere della stringa che ti serve. La stringa di per se è da qualche parte in memoria.

ma come faccio a riempire un array?


Puoi usare la syscall #9

sbrk      9      number of bytes ($a0)      address of block ($v0)


d.umn.edu/~gshute/spimsal/…

Che e' l'equivalente della malloc del C, dopodichè devi iterare per il numero di elementi che vuoi inserire nell'array e con un puntatore inizializzato al primo indirizzo dell'array ($v0) poi incrementi. Se hai delle basi di C sull'aritmetica dei puntatori bene, altrimenti consiglio di documentarti.

E se poi devo stampare queste stringhe come faccio? Non posso usare il metodo 4 del system service per stampare questa stringa...

Sbaglio io a capire?


Si puoi usare il metodo 4. E' fatto proprio per questo scopo...
Ultima modifica effettuata da pierotofy 24/05/10 17:19
Il mio blog: piero.dev
29/05/10 12:58
DidyMond
Ecco qua, ho aspettato un pò a risponderti perchè ho preferito avere chiarimenti anche dal mio professore...
Mi ha semplicemente detto che utilizzare una stringa sarebbe troppo lungo e rognoso, così mi ha suggerito di utilizzare un codice idenificativo per sapere cosa vuole inserire l'utente!
Beh, così effettivamente è più semplice e sono andato molto più avanti nel progetto!

Ora mi rimane da riordinare gli elementi nell'array (in modo crescente e viceversa) in modo ricorsivo.
E' possibile utilizzare la ricorsione per riordinare?
aaa
29/05/10 18:37
crack001
Certo che puoi usare la ricorsione...devi solo gestirla sull'indice...parti dall'inizio e la richiami con l'indice incrementato...mi raccomando se usi la ricorsione devi utilizzare una funzione, e quindi devi ricordarti di salvare $ra dentro lo stack, io ti consiglio di farti uno schemetto del tuo stack su carta cosi capisci meglio i punti dove ritorni...io ho fatto una cosa simile con la ricerca binaria ma ti viene piu complicato
aaa
04/06/10 15:37
DidyMond
Allora...piano piano ci sto riuscendo; riesco a riordinare un array ricorsivamente...

Però, quello che ora mi chiedo è se è possibile "associare" due array in quanto ho:
array1-->Prodotti (non stringhe ma codici)
array2-->Prezzi (floating)

Se io eseguo il sorting su array1 mi restituisce i codici prodotti ordinati, però se io devo stampare a video un "riepilogo" il prezzo-prodotto non corrisponde più

Non è che sia possibile "associare" i due array, cioè se io effettuo uno scambio nei prodotti mi scambia anche i prezzi?
come dovrei passare i dati al sorting?
aaa
04/06/10 15:39
pierotofy
Nella procedura di sorting, quando scambi gli elementi dell'array prodotti scambia gli elementi corrispettivi dell'array prezzi. Ad esempio se stai scambiando il prodotto i con quello j, scambia anche il prezzo i con quello j.
Il mio blog: piero.dev
04/06/10 17:00
DidyMond
Postato originariamente da pierotofy:

Nella procedura di sorting, quando scambi gli elementi dell'array prodotti scambia gli elementi corrispettivi dell'array prezzi. Ad esempio se stai scambiando il prodotto i con quello j, scambia anche il prezzo i con quello j.


Questo però vuol dire che per ogni operazione che faccio nel sorting dei prodotti lo devo fare anche in quello dei prezzi e quindi supponendo che:

$t0->indirizzo base di array Prodotti
$t1->indirizzo base di array Prezzi

Operazioni come queste (che nel sorting mi servono per avanzare di indice)

addi $t0, $t0, 4

Dovrei aggiungere anche

addi $t1, $t1, 4


Giusto? Il problema è che i registri scarseggiano perchè comunque dovrei prelevare sia i dati dell'array Prodotti che quello dei prezzi...o no?
aaa
05/06/10 0:04
pierotofy
Posta il codice completo... altrimenti non ti si può spiegare cosa bisogna fare; per la mancanza di registers io di solito risolvo utilizzando lo stack per allocare tutte le variabili locali (e anche per passare i parametri alle funzioni...)

Come in questo esempio: pierotofy.it/pages/sorgenti/dettagli/18486-Implementazione_OOP/

All'inizio della tua procedura:

addi	$sp, $sp, -4
sw	$s0, 0($sp)
move	$s0, $sp

# Create stack frame
addi	$sp, $sp, -4


$s0 diventa il tuo "base pointer" che ti servirà da "puntatore di base" per accedere alle variabili locali. Dopodichè puoi utilizzare -4($s0) per fare utilizzare una variabile da 4 bytes. Ma ne puoi allocare quante ne vuoi. Ad esempio modificare:

# Create stack frame
addi	$sp, $sp, -4


Con:

# Create stack frame
addi	$sp, $sp, -12


Ti permette di utilizzare tre variabili da 4 bytes (oppure 1 da 12).

Per accedere alle variabili tramite lo stack:

lw		$t0, 4($s0) 


Poi prima di uscire dalla procedura è importante deallocare lo stack:

move 	$sp, $s0
lw   	$s0, 0($sp)
addi 	$sp, $sp, 4


Leggiti bene l'esempio che ho linkato e fatti uno schemino a matita dello stack, passo per passo come viene eseguito. Se analizzi bene il programma riuscirai anche a capire come è possibile passare parametri tramite lo stack.
Ultima modifica effettuata da pierotofy 05/06/10 0:07
Il mio blog: piero.dev