Questão:
Compreender slots de atraso de ramificação para reverter MIPS
user25972
2018-10-12 20:16:10 UTC
view on stackexchange narkive permalink

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

Você pode se beneficiar da leitura da série MIPS de Raymond Chen aqui: [link] (https://blogs.msdn.microsoft.com/oldnewthing/20180402-00/?p=98415) A primeira resposta é não (e veja o link para detalhes). Eu não posso responder no segundo.
Dois respostas:
ChrisG
2018-10-15 18:35:37 UTC
view on stackexchange narkive permalink

A instrução no branch delay slot é avaliada após a instrução branch (ou salto). A execução da instrução no branch delay slot não afeta a avaliação da condição do branch.

Eu observei o branch delay slot ser usado para algumas coisas:

  • Última instrução do bloco básico que leva à instrução de desvio
    • O teste de desvio não depende da saída do cálculo da instrução de slot de atraso de desvio
    • Normalmente visto com saltos / desvios incondicionais como b , jal
  • A primeira instrução do bloco fall through.
    • Nenhum efeito colateral deve estar presente se a ramificação for tomada.
    • A análise mostrará que quaisquer registros afetados não são necessários caso a ramificação seja tomada
  • A primeira instrução de bloco se a ramificação for tomada
    • Se houver vários caminhos para o destino da ramificação, esta instrução provavelmente será vista várias vezes com as diferentes ramificações
  • A carga de um valor condicional, geralmente para valores de retorno

Este artigo entra em detalhes sobre slots de atraso de ramificação.

Conforme observado por Igor, a versão "provável" da instrução de desvio mantém os efeitos da instrução no slot de atraso de desvio apenas se a instrução for realmente executada.

Igor Skochinsky
2018-10-13 02:15:42 UTC
view on stackexchange narkive permalink
  1. Existem variações de ramificações condicionais chamadas "ramificação [na condição] provável", por exemplo,
    • bgezl - Ramificação maior que ou igual a zero provavelmente >
    • beql - Ramificar em igual provável

Essas instruções têm um intervalo de atraso, mas a instrução no intervalo de atraso é executado apenas se o ramo for obtido. Se a ramificação não for tomada, a instrução no slot de atraso não é executada ( anulada ).

NB: essas instruções foram removidas no Versão 6 da Arquitetura MIPS. Também adicionou variações compactas de branches que não têm slots de atraso

Quanto ao seu snippet, suspeito fortemente que o branch usa o valor de registro antigo , mas provavelmente você só pode confirmá-lo executando-o em um processador real.



Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 4.0 sob a qual é distribuído.
Loading...