# Código de operação

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.

## O que o Processador/Microcontrolador pode fazer?

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 ($\pi =3,1415926...$) 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.

## Tabela com Opcode para x86

Processador Intel/AMD/Outro plataforma x86 (com nomes indiretos da programação em Assembly):

### Área do Processador

    Aritmético (co-processador).

### Bitwise/Logical

    Unidade Lógica ou ULA

### System
## Formação do Opcode

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:
    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".

## Observações Finais

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.

## Fonte do Artigo

* Harvard College (Faculdade de Harvard, Massachusets): http://www.fas.harvard.edu/~cs50/podcasts/2007/lectures/week8.pdf