Comprendiendo las ranuras de retardo de bifurcación para invertir MIPS

Estoy invirtiendo estáticamente algún software compilado para un Atheros AR7161 usando radare2. Este procesador implementa MIPS, y recuerdo que MIPS tiene una ranura de retardo de rama. De hecho, esto se nota en el desmontaje porque puedo ver instrucciones que deberían ejecutarse lógicamente antes de que las ramas se coloquen justo después de ellas.

Sin embargo, mientras analizaba algún fragmento de código, encontré una instrucción beqz para la cual asumiendo que la instrucción después de que debería ejecutarse primero no tiene sentido en el contexto del programa. Debo admitir que mi análisis podría estar equivocado, lo cual no es improbable; sin embargo, tengo algunas dudas que también me gustaría aclarar:

  • ¿Todas las instrucciones de bifurcación / salto siempre usan la ranura de retardo de bifurcación de modo que la instrucción inmediatamente posterior debería ejecutarse lógicamente primero? ? Si no es así, ¿en qué casos no lo haría?

  • ¿Hay alguna manera de hacer que radare2 muestre el orden de ejecución lógica en lugar del codificado en el binario?

Editar : concretamente, estoy tratando con la siguiente secuencia:

beqz v0, <some address> lb v0, 0x40(sp) 

Tengo una imagen muy difusa en mi cabeza acerca de estas instrucciones entrando en la canalización. Puedo imaginarme la segunda instrucción obtenida mientras se decodifica la primera; por lo tanto , la ejecución de la ranura de retardo de bifurcación debería comenzar. Sin embargo, la instrucción de bifurcación depende de que el mismo registro sea modificado por la instrucción en la ranura de retardo de bifurcación, entonces, ¿qué sucederá? ¿La instrucción de bifurcación evaluará la condición utilizando el registro antiguo va lue, o el nuevo actualizado por lb?

Gracias

Comentarios

  • Puede beneficiarse de leer la serie MIPS por Raymond Chen aquí: enlace La primera respuesta es no (y consulte el enlace para obtener más detalles). No puedo ' responder la segunda.

Responder

La instrucción en la ranura de retardo de bifurcación se evalúa después de la instrucción de bifurcación (o salto). La ejecución de la instrucción en la ranura de retardo de bifurcación no afecta la evaluación de la condición de la bifurcación.

He observado que la ranura de retardo de bifurcación se usa para algunas cosas:

  • Última instrucción del bloque básico que conduce a la instrucción de bifurcación
    • La prueba de bifurcación no dependerá de la salida del cálculo de la instrucción de ranura de retardo de bifurcación
    • Comúnmente visto con saltos / bifurcaciones incondicionales como b, jal
  • La primera instrucción del bloque de caída .
    • No debe haber efectos secundarios si se toma la sucursal.
    • El análisis mostrará que los registros afectados no son necesarios en caso de que se tome la sucursal
  • La primera instrucción del bloque si se toma la bifurcación
    • Si hay varias rutas al destino de la bifurcación, esta instrucción probablemente se verá varias veces con las diferentes bifurcaciones
  • La carga de un valor condicional, a menudo para valores devueltos

Este artículo entra en detalles sobre las ranuras de retardo de bifurcación.

Como señaló Igor, la versión «probable» de la instrucción de bifurcación mantiene los efectos de la instrucción en la ranura de demora de bifurcación solo si la instrucción se toma realmente.

Respuesta

  1. Hay variaciones de ramas condicionales llamadas «rama [bajo condición] probable», por ejemplo
    • bgezl – Rama en mayor o igual a cero probable
    • beql – Rama en Igual de probable

Estas instrucciones tienen un intervalo de retardo, pero la instrucción en el intervalo de retardo se ejecuta solamente si se toma la rama. Si no se toma la rama, la instrucción en la ranura de retardo es no ejecutada ( anulada ) .

Nota: estas instrucciones se han eliminado en la versión 6 de la arquitectura MIPS. También agregó variaciones compactas de ramas que no tienen ranuras de retardo

En cuanto a su fragmento, sospecho fuertemente que la rama usa el valor de registro antiguo , pero probablemente pueda confirmarlo solo ejecutándolo en un procesador real.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *