function - registros - las funciones(procedimientos) en MIPS
lenguaje ensamblador mips (3)
Soy nuevo en el lenguaje MIPS y no entiendo cómo funcionan las funciones (procedimientos) en el lenguaje ensamblador MIPS. Aquí están, pero voy a especificar mi problema:
Que hace:
jal
-
jr
-
$ra
significa en el lenguaje mips y lo importante
- ¿Cómo podemos usarlos cuando queremos crear una función o (procedimiento)?
1. las dos primeras son instrucciones, la tercera es una especie de registro especial
- jal = jump y link (Dirección de las siguientes instrucciones puestas en $ ra, y salta a la dirección de destino)
- jr = saltar para especificar el registro
- $ ra = dirección de devolución
a menudo usamos la instrucción de esta manera ...
- jr $ ra (Copiar $ ra al contador del programa)
significa retorno (salto) a la dirección guardada en $ ra.
2.
Aquí hay una función de ejemplo (procedimiento) en C
int main(){
x=addthem(a,b);
}
int addthem(int a, int b){
return a+b;
}
función en MIPS
.text
main: #assume value a is already in $t0, b in $t1
add $a0,$0,$t0 # it''s the same function as move the value
add $a1,$0,$t1
jal addthem # call procedure
add $t3,$0,$v0 # move the return value from $v0 to where we want
syscall
addthem:
addi $sp,$sp,-4 # Moving Stack pointer
sw $t0, 0($sp) # Store previous value
add $t0,$a0,$a1 # Procedure Body
add $v0,$0,$t0 # Result
lw $t0, 0($sp) # Load previous value
addi $sp,$sp,4 # Moving Stack pointer
jr $ra # return (Copy $ra to PC)
En primer lugar, es posible que desee verificar esta referencia rápida de MIPS. Realmente me ayudó.
En segundo lugar, para explicar jal
, jr
y $ra
. Lo que hace jal <label>
es saltar a la label
etiqueta y almacenar el contador del programa (piénselo como la dirección de la instrucción actual) en el registro $ra
. Ahora, cuando quieras regresar de la label
al lugar donde inicialmente estabas, simplemente usas jr $ra
.
Aquí hay un ejemplo:
.text
main:
li $t0, 1
jal procedure # call procedure
li $v0, 10
syscall
procedure:
li $t0, 3
jr $ra # return
Al ejecutar esto en un emulador SPIM, observará que el valor que queda en $t0
es 3, el que se carga en el llamado procedimiento .
Espero que esto ayude.
Le conviene leer la Interfaz binaria de la aplicación System V, Suplemento del procesador MIPS RISC . Esto describe las convenciones utilizadas para las funciones de llamada, en particular cómo se gestiona la pila y se intercambian los parámetros (no hay pila de hardware en MIPS, todo es una cuestión de convenciones de software, y la ABI define esas convenciones).
El documento anterior asume algunos conocimientos básicos de lo que hacen las instrucciones MIPS, por lo que también necesitará la Arquitectura MIPS32 para programadores , en particular el volumen II (conjunto de instrucciones), que describe el efecto detallado de cada instrucción. Pero, hazte un favor, descarga y lee el volumen I (introducción) primero.
La instrucción jal
es el código de operación " saltar y vincular ". Salta en la dirección de destino (que es la dirección del primer código de operación del procedimiento llamado) mientras guarda el puntero de instrucción actual en el registro de enlace , que es el registro 31 (para ser más precisos, guarda en el registro 31 el valor x +8 , donde x es la dirección del código de operación jal
sí).