Em informática, um código de operação (ou Opcode) é a referência à instrução que um determinado processador possui para conseguir realizar determinadas tarefas.
Suas especificações e formatos são definidos no conjunto de instruções da arquitetura do processador em questão (que pode ser um processador geral ou uma unidade de tratamento mais especializado).
Algumas ISAs (normas) tem instruções que definem campos para opcodes e operandos, enquanto outras (e.g. a arquitetura Intel x86) tem uma das mais complicadas integradas estruturas.
Apenas instruções pré-informadas que são os Opcodes. O que não é um Opcode, é um código que não é possível efetuar a identificação pelo processador ou pelo sistema. De entre as funções principais do processador:
- Lógico
- Instruções de condição e tomada de decisão. Representam em média, 14% à 20% de todos os programas para plataformas com arquitetura x86 para desktops. Devido à tomada de decisão ser algo "comum" em todos os programas, o Pentium D foi um dos processadores que a Intel mais teve prejuízos em desempenho. O Pentium D conta com mais de 20 estágios de pipeline (muito mais que processadores da linha anterior, para conseguir resolver mais instruções em apenas 1 passagem), porém, as instruções ficam esperando uma tomada de decisão para poderem passar pelo controle de Branch e serem processadas.
- Um exemplo de uma instrução de decisão em nosso cotidiano, é: "Ou você estuda ou você faz outra coisa." Se você estuda, é um caso, se é outra coisa, é outro caso. Você tem atividades diferentes para cada caso. O processador, e os programas, também.
- Aritmético
- O lugar onde o processador realiza as contas de soma, diferença, multiplicação e inversão. O processador não sabe fazer mais nada além destas 4 funções.
- Load Constant
- Carrega variáveis constantes na memória, ou seja, são variáveis do tipo read-only (somente leitura), e nunca terão seus valores alterados, até desligar o computador ou até finalizar o programa. Como exemplo, a constante matemática Pi (
) possui um valor fixo que não pode ser alterado.
- Load and Store
- Carrega em memória, um volume com informações das variáveis, onde possuem dados que estão sendo manipulados ou não (read-only - somente leitura).
- Branch
- Formulado inicialmente pela Intel, o controle de Branch é um sistema que determina antes de realizar as operações, resultados com base de instruções pré-gravadas com resultados das instruções enviadas ao processador. No caso, o Opcode enviado. As instruções de Branch são as responsáveis por tratar das informações que estão sendo processadas, ou que serão processadas, ou que já foram processadas (que passam pelo pipeline).
- Sistema
- O processador mantêm um controle sobre o sistema, ao ponto de criar e dimensionar suporte para ACPI (funções como desligar ou ligar o computador) ou AHCI (placas controladoras SATA identificadas como IDE ao sistema operacional), e outras funções similares como agendar um Wake Event.
Processador Intel/AMD/Outro plataforma x86 (com nomes indiretos da programação em Assembly):
- Área do Processador
- Aritmético (co-processador).
add dst,src1,src2
sub dst,src1,src2
mul dst,src1,src2
inc dst,const8
- Load constant
lc dst,const8
- Bitwise/Logical
- Unidade Lógica ou ULA
and dst,src1,src2
nor dst,src1,src2
shf dst,src1,src2
- Load and store
ld1 dst,base,uconst4
st1 src,base,uconst4
- Branch
beq tgt,src1,src2
bgt tgt,src1,src2
jmp uconst8
- System
hlt
in dst,channel
out src,channel
Basicamente forma-se na cadeia do Assembly, já que é muito difícil humanamente entendermos códigos de máquina. Vejamos:
- Um número que começa com "0x" em linguagem C trata-se de um número hexadecimal. Trataremos dele por ser mais compacto do que o binário (e seria até meio que sem lógica colocar um monte de zeros e uns aqui para explicar).
- O código de máquina com o número: 0x83EF.
- O número "8", significa o Opcode utilizado na elaboração da instrução.
- O número "3", significa o valor da primeira variável do código Assembly.
- O número "E", significa o valor da segunda variável do código Assembly.
- O número "F", significa o valor da terceira variável do código Assembly.
- Um exemplo de soma em Assembly:
add r3, r14, r15
- O "r3", "r14" e "r15" referem-se à um espaço armazenado na memória, sendo que "r3" será a resposta da soma. Imaginando que, utilizando o opcode "ld" para carregar na memória um número "5" para "r14" e um número "1" para "r15", o resultado de "r3" seria exatamente o resultado da soma, que é "6".
A Linguagem de maquina é tediosa e difícil para seres humanos programarem nela diretamente, então se a abstração conseguida por uma linguagem de programação de alto-nível não é desejada, uma linguagem assembly é usada. Aqui, instruções mnemônicas são usadas que correspondem ao opcode e as especificações do operando da instrução em linguagem de máquina gerada. Ela dá um grande nível de legibilidade e compressibilidade que trabalhando com as operações em linguagem de máquina diretamente, enquanto continua dando controle apurado da linguagem de máquina gerada. Um programa chamado assembler transforma a linguagem assembly em código de máquina.