Alguns códigos NOP são tratados de maneira diferente de outros?

12

Estou curioso sobre isso, digamos que tenho:

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

É executado exatamente o mesmo que este?

00000000001 0F1F00                          nop        dword [ds:rax]

Que efeito teria o segundo exemplo em oposição ao primeiro?

Tom Boobas
fonte
1
Eu estaria inclinado a pensar que o segundo seria executado mais rápido que o primeiro, pois é uma instrução em vez de 3. É possível que o pipelining moderno mude isso.
Loren Pechtel 29/07
1
Por que isso está marcado com c ?
29512 Keith Thompson
Google para multi byte nop, aparece alguns resultados.
Phant0m
1
@KeithThompson - puxei as tags C e de estilo de codificação; eles não pertenciam.
@ phant0m - você colocaria esse comentário em uma resposta e resumiria alguns dos resultados mais relevantes? Nem todos nós temos o histórico necessário para entender corretamente o que voltaria dessa consulta de pesquisa.

Respostas:

2

Depende da arquitetura da máquina. O KA-10 clássico (pdp-10) tinha muitos códigos nop, provavelmente uma conseqüência de seu conjunto de instruções altamente regular e o fato de que tudo foi implementado por componentes discretos, não por microcódigo. Alguns NOPs faziam referência à memória, outros eram testes de salto que nunca foram pulados, mas mesmo assim testaram a condição que poderia ter causado um salto, e assim por diante. "JFCL 0" foi anunciado no manual como o mais rápido.

ddyer
fonte
Trabalhei em um montador (8085?) Uma vez que oferecia a opção de substituir vários NOPs por uma única instrução JMP. Você conseguiu o alinhamento desejado sem pagar a penalidade de desempenho. Prático quando você tinha seqüências de caracteres no PIC, não é tão útil se você tiver loops de tempo baseados na CPU (e é por isso que estava desativado por padrão).
TMN
Na maioria das vezes, a instrução NOP é usada para inserir um pequeno atraso, geralmente como resultado de alguma dependência de hardware ou solução de erros no dispositivo. A penalidade de desempenho é o motivo do uso do NOP.
uɐɪ
1
nops têm muitos usos esotéricos. Algumas arquiteturas têm requisitos de alinhamento de bytes para saltos. O código de modificação automática (horrores!) Usava nops como pontos de emenda. Os sistemas de erros usavam nops para armazenar informações sobre afirmações com falha.
ddyer 30/07/12
@ ddyer: Alguns processadores têm instruções (algumas vezes documentadas, outras não) que buscarão um byte de memória e ignorarão completamente o valor buscado ou não farão nada com ele, exceto os sinalizadores definidos pelos quais o programador pode não se importar. No 6502, era bastante comum usar a instrução "BIT abs" como um meio de devorar os próximos dois bytes; também existem alguns códigos de operação não documentados que se comportam de maneira semelhante, exceto que eles não atualizam nenhum sinalizador. Porém, uma ressalva com esses truques: eles farão com que um byte do espaço de endereço seja lido. Alguns periféricos 6502 podem reagir às operações de leitura.
supercat 18/09/12
0

Parece que o segundo exemplo deve ser executado mais rápido que o primeiro. No primeiro exemplo, três instruções separadas serão executadas. No segundo, apenas uma instrução. Os NOPs de vários bytes destinam-se a ser usados ​​para "dicas" da CPU (exatamente como e quando é aparentemente confidencial ). Eles podem ser úteis para fins de alinhamento (para iniciar um loop restrito em uma linha de cache), mas atualmente não têm outro uso. Não está claro se a CPU realmente avalia os argumentos; portanto, não é possível dizer se aumenta o tempo de decodificação da instrução ou incorre em uma penalidade de acesso à memória. Alguém com um bom ICE deseja testar um desses e ver quais endereços aparecem em um rastreamento de barramento?

TMN
fonte
Embora muitos montadores 6502 usem o mnemônico "NOP" para opcodes não documentados que executam uma busca de memória (por exemplo, NOP $ 1FF9) seria uma instrução de dois bytes que lê o endereço 0x1FF9 e ignora o valor lido), eu não esperaria que um fabricante de chips use o termo "nop" para uma instrução que faça algo além do avanço do ponteiro do contador / instrução do programa, pois não há garantia de que um processador não será conectado ao hardware que aciona ações (por exemplo, alternando para o banco de códigos 1) quando determinados endereços (como 0x1FF9 ) são acessados ​​e esse acionamento não é exatamente "sem operação".
supercat