image

Access unlimited bootcamps and 650+ courses

50
%OFF
Article image
Fernando Araujo
Fernando Araujo22/11/2024 11:28
Share

<Direto ao Ponto 62> O microprocessador

  • #Informática Básica

Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )

 

Olá, dev!

 

Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Ele vai tratar do microprocessador, coração e cérebro dos computadores e equipamentos eletrônicos modernos.

 

Sumário

1.   Introdução

2.  Os primeiros microprocessadores

3.  O funcionamento de um microprocessador de 8 bits

4.  Programando o 8085

5.  Considerações finais

6.  Referências

 

1 – Introdução

 

Eu criei a série de artigos DIRETO AO PONTO com o objetivo de apresentar, de forma simples e direta, conhecimentos básicos da programação e de computação, principalmente, para os iniciantes.

 

Aqui, são tratados temas como lógica de programação, linguagens, hardware dos computadores, história da computação e assuntos relacionados à plataforma da DIO, como a escrita de artigos e os desafios de código.

 

Neste artigo, eu vou falar dos microprocessadores, parte essencial e fundamental dos computadores e equipamentos eletrônicos modernos.

 

Durante o meu curso de engenharia Elétrica, de 1980-1986, eu tive a oportunidade de ser monitor da disciplina de “Microprocessadores” por vários semestres e pude vivenciar (e aprender muito!!) a estrutura dos microprocessadores que surgiram na época.

 

Os primeiros processadores que tive contato foram os primeiros de 8 bits da história (8080, 8085, 6800 e Z80).

 

Como eles tinham uma estrutura simplificada, foi possível entender a fundo seus circuitos e funcionamento, inclusive na prática, nos laboratórios da universidade.

 

Depois disso, eu ainda usei o 8085 durante o meu estágio de final de curso, no INPE, em São José dos Campos.

 

 

2 – Os primeiros microprocessadores

 

O microprocessador surgiu após algumas revoluções na área de computação eletrônica.

 

O primeiro microprocessador comercial foi o 4004, , lançado pela Intel em 1971, mas suas aplicações iniciais do 4004 eram calculadoras e dispositivos de controle. Ele tinha 4 bits no barramento de dados, operava a uma velocidade de 740 kHz e conseguia executar cerca de 92.000 instruções por segundo.

 

O 4004 não fez tanto sucesso assim, mas seus sucessores, sim!

 

Os próximos microprocessadores da história foram os de 8 bits, criados por várias empresas. Como exemplo deles, vou descrever rapidamente como era o 8085, que eu conheço a fundo, como já citei no início.

 

Intel 8085 – Lançado em 1976, ele era uma versão aprimorada do INTEL 8080, com circuitos internos mais eficientes. O 8085 incorporava os controladores de clock e de barramento, simplificando o design do sistema e manteve a compatibilidade com o conjunto de instruções do 8080.

 

Suas aplicações principais incluem sistemas embarcados, controles industriais e microcomputadores, mas também é utilizado em dispositivos de controle e robótica.

 

 

3 - Funcionamento de um microprocessador de 8 bits

 

image

 

Como eu já estudei e trabalhei muito, na década de 80, com o microprocessador 8085, escolhi este para descrever o funcionamento de um microprocessador de uso geral. Sua simplicidade é uma escolha ideal para uma explicação didática. 

 

Os processadores modernos são muito mais complexos e eficientes que ele, mas o princípio básico é o mesmo: buscar instruções armazenadas na memória, decodificá-las e executá-las, a partir dos dados informados nas instruções.

 

A figura a seguir mostra a estrutura interna do 8085.

 

image


Seu funcionamento interno pode ser descrito em termos de suas principais unidades e como elas se interconectam para executar instruções. Aqui está uma visão geral da estrutura interna do Intel 8085, com suas características técnicas:

 

I - ARQUITETURA GERAL - Microprocessador de 8 bits, podendo processar dados em pacotes de 8 bits por vez. É baseado na arquitetura de von Neumann, em que instruções e dados compartilham o mesmo barramento de endereços e dados. Sua pastilha possui 40 pinos (8 de dados, 16 de endereços, 6 de interrupções, 2 de alimentação, 2 de entrada/saída serial e o resto de controles diversos);

 

Barramento de Dados: 8 bits (transporta dados para e do processador).

Barramento de Endereços: 16 bits (permite acessar até 64 KB de memória).

Barramento de Controle: Lida com sinais de controle para sincronizar operações, como leitura e escrita de memória.

 

 

II - PRINCIPAIS COMPONENTES INTERNOS – Estes componentes permitem a execução de instruções:

 

Unidade de Controle (UC) - Responsável por coordenar todas as operações dentro do processador, decodificando as instruções armazenadas na memória e gerando os sinais de controle necessários para ativar as outras partes dele;

 

 

Unidade Lógica e Aritmética (ULA) – Local onde as operações lógicas e aritméticas são realizadas (AND, OR, XOR, adição, subtração, incremento e decremento), sendo capaz de realizar operações com números de 8 bits;

 

Flags - Após a execução de uma operação, a ULA define os valores dos flags (indicadores) no registrador de status. São flip-flops (registradores de 1 bit), que podem ser setados (ativados pelo valor binário 1) ou ressetados (valor zero), dependendo do resultado de algumas operações:

Zero (Z): Indica se o resultado da operação foi zero;

Carry (CY): Indica se houve um vai-um (carry) ou emprestado (borrow) em operações de adição/subtração;

Sign (S): Indica se o resultado foi positivo ou negativo;

Parity (P): A paridade indica se o número de bits de valor 1 no resultado é par ou ímpar;

”Auxiliary Carry” (AC): Usado para operações de aritmética BCD.

 

 

Registradores - São circuitos de armazenamento temporário interno, enquanto o processador executa as instruções;

 

·        Acumulador (A): Registrador principal de 8 bits, onde os resultados das operações aritméticas e lógicas são armazenados;

 

·        Registradores Gerais (B, C, D, E, H, L): São pares de registradores de 8 bits, usados para armazenar dados temporários, podendo ser combinados para formar registradores de 16 bits (BC, DE, HL);

 

·        “Program Counter” (PC): Registrador de 16 bits que armazena o endereço da próxima instrução a ser executada;

 

·        “Stack Pointer” (SP): Registrador de 16 bits que aponta para o topo da pilha de memória, usado em chamadas de sub-rotinas e interrupções.

 

 

Memória e barramentos – Meio físico de comunicação do processador com a memória e dispositivos periféricos. Os dados presentes em um barramento (bus) podem ser lidos (operação de leitura – Read, RD) ou gravados (operação de escrita – Write, WR). Os barramentos são:

 

·        Barramento de Endereços: Barramento de 16 bits que pode endereçar até 64 KB de memória;

 

·        Barramento de Dados: Barramento de 8 bits usado para transferir dados de/para a memória ou dispositivos de Entrada/Saída - E/S (Input/Output – I/O);

 

·        Barramento de Controle: Inclui sinais para indicar leitura da memória (RD), escrita na memória (WR), distinção entre memória e E/S (IO/M), além de outros sinais de controle;

 

 

III - INTERRUPÇÕES:

O 8085 tem um sistema de interrupções que permite que ele pare temporariamente o que está fazendo para atender a eventos externos urgentes, como a entrada de dados de um dispositivo.

 

Tipos de interrupções: Inclui interrupções vetorizadas (RST 7.5, RST 6.5, RST 5.5) e não-vetorizadas (como INTR).

 

 

IV - FONTE DE ALIMENTAÇÃO: Requer apenas 5V (melhoria em relação ao 8080);

 

Como já foi dito, o objetivo de um processador é realizar operações a partir das instruções armazenadas na memória. Ele segue um ciclo repetitivo que consiste em:

·        buscar instruções armazenadas na memória;

·        decodificar a instrução buscada;

·        executar a instrução decodificada, a partir dos dados informados nela.

 

 

Vamos ver como se dá este processo:

 

Ciclo de Busca e Execução - O ciclo básico de operação envolve buscar uma instrução da memória, decodificá-la e executá-la. A Unidade de Controle coordena essa sequência.

 

V - CICLO DE INSTRUÇÃO - O funcionamento básico de um microprocessador é dividido em ciclos de máquina, que, por sua vez, formam um ciclo de instrução. O 8085 executa cada instrução seguindo estas etapas:

 

Busca da Instrução:

·        O ”Program Counter “ (PC) contém o endereço da próxima instrução;

·        O 8085 coloca o valor do PC no Barramento de Endereços

·        Ele envia o sinal de controle RD para a memória, instruindo-a a colocar a instrução correspondente no Barramento de Dados;

·        A instrução é então transferida para o Registrador de Instrução (“Instruction Register” - IR).

 

Decodificação da Instrução:

·        A Unidade de Controle decodifica a instrução armazenada no IR;

·        Com base nessa decodificação, a Unidade de Controle gera sinais apropriados para ativar as unidades necessárias (como a ULA ou os registradores) e define o que será feito em seguida.

 

Execução da Instrução:

·        Dependendo da instrução, uma operação aritmética ou lógica pode ser realizada na ULA (por exemplo, adicionar dois valores), ou ainda uma operação de movimentação de dados (por exemplo, carregar um valor da memória para um registrador);

·        O resultado é armazenado no Acumulador ou em outro registrador, e os flags são atualizados conforme o resultado da operação.

 

E o ciclo continua com a próxima instrução.

 

É importante reforçar que cada passo na execução deste processo do ciclo de instruções de um processador é ativado a cada pulso do clock do sistema. Abaixo, segue uma figura do clock de um sistema computacional.

 

image



VI - As instruções

 

Uma instrução de um microprocessador é composta por um código da operação (Opcode) e os operandos. O Opcode especifica a tarefa que será realizada e o operando (ou operandos) é o dado que será usado na execução da tarefa.

 

Para o 8085, o operando pode ser um dado de 8 ou 16 bits, um endereço de 16 bits, um registrador interno ou uma posição de memória.

 

Uma instrução pode ter o tamanho de 1 a 3 bytes, representada por código de máquina, em binário.

 

Instrução de 1 byte - Veja os exemplos a seguir:

·        MOV A, B - Move (armazena) o conteúdo do registrador B para o registrador A;

·        ADD B – Soma o conteúdo do registrador B ao conteúdo do Acumulador (A) e armazene o resultado no Acumulador;

 

Instrução de 2 bytes - Veja o exemplo abaixo, em linguagem Assembly do 8085:

·        MVI B, 05 - Move o valor hexadecimal 05 para o registrador B;

·        06, 05 – Representação em código hexadecimal da instrução acima.

 

Instrução de 1 byte - Veja os exemplos a seguir:

·        LXI H, 2400H – Carregue (Load) o par de registradores H-L com o valor hexadecimal 2400H;

 

 

O 8085 oferece várias formas de obter dados para realizar as operações indicadas nas instruções. São os modos de endereçamento.

 

Modos de Endereçamento – O 8085 suporta diferentes modos de endereçamento, que determinam como os operandos de uma instrução são localizados:

Imediato: O operando está diretamente na instrução. Exemplos:

·        LXI H, 2500H: 2500 é um dado de 16-bits, informado na própria instrução, que deve ser carregado no par de registradores H-L.

 

Direto: A instrução especifica o endereço de memória onde o operando está localizado. Exemplo:

·        STA 2400H: Armazena o conteúdo do Acumulador (A) na posição de memória 2400H.

 

Registrador: O operando está em um registrador. Exemplo:

·        MOV A, B: Mova o conteúdo do registrador B para o registrador A (Acumulador)

 

Registrador Indireto: O endereço do operando está em um par de registradores (como HL).

  • LXI H, 2500H – Carregue o par de registradores H-L com o valor 2500H.
  • MOV A, M – Mova o conteúdo da posição de memória (operando) apontada por H-L, para o Acumulador.

 

OBS: Neste caso, o operando está na memória. O endereço desta posição de memória não é dado na instrução, mas é armazenado no par de registradores H-L. A instrução MOV A,M pega este operando na posição de memória armazenada em H-L.

 

Implícito: O operando está implícito na própria instrução (ex.: "CMA" complementa o conteúdo do acumulador).

·        CMA (“Complement the accumulator“) – Complementa o conteúdo do acumulador (A);

·        HLT (Halt) – Para a execução do programa;

·        NOP (“No operation”) – não executa nada, apenas gasta tempo de um ciclo de busca;

·        RLC (“Rotate accumulator left”) – rotacione o conteúdo do Acumulador (A) à esquerda;

·        RAR (Rotate accumulator right through carry”) – rotacione o conteúdo do Acumulador (A) à direita, usando o vai-um (Carry).

 

  

4 - Programando o 8085

 

O 8085 oferece diversas instruções para escrever programas que executam na sua estrutura interna. Veja alguns exemplos de programas básicos codificados em Assembly do 8085:

 

a) Armazenar um dado de 8 bits na memória, usando endereçamento direto:

 

MVI A, 49H ; Armazene o valor hexadecimal 49H no Acumulador  (A) ;
STA 2501H ; Copie o conteúdo do Acumulador para o endereço de memória 2501H ;  
HLT ; Pare a execução.  

 

 

b) Armazenar um dado de 8 bits na memória, usando endereçamento indireto:

 

LXI H ; Carregue o par de registradores H-L com 2501H ;  
MVI M ; Armazene 49H na posição de memória apontada por H-L ;
HLT ; Pare a execução  

 

 

c) Somar 2 números de 8 bits:

 

LXI H, 2501H ; Carregue o endereço do primeiro número no par d e registradores H-L ;
MOV A, M ; Mova o primeiro operando para o acumulador ;  
INX H ; Incremente o conteúdo de H-L para apontar para a próxima posição de memória ;  
ADD M ; Some o segundo operando ao primeiro (que está em A) ; 
INX H ; Incremente H-L para apontar para a próxima posição de memória ;
MOV M, A ; Armazene o resultado (que está em A) na posição de memória  apontada por H-L ;
HLT ; Pare a execução  

 

 

d) Encontrar o maior de 2 números:

 

LXI H, 2501H ; Carregue o endereço do primeiro número em H-L ;
MOV A, M ; Mova o primeiro número para o Acumulador ;
INX H ; Incremente H-L para a próxima posição de memória ;  
CMP M ; Compare o segundo número (que está na memória) com o primeiro (que está em A) ;
JNC AHEAD ; Não, o maior está em A, vá para o rótulo AHEAD ;
MOV A, M ; Sim, o maior está na memória, carregue o segundo número nem A ;
STA 2503H ; Armazene o maior número na posição de memória indicada
HLT ; Pare a execução

 

OBS: a instrução CMP (“Compare memory with accumulator“) subtrai o valor em memória do conteúdo do Acumulador ([A] – [M]) e gera um flag CY = 1 se o resultado for negativo. A instrução JNC (“Jump if there is no carry”) realiza um desvio se não houver carry (CY = 0) na operação, ou seja, se o resultado for positivo.

 

O Intel 8085 foi um microprocessador simples, mas eficaz para seu tempo, e seu design serviu de base para muitas arquiteturas futuras.

 

 

5 – Considerações finais

 

Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Desta vez, foi apresentado o microprocessador, cérebro dos computadores.

 

O objetivo deste artigo era apresentar a estrutura interna de um microprocessador e o seu funcionamento.

 

Como os processadores atuais são muito, muito, muito complexos, eu escolhi um dos mais simples, porém muito popular na sua época, para detalhar estes processos.

 

Didaticamente, é muito mais fácil entender os conceitos que envolvem o funcionamento de um microprocessador simples do que tentar extrair abstrações dos complexos processadores modernos.

 

Como eu já estudei a fundo e utilizei na prática o processador 8085, da Intel, na década de 80, essa escolha ficou fácil.

 

Foram apresentadas as características técnicas básicas deste microprocessador, separadas por unidades lógicas.

 

Depois, foi descrito o processo de execução de instruções oferecidas pelo 8085, inclusive com exemplos de instruções e de programas simples codificados com a linguagem Assembly oferecida por ele.

 

Finalmente, podemos resumir um microprocessador como um conjunto de circuitos eletrônicos digitais (registradores, flip-flops e memórias) que realizam operações básicas aritméticas (somas e subtrações) e lógicas (AND e OR), a partir da leitura, decodificação e execução de poucas instruções limitadas.

 

É surpreendente que tamanha simplicidade possa fazer um componente realizar tantas tarefas complexas atualmente, quando funciona como o cérebro de um computador.

 

Os microprocessadores evoluíram muito depois destes primeiros de 8 bits. A história desta evolução é assunto para o próximo artigo.

 

 

6 – Referências

 

image


Praticamente todo o conteúdo deste artigo foi tirado do que eu aprendi (e me lembro) sobre o assunto desde o início da minha carreira como programador, desde os anos 80 até agora.

 

Eu estudei sobre este processador pelo livro de Lance Leventhal (8080A/8085), que ilustra a capa deste artigo. Ele também escreveu livros sobre estes outros microprocessadores da época (8080, Z80, 8086 e 6800), infelizmente me desfiz de todos com o tempo. Por isso não o listei aqui como referência, pois ele foi consultado na década de 80.

 

Para os códigos em Assembly do 8085, eu pesquisei no ChatGPT.

 

Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )

Share
Comments (4)
Fernando Araujo
Fernando Araujo - 26/11/2024 16:30

Opa, Afonso!

Eu tenho Pluto TV instalado, vou procurar ver.

Obrigado por compartilhar!!

Afonso Simão
Afonso Simão - 26/11/2024 12:02

lendo esse artigo me lembrou de uma serie que vi, quando se tenta fazer uma ER em um processador.


HALT AND CATCH FIRE, tem na pluto.tv de graça, muito interessante o conhecimento.


Fernando Araujo
Fernando Araujo - 23/11/2024 04:48

Obrigado, Ronaldo!

Eu escolhi escrever artigos como forma de ajudar a comunidade, principalmnte os iniciantes na programação.

Não sei se estou concorrendo em alguma categoria no DIO Awards, ou se vai depender das votações iniciais para ser indicado entre os primeiros.

No ano passado, eu fui indicado.

De qualquer forma, agradeço pela confiança e vamos ver no que dá esse ano.

Ronaldo Schmidt
Ronaldo Schmidt - 22/11/2024 22:14

Olá amigo.

Não sei se está concorrendo ao DIO Awards mas mesmo assim lhe indiquei em duas categorias.

Venho acompanhando seu trabalho a algum tempo e seus artigos são uma parte importante nesta comunidade.

Boa sorte!