resueltos registros lenguaje instrucciones ensamblador ejercicios assembler function mips procedure

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:

  1. Que hace:

    • jal
    • jr
    • $ra

    significa en el lenguaje mips y lo importante

  2. ¿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í).