NOP (código) - NOP (code)
Código da máquina |
---|
Conceitos gerais |
Instruções |
Na ciência da computação , um NOP , no-op ou NOOP (pronunciado "no op"; abreviação de nenhuma operação ) é uma instrução em linguagem de máquina e seu mnemônico em linguagem de montagem , declaração de linguagem de programação ou comando de protocolo de computador que não faz nada.
Instruções em linguagem de máquina
Alguns conjuntos de instruções de computador incluem uma instrução cujo propósito explícito é não alterar o estado de nenhum dos registros acessíveis pelo programador , sinalizadores de status ou memória . Freqüentemente, leva um número bem definido de ciclos de clock para ser executado. Em outros conjuntos de instruções, não há instrução NOP explícita, mas o NOP mnemônico em linguagem assembly representa uma instrução que atua como NOP; por exemplo, no SPARC , sethi 0, %g0
.
Um NOP não deve acessar a memória, pois isso pode causar uma falha de memória ou falha de página .
Um NOP é mais comumente usado para fins de cronometragem, para forçar o alinhamento da memória , para evitar riscos , para ocupar um slot de atraso de ramificação , para anular uma instrução existente, como um salto, como um alvo de uma instrução de execução ou como um local titular a ser substituído por instruções ativas posteriormente no desenvolvimento do programa (ou substituir instruções removidas quando a reorganização for problemática ou demorada). Em alguns casos, um NOP pode ter efeitos colaterais menores; por exemplo, na série de processadores Motorola 68000 , o opcode NOP causa uma sincronização do pipeline .
Listadas abaixo estão as instruções NOP para algumas arquiteturas de CPU:
Arquitetura de CPU | Instrução mnemônica | Bytes | Código de operação | Notas |
---|---|---|---|---|
Família de CPU Intel x86 |
NOP
|
1; 1–9 para i686 e x86-64 | 0x 90 | 0x90 decodifica xchg eax, eax em todos os modos, exceto no modo longo , onde o opcode 0x90 ainda não tem efeito. As codificações mais longas são descritas no manual da Intel.
|
Família Intel 8051 / MCS-51 |
NOP
|
1 | 0x00 | |
ARM A32 |
NOP
|
4 | 0x00000000 | Isso significa andeq r0, r0, r0 . A instrução de montagem nop provavelmente se expandirá para mov r0, r0 que é codificado 0xE1A00000 (arquitetura little-endian). |
ARM T32 (16 bits) |
NOP
|
2 | 0xb000 | Opcode para ADD SP, # 0 - adiciona zero ao ponteiro da pilha (sem operação). A instrução de montagem nop provavelmente se expandirá para mov r8, r8, que é codificado em 0x46C0. |
ARM T32 (32 bits) |
NOP
|
4 | 0xF3AF 8000 | |
ARM A64 (64 bits) |
NOP
|
4 | 0xD503201F | |
AVR |
NOP
|
2 | 0x0000 | um ciclo de clock |
IBM System / 360 , IBM System / 370 , IBM System / 390 , z / Architecture , UNIVAC Series 90 |
NOP
|
4 | 0x47000000 ou 0x470nnnnn ou 0x47n0nnnn onde "n" é qualquer valor de 4 bits. | O NOP ("No-Op") e NOPR ("No-Op Register") são um subconjunto das instruções "Branch on Condition" ou "Branch on Condition Register", respectivamente; ambas as versões têm duas opções para gerar um NO-OP.
No caso das instruções NOP e NOPR, o primeiro 0 no segundo byte é o valor da "máscara", a condição para testar como igual, diferente, alto, baixo, etc. Se a máscara for 0, não haverá desvio ocorre. No caso da instrução NOPR, o segundo valor no segundo byte é o registrador para o desvio. Se o registro 0 for escolhido, nenhuma ramificação ocorrerá independentemente do valor da máscara. Portanto, se qualquer um dos dois valores no segundo byte for 0, a ramificação não acontecerá. No caso da instrução NOP, o segundo valor no segundo byte é o registro "base" de um registro base combinado, registro de deslocamento e endereço de deslocamento. Se o registro de base também for 0, o ramal não é obtido independentemente do valor do registro de deslocamento ou endereço de deslocamento. |
NOPR
|
2 | 0x0700 ou 0x070n ou 0x07n0 onde "n" é qualquer valor de 4 bits. | ||
SuperH |
NOP
|
2 | 0x0009 | |
MIPS |
NOP
|
4 | 0x00000000 | Significa sll r0,r0,0 : Desloca logicamente o registrador 0 zero bits para a esquerda e armazena o resultado no registrador 0. As gravações no registrador 0 são ignoradas; sempre contém 0.
|
MIPS-X |
NOP
|
4 | 0x60000019 | (opcode estendido para add r0,r0,r0 )
|
MISTURAR |
NOP
|
1 palavra | ± * * * * 0 | Os * bytes são arbitrários e podem ser qualquer coisa de 0 ao byte máximo (deve estar no intervalo 63-99). MIX usa representação de magnitude de sinal. |
MMIX |
SWYM
|
4 | 0xFD ****** | SWYM significa "simpatizar com a sua máquina". Os * dígitos podem ser escolhidos arbitrariamente. |
Família Motorola 68000 |
NOP
|
2 | 0x4E71 | Isso sincroniza o pipeline e evita a sobreposição de instruções. |
Motorola 6809 |
NOP
|
1 | 0x12 | |
Tecnologia MOS 65xx (por exemplo, 6502 ) |
NOP
|
1 | 0xEA | NOP consome dois ciclos de clock. Os opcodes indefinidos nasversões NMOS da família 65xx foram convertidos em NOPs de comprimentos de instrução e tempos de ciclo variados no 65C02 . |
PowerPC |
NOP
|
4 | 0x60000000 | (opcode estendido para ori r0,r0,0 )
|
Microcontrolador PIC |
NOP
|
12 bits | 0b000000000000 |
MOVW 0,W
|
RISC-V |
NOP
|
4 | 0x00000013 |
ADDI x0, x0, 0
|
SPARC |
NOP
|
4 | 0x01000000 | Significa sethi 0, %g0 que zera o %g0 registro
conectado a zero |
Z80 |
NOP
|
1 | 0x00 | Existem algumas outras instruções sem qualquer efeito (e ao mesmo tempo): LD A, A , LD B, B etc.
|
PDP-10 |
JFCL 0, (convencional)JUMP, SETA, SETAI, CAI, TRN, TLN
|
1 palavra | 25500 ******* (octal) | Pule nunca Pule nunca, não defina nada, pule nunca |
PDP-11 |
NOP
|
16 bits | 000240 (octal) | Não elimine nenhum dos códigos de condição |
VAX |
NOP
|
1 | 0x01 | O atraso depende do tipo de processador |
Do ponto de vista do projeto de hardware, as áreas não mapeadas de um barramento geralmente são projetadas para retornar zeros; uma vez que o comportamento do slide NOP é frequentemente desejável, ele fornece uma tendência para codificá-lo com o opcode totalmente zerado.
Código
Uma função ou sequência de instruções da linguagem de programação é uma instrução NOP ou nula se não tiver efeito. As instruções nulas podem ser exigidas pela sintaxe de algumas linguagens em certos contextos.
Ada
Em Ada , a null
declaração funciona como um NOP. Como a sintaxe proíbe que as instruções ou funções de controle sejam vazias, a null
instrução deve ser usada para especificar que nenhuma ação é necessária. (Assim, se o programador se esquecer de escrever uma sequência de instruções, o programa não conseguirá compilar.)
C e derivados
A instrução NOP mais simples em C é a instrução nula , que é apenas um ponto e vírgula em um contexto que requer uma instrução.
;
Um bloco vazio (instrução composta) também é um NOP e pode ser mais legível:
{}
Em alguns casos, como o corpo de uma função, um bloco deve ser usado, mas pode estar vazio. Em C, as instruções não podem ser vazias - as instruções simples devem terminar com a; (ponto-e-vírgula) enquanto as instruções compostas são colocadas entre {} (colchetes), o que não precisa de um ponto-e-vírgula seguinte. Assim, em contextos em que uma instrução é gramaticalmente exigida, algumas dessas instruções nulas podem ser usadas.
A instrução nula é inútil por si só, mas pode ter um uso sintático em um contexto mais amplo, por exemplo, dentro do contexto de um loop:
while (getchar() != '\n') {}
alternativamente,
while (getchar() != '\n')
;
ou mais conciso:
while (getchar() != '\n');
(observe que a última forma pode ser confusa e, como tal, gera um aviso com alguns compiladores ou opções do compilador, já que o ponto-e-vírgula geralmente indica o fim da instrução de chamada de função quando colocado após um parêntese no final da linha).
O código acima continua chamando a função getchar () até retornar um caractere \ n (nova linha), essencialmente avançando o local de leitura atual da entrada padrão para o início da próxima linha.
Fortran
Em Fortran , a CONTINUE
instrução é usada em alguns contextos, como a última instrução em um loop DO, embora possa ser usada em qualquer lugar e não tenha nenhuma funcionalidade.
JavaScript
A linguagem JavaScript não possui uma instrução NOP embutida. Muitas implementações são possíveis:
- Use a
;
instrução vazia ou a instrução de bloco{}
vazio da mesma maneira que nos exemplos C e derivados ; - Use a expressão
undefined
ounull
como uma declaração completa (uma declaração de expressão ) quando os métodos anteriores não forem permitidos pela sintaxe.
As alternativas, nas situações em que uma função é exigida, são:
- Use a
Function.prototype()
função embutida, que aceita qualquer argumento e retornaundefined
; - Use uma função NOP disponível em uma biblioteca de terceiros - veja abaixo;
- Defina uma função NOP personalizada, como no exemplo a seguir (usando a sintaxe da função de seta ES6 ):
const noop = () => {};
AngularJS
A estrutura AngularJS fornece a função angular.noop que não executa nenhuma operação.
jQuery
A biblioteca jQuery fornece uma função jQuery.noop()
que não faz nada.
Lodash
A biblioteca Lodash fornece uma função _.noop()
, que retorna indefinido e não faz nada.
Pascal
Tal como acontece com C, o; usado sozinho pode ser usado como uma instrução nula em Pascal . Na verdade, devido à especificação da linguagem, em um bloco BEGIN / END, o ponto-e-vírgula é opcional antes da instrução END, portanto, um ponto-e-vírgula usado ali é supérfluo.
Além disso, um bloco que consiste em BEGIN END;
pode ser usado como um espaço reservado para indicar nenhuma ação, mesmo se colocado dentro de outro bloco BEGIN / END.
Pitão
A linguagem de programação Python possui uma pass
instrução que não tem efeito quando executada e, portanto, serve como um NOP. É usado principalmente para garantir a sintaxe correta devido à sintaxe sensível a indentação do Python ; por exemplo, a sintaxe para a definição de uma classe requer um bloco indentado com a lógica da classe, que deve ser expressa como pass
quando deveria estar vazia.
Script de shell (bash, zsh, etc.)
O :
comando ' ' [dois pontos] é um shell embutido que tem efeito semelhante a um "NOP" (uma operação de não fazer nada). Não é tecnicamente um NOP, pois altera o parâmetro especial $? (status de saída do último comando) para 0. Pode ser considerado um sinônimo para o shell embutido 'verdadeiro', e seu status de saída é verdadeiro (0).
Linguagem de macro TeX (ConTeXt, LaTeX, etc.)
A macro linguagem do sistema tipográfico TeX possui o \relax
comando. Ele não faz nada por si só, mas pode ser usado para impedir que o comando imediatamente anterior analise quaisquer tokens subsequentes.
Comandos do protocolo NOP
Muitos protocolos de computador , como telnet , incluem um comando NOP que um cliente pode emitir para solicitar uma resposta do servidor sem solicitar nenhuma outra ação. Esse comando pode ser usado para garantir que a conexão ainda está ativa ou que o servidor está respondendo. Um comando NOOP faz parte dos seguintes protocolos ( esta é uma lista parcial ):
Observe que, ao contrário dos outros protocolos listados, o comando IMAP4 NOOP tem uma finalidade específica - permite que o servidor envie quaisquer notificações pendentes ao cliente.
Enquanto a maioria dos servidores telnet ou FTP respondem a um comando NOOP com "OK" ou "+ OK", alguns programadores adicionaram respostas peculiares ao cliente. Por exemplo, o ftpd
daemon do MINIX responde ao NOOP com a mensagem:
200 NOOP to you too!
Rachaduras
Os NOPs estão frequentemente envolvidos ao quebrar o software que verifica os números de série, requisitos específicos de hardware ou software, presença ou ausência de dongles de hardware , etc. Este processo é realizado alterando funções e sub - rotinas para contornar verificações de segurança e, em vez disso, simplesmente retornar o valor esperado que está sendo verificado para. Como a maioria das instruções da rotina de verificação de segurança não serão utilizadas, elas serão substituídas por NOPs, removendo assim a funcionalidade de segurança do software sem alterar o posicionamento de tudo o que segue no binário.
Explorações de segurança
O opcode NOP pode ser usado para formar um slide NOP , que permite que o código seja executado quando o valor exato do ponteiro de instrução for indeterminado (por exemplo, quando um estouro de buffer faz com que o endereço de retorno de uma função na pilha seja sobrescrito).
Veja também
- Arquitetura de computador
- HLT (instrução x86) - pausa a CPU
- Halt and Catch Fire - também pausa a CPU
- Função de identidade - a programação funcional equivalente ao NOP
- xyzzy (comando) - um comando às vezes usado em vez de NOP
- IEFBR14 - tautologia de mainframe
- Texto de preenchimento
- Comentário (programação de computador) - anotações geralmente para programadores que são ignoradas por compiladores e interpretadores