- O que isso
rep; nop
significa? - É o mesmo que
pause
instrução? - É o mesmo que
rep nop
(sem o ponto e vírgula)? - Qual é a diferença para a
nop
instrução simples ? - Ele se comporta de maneira diferente nos processadores AMD e Intel?
- (bônus) Onde está a documentação oficial para essas instruções?
Motivação para esta questão
Depois de alguma discussão nos comentários de outra pergunta , percebi que não sei o que rep; nop;
significa em x86 (ou x86-64) assembly. E também não consegui encontrar uma boa explicação na web.
Eu sei que rep
é um prefixo que significa "repetir as próximas instruções cx
vezes" (ou pelo menos era, no antigo conjunto x86 de 16 bits). De acordo com esta tabela de resumo na Wikipedia , parece rep
só pode ser usado com movs
, stos
, cmps
, lods
, scas
(mas talvez essa limitação foi removida em processadores mais recentes). Assim, eu acho rep nop
(sem ponto-e-vírgula) repetiria nop
os cx
tempos de uma operação .
No entanto, depois de mais pesquisas, fiquei ainda mais confuso. Parece que rep; nop
e pause
mapeia exatamente para o mesmo opcode e pause
tem um comportamento um pouco diferente do que apenas nop
. Alguns e-mails antigos de 2005 diziam coisas diferentes:
- "tente não queimar muita energia"
- "é equivalente a 'nop' apenas com codificação de 2 bytes."
- "é mágico na inteligência. É como 'não, mas deixe o outro irmão HT correr'"
- "é uma pausa na inteligência e preenchimento rápido no Athlon"
Com essas opiniões diferentes, eu não conseguia entender o significado correto.
Ele está sendo usado no kernel Linux (em ambos i386 e x86_64 ), junto com este comentário: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
Ele também está sendo usado no BeRTOS , com o mesmo comentário.