Instruções Retorno no 8086: RET vs. IRET
Ambas instruções retornam controle de procedimento/interrupção, mas diferem em restauração de contexto.
RET (Return from Subroutine)
- Propósito: Retorno de CALL (near/far).
- Ação: Desempilha IP (near) ou CS:IP (far) da stack.
- Stack: Caller empilha endereço retorno; RET desempilha.
- Flags: Não modifica registrador flags.
- Variantes: RET (near), RET n (desempilha n bytes após retorno), RETF (far).
IRET (Interrupt Return)
- Propósito: Retorno de handler interrupção (hardware INT, software INT, exceção).
- Ação: Desempilha IP, CS, FLAGS (nesta ordem) da stack.
- Stack Frame (empilhado pela CPU na interrupção):
FLAGS CS IP
(Mais error code para algumas exceções.) - Restaura: Estado completo processador (segmento, instruction pointer, todas flags: IF, TF, CF, etc.).
- Necessário para re-habilitar interrupções (IF=1) se handler desabilitou.
Tabela Comparação
| Feature | RET | IRET |
| Desempilha IP | Sim | Sim |
| Desempilha CS (far) | Sim (RETF) | Sim |
| Restaura FLAGS | Não | Sim |
| Usado Para | CALL (subrotinas) | INT / Exceção / NMI |
| Interrupt Enable (IF) | Inalterado | Restaurado da stack |
| Verificação Privilégio | Não | Sim (se mudança CPL) |
Insight Chave
IRET restaura FLAGS; RET não. Crítico porque handlers interrupção frequentemente limpam IF (desabilitam interrupções) e modificam outras flags. IRET garante código interrompido retoma com estado exato flags. Usar RET em ISR deixaria IF=0, congelando sistema.
Adições Modo Protegido
- IRET pode mudar nível privilégio (retorno user mode de kernel). Carrega SS:ESP da stack se mudança DPL.
- RET não pode mudar CPL.
- Interrupções Task Gate usam IRET para trocar tasks (legado).
Em x86-64 moderno, SYSRET/SYSEXIT substituem IRET para syscall return rápido, mas IRET permanece para interrupções/exceções.