EnzoFerber
(usa FreeBSD)
Enviado em 22/02/2016 - 19:23h
Olá.
É difícil dizer quais instruções são parte do hardware e quais do software. Em um nível tão baixo é escolha do fabricante como implementar. Mas para a função ADD, provavelmente ela é no nível de hardware, já a instrução de multiplicação provavelmente é em nível de microprograma (já que podemos multiplicar n*m em log(m) clocks ;) Dá uma olhada nos Adders:
https://en.wikipedia.org/wiki/Adder_(electronics)
Primeiro, sua pergunta:
Onde é a barreira entre microintruções e microprogramas?
Os microprogramas são compostos por microinstruções.
https://en.wikipedia.org/wiki/Microcode
É complicado te dar um código de microprograma, já que estão dentro dos processadores. Você pode tentar procurar por isso na internet. Mas já as instruções que ele executa, são os números que você consegue em um dumper.
$ gcc -c main.c
$ objdump -d main.o
...
Vai ver as instruções em números.
*
Algumas coisas a ter em mente:
1. Assembly é a
linguagem composta por mneumônicos que representam instruções de máquina.
2. Assembler é o
programa que traduz os mneumônicos inteligíveis para códigos de máquina (instruções).
3. Os processadores normalmente tem um "interpretador" chamado de micro-programa, que interpreta as micro-instruções (os números traduzidos pelo assembler).
*
No Organização Estruturada de Computadores:
Página 3, figura 1.1. Máquina Multinível.
Aqui, o nível 0 é o hardware em si (portas lógicas executando pulsos elétricos).
O nível 1 é o micro-programa que executa a ISA - a ISA é a forma na qual estão organizadas as portas lógicas, os multiplexadores, etc. Não vá fundo nessa parte até ter uma boa base conceitual de como a pilha funciona, senão vai pirar e sua curva de aprendizado será muito ruim.
Aconselho a ler o livro do Tanenbaum de forma sequencial. Ele tem uma ótima forma de explicar e exemplificar as coisas, tem um humor bem interessante e te passa as abstrações conceituais necessárias para você entender o próximo nível. Tenta não ir com muita pressa, o assunto é complexo.
Dito isto, você poderá ler mais sobre o L1 (microcódigo ou microprograma) na página 190, início do capítulo 4 - O nível de microarquitetura.
Entender os computadores em nível tão baixo pode ser uma tarefa árdua e LONGA, portando, recomendo "pular" entre os diversos níveis de abstrações para tentar entender como as coisas são. O que quero dizer é para sempre procurar entender a abstração CONCEITUAL de um nível
acima ao nível o qual você esta estudando a IMPLEMENTAÇÃO.
(Pra cima diminui a complexidade, pra baixo aumenta)
Existe um tópico extremamente interessante que serve como "linhas gerais", e vai ajudar bastante:
http://programmers.stackexchange.com/questions/81624/how-do-computers-work/81715#81715
Leia. Leia duas vezes. Vale a pena.
*
Eu gostei bastante de tentar implementar uma máquina de nível zero em C. Desenvolvi um pequeno conjunto de instruções (umas 40) que conseguiam realizar loads/stores, add, sub, double, half, etc. Desenvolvi então, em cima disso, um pequeno microprograma.
É bem interessante. O código final nunca é bom o suficiente e estou sempre brincando com ele, refazendo algumas partes ou completamente. O que vale a pena nesse processo é
escrever o código - não procure códigos feitos, implemente o SEU. Os insights que terá serão impagáveis.
Depois de um tempo, você terá uma máquina com umas 100 instruções e poderá VER programas sendo carregados na memória e sendo executados. É muito legal. Muito. Sério.
*
Structure and Interpretation of Computer Programs
Sobre a multiplicação em log(m), vale a pena ser lido:
https://mitpress.mit.edu/sicp/
Ah, sobre o SICP (o livro acima): Se você for ler só um livro sobre programação, leia este. De quebra, vai aprender Scheme (um dialeto de LISP). E vai ficar fera em recursividade.
*
Além disso, dá uma olhada no processo de fazer bootstrap para um compilador, vai te dar uns insights legais também. Esse aqui é bem legal:
http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html
O primeiro arquivo que ele utiliza é totalmente escrito em instruções de máquina (em números hexadecimais) - isso significa que você pode carregar o programa diretamente na memória e ele será executado pelo processador ;)
Coisa bacana!
*
Acho que exagerei um pouco, mas costumo me empolgar com baixo-nível.
Qualquer dúvida posta denovo, será um prazer ajudar.
[]'s
Enzo Ferber
$ indent -kr -i8 src.c
"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right." - linux/Documentation/CodingStyle - TORVALDS, Linus.