Ayuda. Ensamblador MIPS R2000

Hola, estoy haciendo un programa en lenguaje ensamblador MIPS, con el programa PCSpim. Llevo dos días peleándome porque no consigo sacar el programa bien.

Mi objetivo es que aparezca en pantalla un mensaje, darle al intro, que aparezca un segundo mensaje, darle al intro y se cierra la consola. Así supuestamente debería hacerse la suma de dos números, y mostrar el resultado por pantalla. Pero eso ahora me importa poco. Lo que quiero es que cuando se abra la consola por primera vez, aparezca SOLAMENTE el primer mensaje ("vamos a realizar la suma de dos números"). Pero es que aparecen TODOS a la primera vez, le doy al intro y vuelven a salir. La segunda vez que le doy al intro, consigo que salga una linea de texto menos que antes, pero sigue sin ser lo que yo quiero. Yo quiero que aparezca primero la primera linea, le doy al intro, aparece la segunda, le doy al intro, aparece la tercera.

El código del programa es este:

###### SEGMENTO DE DATOS #######

.data 0x10000000

inicio: .ascii "\n Vamos a realizar la suma de dos números."
pant1: .ascii "\n ¿Cúal es el primer número?"
pant2: .ascii "\n ¿Cuál es el segundo número?"

###### SEGMENTO DE TEXTO ########

.text
.globl __start

__start: jal mostrar_inicio
jal mostrar_pant1
jal mostrar_pant2
jal fin



mostrar_inicio: li $v0,4
la $4,inicio
syscall

li $v0,5
syscall

jr $31

mostrar_pant1: li $v0,4
la $4,pant1
syscall

li $v0,5
syscall

move $a1,$v0

jr $31

mostrar_pant2: li $v0,4
la $4,pant2
syscall

li $v0,5
syscall

move $a2,$v0

jr $31





pausa: li $v0,5
syscall

jr $31

fin: li $v0, 10
syscall


------------------------------------------------

Por favor, respondedme, tengo cierta urgencia en comprender esto...
y un manualito no lo tendrias por aqui? Yo se los comandos del motorola HC12
Jajaja, quieres manual? Toma, inflate xD

http://www.teleco.upct.es/explorar_asignatura.php?ruta=Telematica/Primero/Fundamentos%20de%20computadores/Practicas/Primer_Cuatrimestre

De ahí bajate el archivo PCSpimUM.pdf, es el manual que nos aconsejó el profesor que nos imprimiéramos.

Un saludo.
Te urge mucho o que? Mmm creo que tu fallo no es de ensamblador, si no de programacion, es decir, de concepto. Puede ser?

(solo e mirado el primer ejemplo, ahora ire a mas, pero esperate que pongo a formatear el portatil xD)
Tengo el ensamblador de mips algo viejo.. pero ¿no te falta
li $v0, 8 # Número de servicio de llamada al sistema (read_string)
syscall
?

después de cada print_string, para esperar al intro..

Para usar read_string, sin embargo, hay que hacer algún comentario. Debe colocarse en $a1 el tamaño máximo (en bytes) que puede tener la cadena leída, pero incluyendo un carácter nulo (0x00) al final de la misma. Así, si ponemos en $a1 un valor n, PCSpim leerá del teclado como máximo n-1 caracteres, y colocará al final un byte nulo. Si el usuario teclea los n-1 caracteres, PCSpim terminará automáticamente la entrada (sin necesidad de pulsar intro). Si, por el contrario, el usuario teclea intro antes de llegar al último carácter, PCSpim coloca un carácter 0x0a (LF, line feed, o alimentación de línea) en la última posición, a continuación el byte nulo 0x00, y entonces termina la entrada.


Edit: Releyendo el código, veo que lo haces con un read_int.. pues así no sé, la verdad..
También recuerdo movidas entre usar .ascii y .asciiz
A ver, me urge... Esto es una cosa que estoy haciendo yo, pero es que para este segundo cuatrimestre, nos han mandado hacer un programa en ensamblador que resuelva un sistema de tres ecuaciones lineales, y resuelva sistemas de hasta veinte ecuaciones. Así que imaginaoslo, voy de puto culo, porque si me lio con esto, imaginate para introducir matrices, calcular determinantes...

etc_84, lo que tu estás diciendo es un READ_string. Eso lo que hace es que "capta" lo que introduzcas por el teclado y lo guarda en un registro. Si buscáis en el manual, el servicio de syscall correspondiente al print_string es el número 4, luego yo creo que la instrucción li $v0,4 y luego syscall, está bien...

Un saludo.

EDITO: Le pongo un read_int para de alguna forma "detener" el programa para que sólo muestre la siguiente línea cuando tú quieras, porque si no, ni consola ni nada...

Es posible que sea fallo de programación, porque yo no he programado en mi vida...
Si, lo del print_string ya lo he visto, yo digo para que luego te pille el enter..
Es que no se me ocurre ninguna forma para detener el programa si no es de esa forma. Pensé en que para hacer esa suma (que por ahora no me interesa puesto que me interesa esto de las pantallas) mover el número "capturado" con el read_int a otro registro, para luego poder mover a otro registro diferente el segundo número capturado...

La única diferencia entre las directivas .ascii y .asciiz, es que las dos sirve para almacenar cadenas, pero la .asciiz añade un carácter nulo (0x00) al final de la cadena
Siento no ayudarte mucho, pero he estado toqueteando y tengo el codigo que creo que hace lo que pides..

.data 0x10000000

inicio: .asciiz "\n Vamos a realizar la suma de dos números."
pant1: .asciiz "\n ¿Cúal es el primer número?"
pant2: .asciiz "\n ¿Cuál es el segundo número?"

.end

.text

main:

li $v0,4
la $4,inicio
syscall

li $v0,4
la $4,pant1
syscall

li $v0,5
syscall

move $a1,$v0

li $v0,4
la $4,pant2
syscall

li $v0,5
syscall

add $a1,$a1,$v0
move $a0,$a1
li $v0, 1
syscall


li $v0,5
syscall


Lo hago todo seguido.. ni me acuerdo ni tengo ganas de mirar como se estructuraba en funciones [jaja]

Te muestra la frasecita junto a pedirte el numero primero.. luego el otro numero.. y te enseña el resultado.. ya otra cosa es si quieres embellecer poniendo "el resultado de la suma blablabla..."

PD: Yo no guardo los dos números que entro por teclado.. el primero lo guardo en $a1 y luego hago la suma directa con el valor del buffer $v0 en el add $a1,$a1,$v0... manías que tiene uno de usar el menor número de registros posible.. :)

Si hay algo que no acabas de entender, avisa...
Un par de preguntas:

¿Porqué usas la directiva end al acabar el segmento de datos? Yo no recuerdo haberla usado nunca...

¿No le pones subrutinas?

P.D: ¿Cómo se hace para poner el texto así como tú lo has puesto?
¿Porqué usas la directiva end al acabar el segmento de datos? Yo no recuerdo haberla usado nunca...

No sé si es necesario.. a mi me enseñaron que lo pusiese...

¿No le pones subrutinas?

Es lo que te digo... no recuerdo como se hacían y ahora no hay ganas de revisarlo [burla2]

P.D: ¿Cómo se hace para poner el texto así como tú lo has puesto?

Con el tag [CODE] [/ CODE] :)

PD: Aquí [eia.udg.es], en apartado "Tema 9. Programes d'exemple en MIPS 32:", tienes unos cuantos ejemplos... de ahí aprendí yo, junto con este manual..
10 respuestas