2011-09-28 11 views
5

Sto usando qualcosa come SPIMS o MARS con le funzioni syscall.Accesso a un carattere in una stringa

sto leggendo in una stringa (e funziona perché posso stamparlo) come segue:

li $v0, 8 
la $a0, string 
li $a1, 256 
syscall 

Tuttavia, sto avendo un problema di accesso un singolo carattere della stringa. Quindi, se voglio accedere al primo carattere e stamparlo, sto cercando questo:

la $t0, string 
lb $a0, ($t0) 
li $v0, 4 
sys call 

Se provo qualcosa di simile:

la $a0, string 
li $v0, 4 
syscall 

Questo stampa l'intera stringa come punti di stringa al intera stringa.

Se provo qualcosa di simile:

la $a0, string 
lb $a0, ($t0) 
li $v0, 4 
syscall 

Mi dà un errore di limite. Non capisco perché però - non è un carattere lungo un byte e questo carica solo il primo byte dalla stringa in $ a0?

Grazie

risposta

10

Guardando il documentation per le funzioni syscall MARS si può vedere che il servizio 4, che si sta utilizzando, si aspetta $a0 di essere "l'indirizzo [la] di stringa null-terminated per la stampa", che spiega il comportamento che stai vedendo.

Quello che si desidera è la funzione 11 "carattere di stampa", che stampa il byte di ordine inferiore come carattere. In altre parole, il seguente dovrebbe funzionare (non testato):

la $t0, string 
lb $a0, ($t0) 
li $v0, 11 
syscall 
+3

IMO è necessario reimpostare sempre i valori dei registri prima di eseguire LI. Non sai mai cosa potrebbe avere la mezza parola superiore. – m0skit0

+4

'LI' è uno pseudo-op che l'assemblatore di solito si espande in' ORI $ rd, $ zero, low16bits' seguito da 'LUI $ rd, hi16bits'. I 32 bit completi del registro di destinazione sono impostati correttamente dopo un'istruzione 'LI', quindi non è necessario ripristinare manualmente il registro prima di un' LI'. – markgz

+0

Hai decisamente ragione – m0skit0