Como um processador 'sabe' o que significam os diferentes comandos?
Estou pensando em comandos de nível de montagem como MOV, PUSH, CALL, etc ...
Como um processador 'sabe' o que significam os diferentes comandos?
Estou pensando em comandos de nível de montagem como MOV, PUSH, CALL, etc ...
Respostas:
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.
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.
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.
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.
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.
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.