Sto invertendo staticamente alcuni software compilati per un Atheros AR7161 usando radare2. Questo processore implementa MIPS e ricordo che MIPS ha uno slot di ritardo di ramo. Questo è davvero evidente nel disassemblaggio perché posso vedere istruzioni che dovrebbero essere eseguite logicamente prima che i rami vengano posizionati subito dopo di loro.
Tuttavia, analizzando qualche pezzo di codice, mi sono imbattuto in unistruzione beqz per la quale assumendo che listruzione dopo che dovrebbe essere eseguita per prima non ha senso nel contesto del programma. Devo ammettere che la mia analisi potrebbe essere sbagliata, il che non è improbabile; tuttavia, ho dei dubbi che vorrei chiarire:
-
Tutte le istruzioni di salto / salto usano sempre lo slot di ritardo del ramo in modo tale che listruzione subito dopo debba essere eseguita logicamente per prima ? In caso contrario, in quali casi non lo sarebbe?
-
Cè un modo per fare in modo che radare2 mostri lordine logico di esecuzione piuttosto che quello codificato nel binario?
Modifica : concretamente, ho a che fare con la seguente sequenza:
beqz v0, <some address> lb v0, 0x40(sp)
Ho unimmagine molto diffusa nella mia testa di queste istruzioni che entrano nella pipeline. Posso immaginare che la seconda istruzione venga recuperata mentre la prima viene decodificata; quindi , lesecuzione dello slot di ritardo del ramo dovrebbe effettivamente iniziare. Tuttavia, listruzione del ramo dipende dallo stesso registro che viene modificato dallistruzione nello slot del ritardo del ramo, quindi cosa accadrà? Listruzione del ramo valuterà la condizione utilizzando il vecchio registro va lue, o quello nuovo aggiornato da lb?
Grazie
Commenti
- Potresti trarre vantaggio dalla lettura della serie MIPS di Raymond Chen qui: link La prima risposta è no (e vedi il link per i dettagli). Non posso ' t rispondere al secondo.
Rispondi
Listruzione nello slot di ritardo di salto viene valutata dopo listruzione di salto (o salto). Lesecuzione dellistruzione nello slot di ritardo del ramo non influisce sulla valutazione della condizione del ramo.
Ho osservato che lo slot di ritardo del ramo può essere utilizzato per alcune cose:
- Ultima istruzione del blocco di base che porta allistruzione di salto
- Il test di salto non dipenderà dalloutput del calcolo dellistruzione slot di ritardo del ramo
- Comunemente visto con salti / rami incondizionati come
b
,jal
- La prima istruzione del blocco autunnale .
- Nessun effetto collaterale dovrebbe essere presente se il ramo viene preso.
- Lanalisi mostrerà che eventuali registri interessati non sono necessari nel caso in cui il ramo venga preso
- La prima istruzione di blocco se il ramo è preso
- Se ci sono più percorsi per la destinazione del ramo, questa istruzione sarà probabilmente vista più volte con i diversi rami
- Il caricamento di un valore condizionale, spesso per valori restituiti
Questo articolo entra nei dettagli sugli slot di ritardo del ramo.
Come notato da Igor, la versione “probabile” dellistruzione di ramo mantiene gli effetti dellistruzione nello slot di ritardo del ramo solo se listruzione viene effettivamente presa.
Risposta
- Ci sono variazioni di rami condizionali chiamati “ramo [a condizione] probabile”, ad es.
-
bgezl
– Diramazione su probabile maggiore o uguale a zero -
beql
– Diramazione su Equal Probabilmente
-
Queste istruzioni hanno uno slot di ritardo ma listruzione nello slot di ritardo viene eseguita solo se il ramo è stato preso. Se il ramo non viene preso, listruzione nello slot di ritardo è non eseguita ( nullified ) .
NB: queste istruzioni sono state rimosse nella Release 6 di MIPS Architecture. Ha anche aggiunto variazioni compatte di rami che non hanno slot di ritardo
Per quanto riguarda il tuo snippet, sospetto fortemente che il ramo usi il vecchio valore di registro, ma probabilmente puoi confermarlo solo eseguendolo su un processore effettivo.