mret

mret

Assembly RISC-V Referência

lyszt.net aborda mret e outras instruções RISC-V com mais detalhes.

Descrição

mret retorna de um tratador de trap. Um trap ocorre quando o processador interrompe o programa que está executando para que um tratador possa assumir o controle. Um tratador é uma rotina em um endereço fixo. Um dispositivo gera uma interrupção, como o botão da placa GPIO, e isso inicia um trap. O nome significa retorno em modo máquina.

mret

Quando um trap começa, o processador armazena o endereço da instrução interrompida em mepc, registra o motivo em mcause, limpa o bit de habilitação global de interrupções de mstatus e salta para o endereço do tratador contido em mtvec. mret desfaz isso. Ele carrega o contador de programa com o endereço em mepc e restaura o bit de habilitação de interrupções que mstatus salvou no início do trap. O programa interrompido então continua na instrução que estava prestes a executar.

mret não recebe operandos. Sem ele, o processador continua além do fim do tratador para o código que vier em seguida.

Uma interrupção pode chegar entre quaisquer duas instruções, e o programa interrompido não fez nenhuma preparação para isso. Um tratador, portanto, salva todos os registradores que altera e os restaura antes de mret.

Um tratador de botão também limpa o bit pendente do botão antes de mret. Se esse bit permanecer definido, a mesma interrupção dispara novamente assim que mret reativa as interrupções.

O exemplo escreve o endereço de target em mepc e executa mret, que salta para lá. Fora de um trap real, isso mostra o salto por si só. Consulte csrw para escrever em um CSR.

Exemplo

la t0, target
csrw mepc, t0
mret          # pc = mepc, so execution continues at target
target:
nop