call
pseudolyszt.net cubre call y otras instrucciones RISC-V con más detalle.
Descripción
call ejecuta una función y gestiona el retorno. Salta a la función y almacena la dirección de retorno en ra, lo que permite que la función regrese. Es una pseudoinstrucción que normalmente se expande a la instrucción de abajo.
jal ra, label
Cuando una función está demasiado lejos para que un solo salto la alcance, el ensamblador sustituye una secuencia más larga que cubre la distancia. Escribir call con el nombre de la función declara la intención y deja la elección de la forma al ensamblador. La entrada jal describe el salto y el guardado de la dirección de retorno. La línea de abajo llama a la función square.
call square
Llamar a una función también requiere un acuerdo sobre cómo pasa la información entre el llamador y el llamado. Ese acuerdo es la convención de llamada. El llamador coloca las entradas de la función en los registros de argumentos, llamados a0, a1 y así sucesivamente, y lee el resultado de a0 una vez que la función retorna. Ambas partes siguen la misma regla, así que el código escrito por separado sigue funcionando junto.
Cada call sobrescribe ra. Una función que hace sus propias llamadas guarda el ra que recibió antes de hacerlas, y luego restaura ese valor antes de su propio retorno. Sin esto, la dirección de retorno de la llamada interna reemplaza a la externa y la función no puede volver. Una función que no llama a nada más no necesita guardar ra.
El manual de RISC-V afirma que la convención de llamada estándar del software usa x1 como registro de dirección de retorno. Un jal alcanza objetivos dentro de más o menos 1 MiB, donde un MiB es 1.048.576 bytes. Un objetivo más lejano requiere un auipc seguido de jalr, que alcanza cualquier lugar en un rango de direcciones relativas al pc de 32 bits.
El ejemplo llama a square con 6 en a0 y encuentra 36 en a0 después. El argumento entra y el resultado sale a través de la convención.
Se expande a
jal ra, label
El ensamblador reemplaza esta pseudoinstrucción con la instrucción o instrucciones reales enumeradas arriba.
Ejemplo
call square # jumps to square; ra holds the return address
Referencias
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.1, Unconditional Jumps, page 30.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.1, Integer Register-Immediate Instructions, pages 28 to 29.
