Como uma CPU 'sabe' o que comandos e instruções realmente significam?

73

Como um processador 'sabe' o que significam os diferentes comandos?

Estou pensando em comandos de nível de montagem como MOV, PUSH, CALL, etc ...

Simon Verbeke
fonte
Isso é muito informativo, mas o que estou procurando é o que permite que uma CPU receba e envie comandos?
Eu não entendo esse comentário. Uma CPU "recebe" instruções da memória, solicitando-as por endereço. Os únicos comandos que uma CPU "envia" (na visão simplista, pelo menos) são comandos para a memória para fornecer dados e comandos em barramentos de E / S para operar dispositivos de E / S.
Daniel R Hicks
No coração de qualquer CPU está uma lógica (literalmente) conectada para executar um procedimento simples: Pegue o valor do registro de endereço da instrução, envie-o para a memória, recupere a instrução que a memória retornar e, em seguida, conecte-a ninho complexo de lógica conectada que "entende" o que a instrução significa e como executá-la. Ah, e em algum lugar por aí aumente o registro do endereço da instrução.
Daniel R Hicks #
Os leitores podem estar interessados ​​na pergunta Como um computador funciona? sobre Ciência da Computação .
24513 Raphael

Respostas:

88

Quando um computador interpreta as instruções em nível de montagem , essas instruções são transformadas em seus equivalentes binários para a CPU ler. Quando a CPU executa as instruções, interpreta a parte do código de operação da instrução em "microprogramas" individuais, contendo seus equivalentes de microcódigo . Para que você saiba, uma instrução de montagem completa consiste em um código operacional e todos os dados aplicáveis ​​que o acompanham, se necessário (por exemplo, nomes de registradores, endereços de memória).

As instruções do microcódigo são de nível extremamente baixo (mais do que montagem) e controlam os sinais digitais reais que controlam o fluxo da lógica no microprocessador. Por exemplo, uma instrução de microcódigo pode atualizar um sinalizador de registro de código de condição com um novo valor ou conectar um registro de CPU a uma das unidades da ALU . Tarefas mais complexas são possíveis, mas isso mostra a ideia geral de para que microcódigo é usado.

O fluxo geral da compilação para a execução é o seguinte. As instruções de montagem são montadas (transformadas em seus equivalentes binários 0s e 1s, ou a partir de agora, sinais lógicos). Esses sinais lógicos são, por sua vez, interpretados pela CPU e transformados em mais sinais lógicos de baixo nível que direcionam o fluxo da CPU para executar a instrução específica. Isso pode levar um ou mais ciclos de clock, dependendo da arquitetura e design do processador (a maioria dos manuais de referência do processador informa quantos ciclos de clock são necessários para executar uma instrução específica, como esta, por exemplo ).

Tudo isso é feito com microcódigo programado (fisicamente incorporado ao processador em algum tipo de ROM , definido durante a fabricação), que direciona o fluxo através de portas lógicas reais de baixo nível . Isso fornece uma interface entre as instruções abstratas de montagem e a lógica elétrica física no processador.


Portanto, em resumo, as instruções do processador são montadas e carregadas pelo processador. O processador utilizará essas instruções para procurar o microprograma (na forma de microcódigo) correspondente a essa instrução específica, que é o que "realmente" executa a instrução. Após a execução dos microcódigos para a instrução específica (que pode levar um ou mais ciclos de clock), o processador executa o microcódigo para buscar a próxima instrução e o ciclo se repete.

Avanço
fonte
2
Ok, entendi, acho :) Então, os bits de comando alternam "interruptores" que farão o processador fazer certas coisas com os dados que recebe?
Simon Verbeke
4
@ Simon Verbeke, exatamente correto. Eles apenas alternam os interruptores para direcionar o fluxo de sinais elétricos no processador (que também pode direcioná-lo para recarregar mais comandos!). A analogia do switch é boa, pois tudo é digital (lógico 1/0 ou verdadeiro / falso). Só para você saber, o nível lógico é uma tensão real. Cabe ao engenheiro especificar o que é 0 ou 1 (por exemplo, uma lógica 1 pode ser especificada com mais de 2 volts).
Breakout
11
"Instruções equivalentes binárias", nas quais o compilador ou montador resume tudo, são chamadas de códigos de operação. Se você der uma olhada na estrutura do opcode de uma arquitetura RISC como MIPS ou ARM, poderá ver como vários bits no opcode são mapeados para operações específicas. A Intel, devido à sua longevidade e tendência a ser estendida uma e outra vez, não possui mais uma estrutura de mapeamento simples.
LawrenceC
3
Não, eu estava dizendo que, devido à longevidade e à extensão da arquitetura x86, o mapeamento de bits individuais em opcodes para micro-operações não é muito simples como no MIPS ou ARM até certo ponto (consulte d.umn.edu/~gshute/spimsal/talref.html , por exemplo, os opcodes da Intel não são nada assim). Eu não acho que houve muita noção de "RISC" quando a Intel lançou processadores x86, em 1978.
LawrenceC
5
Note-se que apenas algumas CPUs são microcodificadas. Alguns (principalmente dispositivos menores) operam diretamente fora dos códigos de montagem. Depende da arquitetura.
Fake Name
37

O processador realmente não 'sabe' quais são os comandos. Os comandos são apenas padrões binários que fazem com que o processador faça o que interpretamos como comandos.

Por exemplo, uma operação ADD-R1-em-R2 fará com que os valores dos registros 1 e 2 atinjam a ALU (unidade aritmética e lógica), faça com que a ALU use a saída do somador em vez de várias outras coisas e faça com que o saída da ULA para substituir o valor no registro 2. Existem circuitos lógicos simples para realizar todas essas coisas ( multiplexador , somador , contador , ...), embora processadores reais usem otimizações muito complicadas.

É como se você estivesse perguntando como um carro sabe desacelerar quando você pressiona os freios. O carro não sabe, o pedal do freio apenas controla indiretamente como as pastilhas duras são pressionadas contra as rodas.

Craig Gidney
fonte
5
Boa analogia com carros quebram o pedal.
Rjmunro 07/07
10

Pegue, por exemplo, a instrução que instrui um processador x86 / IA-32 a mover um valor imediato de 8 bits para um registro. O código binário para esta instrução é 10110 seguido por um identificador de 3 bits para o qual o registro deve ser usado. O identificador para o registro AL é 000, portanto, o código de máquina a seguir carrega o registro AL com os dados 01100001.

10110000 01100001

Esse código binário de computador pode ser mais legível por humanos, expressando-o em hexadecimal da seguinte maneira

B0 61

Aqui, B0 significa 'Mova uma cópia do seguinte valor para AL' e 61 é uma representação hexadecimal do valor 01100001, que é 97 em decimal. A linguagem assembly da Intel fornece o MOV mnemônico (uma abreviação de movimentação) para instruções como essa, para que o código de máquina acima possa ser escrito da seguinte maneira na linguagem assembly, com um comentário explicativo, se necessário, após o ponto e vírgula. Isso é muito mais fácil de ler e lembrar.

http://en.wikipedia.org/wiki/Assembler_language

Em outras palavras, quando você 'monta' seu programa de montagem, suas instruções como

MOV AL, 61h

são convertidos em números, aos quais a CPU associa um significado especial e, em seguida, age de acordo.

Nate
fonte
2
Também vale a pena notar que a atribuição do símbolo mnemônico "mov" a esse padrão de bits específico foi completamente arbitrária. Em princípio, eu poderia escrever um assembler que chamasse essa instrução de "oof" e funcionaria da mesma maneira, além de ser mais difícil de lembrar.
dmckee
6

Leitura sugerida:

Verifique também as notas do curso do CS152: Arquitetura e engenharia de computadores na UC Berkeley, um curso no qual os alunos implementam uma CPU.

Se você pesquisar no Google por "cpu caseiro", encontrará muitos brindes.

nibot
fonte
4

No nível mais extremo extremo, tudo o que a CPU pode fazer é adicionar. Além disso, pode subtrair, multiplicar e dividir (visto que são apenas adição de uma maneira diferente). A CPU usa isso para mover dados na memória, aplicando as adições aos endereços de memória.

Lembre-se, porém, de que este é o nível mais baixo possível. De fato, a CPU "entende" certos comandos, na forma de microcódigo. Veja a resposta da Breakthrough, está muito bem escrita.

n0pe
fonte
7
Operações lógicas como AND, OR e NOT, além de deslocamento de bits, são mais fundamentais do que adicionar. A adição pode realmente ser expressa em termos dessas operações. Na verdade, existem ICs discretos (a série Texas Instruments LS) que não fazem nada além de executar essas operações e é possível construir uma espécie de CPU a partir deles. Google "Pong esquemático" para ver como é feito um jogo, por exemplo, sem uma CPU.
LawrenceC
Eu quis dizer de um ponto de vista mais de software :) Sim hardware / lógica você tem uma quantidade insana de portas NAND e NOR. Bom ponto.
n0pe
2

Eu dei uma resposta relacionada em programmers.stackexchange.com, consulte Como os computadores funcionam? onde analisei brevemente tudo, desde o início, sobre como os computadores interpretam instruções para mover elétrons.

Lie Ryan
fonte