ecall
lyszt.net cubre ecall y otras instrucciones RISC-V con más detalle.
Descripción
ecall le pide al entorno en el que se ejecuta tu programa que realice un servicio. El ensamblador puede sumar y mover números, pero la pantalla, el teclado y otros dispositivos pertenecen al sistema que aloja el programa, por lo que el código no puede acceder a ellos por sí solo. ecall significa llamada al entorno. Detiene tu código, el anfitrión lleva a cabo el servicio y el control regresa a tu código. El anfitrión es un sistema operativo sobre hardware real, y en este simulador es el propio simulador.
El programa nombra el servicio que quiere. Por convención, el número de servicio va en a7, cualquier dato que el servicio necesite va en a0, y luego se ejecuta ecall. Este simulador ofrece estos servicios: 1 imprime el entero en a0, 4 imprime el texto en la dirección en a0, 5 lee un número de la entrada en a0, 10 termina el programa, y 32 pausa durante a0 milisegundos.
Para imprimir un número, carga 1 en a7 para seleccionar el servicio de impresión, carga el número en a0 y ejecuta ecall. El ejemplo hace esto. El servicio 10 termina un programa, por eso las lecciones terminan con las dos líneas de abajo. Sin él, el procesador continúa más allá de la última línea hacia lo que venga después.
li a7, 10 ecall
El manual de RISC-V afirma que ecall realiza una solicitud de servicio al entorno de ejecución, y que el entorno decide cómo se pasan los parámetros, normalmente en registros enteros definidos. Este simulador es el entorno aquí y define los números de servicio listados arriba. El manual también señala que ecall alguna vez se llamó scall. Su compañera ebreak devuelve el control a un depurador. Ambas generan una trampa precisa solicitada al entorno.
Un sistema operativo completo funciona de la misma manera, con una lista más larga de servicios.
Ejemplo
li a7, 1 # service 1 = print integer li a0, 42 ecall # prints 42
