Estou revertendo estaticamente alguns softwares compilados para um Atheros AR7161 usando o Radare2. Este processador implementa MIPS, e eu me lembro que MIPS tem um slot de atraso de ramificação. Isso é realmente perceptível na desmontagem porque posso ver as instruções que devem ser executadas logicamente antes que os ramos sejam colocados logo após eles.
No entanto, ao analisar algum trecho de código, encontrei uma instrução beqz para a qual, assumindo a instrução após ela deve ser executada primeiro não faz sentido no contexto do programa. Devo admitir que minha análise pode estar errada, o que não é improvável; no entanto, tenho algumas dúvidas que também gostaria de esclarecer:
-
Faça todas as instruções de desvio / salto sempre usar o slot de atraso de desvio de forma que a instrução logo após deve ser logicamente executada primeiro ? Se não, em quais casos não seria?
-
Existe alguma maneira de fazer o radare2 mostrar a ordem de execução lógica em vez daquela codificada no binário?
Editar : concretamente, estou lidando com a seguinte sequência:
beqz v0, <some address>lb v0, 0x40 (sp)
Tenho uma imagem muito difusa na minha cabeça sobre essas instruções indo para o pipeline. Posso imaginar a segunda instrução sendo buscada enquanto a primeira está sendo decodificada; portanto, a execução do slot de atraso de ramificação deve realmente começar. No entanto, a instrução de ramificação depende do mesmo registro sendo modificado pela instrução no slot de atraso de ramificação, então o que acontecerá? A instrução branch avaliará a condição usando o valor do registrador antigo ou o novo atualizado por lb?
Obrigado