Entrada y salida
gestiona toda la entrada y salida. Una (llamada al entorno) pide al sistema operativo o al simulador que realice un servicio para tu código ensamblador. La pantalla y el teclado son dos de los servicios disponibles de esta forma.
Coloca el número de servicio en a7, cualquier argumento en a0, luego activa . Los servicios que este simulador conoce:
1 # imprimir entero (a0 = número)4 # imprimir cadena (a0 = dirección del texto)5 # leer entero (resultado devuelto en a0)10 # salir del programa32 # pausa (a0 = milisegundos)
a7 = 1 selecciona el servicio de impresión.
a7 indica qué servicio se debe ejecutar, y a0 transporta lo que ese servicio necesite: un valor que imprimir, una dirección de la que leer, un tiempo de espera. La lista es fija y breve, con cinco entradas, por lo que aprender este protocolo de comunicación una sola vez cubre todas las formas en que este simulador se comunica con el mundo exterior. Un sistema operativo real amplía esta misma idea a una lista mucho más larga.li a7, 5 # leer entero -> a0ecalladd a0, a0, a0 # duplícaloli a7, 1 # imprimir enteroecallli a7, 10ecall
selecciona la lectura de enteros y hace una pausa para la entrada, devolviendo tu número en a0. suma a0 consigo mismo, duplicándolo en el lugar. Luego y imprimen el resultado, y y salen. Cuando lo ejecutas, el simulador muestra un cuadro de entrada. Escribe un número y observa cómo vuelve duplicado.
Imprimir texto
Primero, dos términos nuevos. Una sección es una región etiquetada de tu programa: las instrucciones se encuentran en la sección .text, mientras que los datos fijos, como el texto, se encuentran en la sección .data. Y una dirección es simplemente un número que identifica una posición en la memoria. En lugar de transportar una cadena completa, un registro puede contener la dirección donde comienza la cadena, y el servicio de impresión lee a partir de ahí.
El texto va en la sección de datos. Le asignas una etiqueta y luego usas ("load address") para cargar la dirección de esa etiqueta y el servicio 4 para imprimirlo.
.datamsg: .string "Hello, RISC-V!\n".textla a0, msg # a0 = dirección del textoli a7, 4 # imprimir cadenaecallli a7, 10ecall
En .data, la directiva reserva espacio para el texto y asigna la etiqueta msg. .string almacena los caracteres y añade \n, un salto de línea. En .text, coloca la dirección del texto en a0, elige el servicio de impresión de cadenas, y imprime caracteres desde esa dirección hasta llegar al final de la cadena. Después, el programa termina como de costumbre.
