2011-09-28 8 views
5

Estoy usando algo como SPIMS o MARS con funciones de syscall.Accediendo a un carácter en una cadena

que estoy leyendo en una cadena (y funciona porque puedo imprimirlo) de la siguiente manera:

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

Sin embargo, estoy teniendo problemas para acceder a un único carácter de la cadena. Así que si quiero acceder al primer carácter e imprimirlo, estoy tratando esto:

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

Si intento algo como esto:

la $a0, string 
li $v0, 4 
syscall 

Esto muestra toda la cadena como puntos de cadena en el cadena completa

Si intento algo como:

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

Me da un error de salto. Aunque no entiendo por qué, ¿no es un carácter un byte largo y esto simplemente carga el primer byte de la cadena en $ a0?

Gracias

Respuesta

10

Mirando el documentation para las funciones de llamadas al sistema MARS se puede ver que el servicio 4, que está utilizando, espera $a0 a ser "[la] dirección de la cadena terminada en cero para imprimir", lo que explica el comportamiento que estás viendo.

Lo que desea es la función 11 "imprimir carácter", que imprime el byte de orden inferior como un carácter. En otras palabras, lo siguiente debería funcionar (no probado):

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

IMO siempre debe restablecer los valores de los registros antes de ejecutar LI. Nunca se sabe lo que podría tener la mitad de la palabra superior. – m0skit0

+4

'LI' es un pseudo-op que el ensamblador normalmente expande a' ORI $ rd, $ zero, low16bits' seguido de 'LUI $ rd, hi16bits'. Los 32 bits completos del registro de destino se configuran correctamente después de una instrucción 'LI', por lo que no es necesario reiniciar manualmente el registro antes de un' LI'. – markgz

+0

Definitivamente tienes razón – m0skit0

Cuestiones relacionadas