sexta-feira, 26 de novembro de 2010

Características dos microprocessadores 8080 e 8085


Boa Tarde leitores do blog. Acima vemos os dois chips, 8080 e o 8085. Hoje vamos falar sobre o microprocessador 8080 e 8085, que conforme num artigo anterior é composto por uma arquitetura da seguinte forma:

Ciclo de Instruções
Vamos entender melhor o que significa isso. Como um computador é algo que possui funções, tarefas e coisas a fazer, ele precisa de um sinal de relógio para sincronizar as suas operações, assim como nós mesmos precisamos sincronizar as nossas. Esse relógio é chamado de clock, e ele é gerado por um oscilador eletrônico que fornece uma sequência ininterrupta de pulsos com períodos constantes. A isso chamamos, de frequência. Portanto, quando falamos que um computador possui tanto de Hertz(Hz), estamos falando da velocidade que ele processa ou sincroniza algo. Por exemplo, o clock do microprocessador 8080 é um sinal resultante da combinação de dois sinais de fases diferentes provenientes do gerador de clock 8224, exemplo:

A cada intervalo de tempo T, que corresponde a um período do sinal de clock, dá-se o nome de estado.O estado é a unidade básica de tempo do microprocessador.
Cada instrução demora um número inteiro de estado para a sua completa execução. Algumas instruções podem ter 4 estados, isto é, demoram 4 períodos do sinal de clock, outras podem chegar a ter 18 estados.
Conhecendo-se o número de estados das instruções de um programa, pode-se determinar o tempo gasto para a sua execução, multiplicando-se o total de número de estados pelo período do sinal de clock. Por exemplo: O tempo gasto para processar uma instrução de 7 estados no microprocessador 8085 com um cristal que fornece um sinal externo do oscilador de 6,144 MHz é de , 2,28 microsegundos, pois a frequência do sinal de clock é de 3,072 MHz e o período, que corresponde ao estado, é de 325,52 ns(nano segundos). Assim, deve-se levar isso em consideração, quando programamos um microprocessador com periféricos, pois podem ficar em estado de espera até que os dados sejam estabilizados.
Formato das Instruções
As instruções são todas em código de máquina, binário. São um conjuntos de bits que são codificados pelo microprocessador fazendo com que este execute uma operação bem definida. A quantidade de bist pode variar de uma instrução para outra. No caso dos microprocessadores 8080 e 8085 existem 3 tamanhos de instruções:
- intrução de 1 byte ou 8 bits.
- instrução de 2 bytes ou 16 bits.
- instrução de 3 bytes ou 24 bits.
Como memórias utilizadas em sistemas com o microprocessador 808 e 8085 são de 8 bits ou 1 byte, cada conjunto de 1 byte é armazenado em um endereço de memória. As instruções de mais de um byte devem ser armazenadas em posições consecutivas de endereços da memória. As instruções de maneira geral, são formadas por dois campos distintos:
- código de operação
- operando
Código de operação é constituído por 8 bits e é sempre o primeiro byte da instrução; Os demais formam o operando da instrução e podem conter ou dado ou endereço. Nem todas as instruções possuem operando como no caso da instrução "EI", cuja função é habilitar o sistema a receber interrupções.
Código de Operação
É o campo da instrução que especifica qual é a tarefa que deve ser realizada pela unidade central de processamento quando a instrução é processada. Sabe quando você assiste o filme Matrix e vê aqueles números assutadores correndo? É isso. O computador só entende números binários, um conjunto de zero e uns, que no caso do microprocessador 8080 e 8085 possuem 78 instruções básicas. No começo da computação, na época em que se marcavam cartões, o programador era responsável por inserir o código em formato numeral, mas eram poucas isntruções. Na verdade, muito muito no começo, o computador foi criado para fazer cálculos, e por isso deveria ter apenas 4 operações básicas. Só mais tarde, o computador foi tomando proporções maiores, e assim, surgiu como portador e gerenciador de informações. Hoje o repertório é imenso. Mas então, como são dadas essas instruções? Simples. Temos uma coisa chamada "mnemônico", que é um símbolo ou código de compreensão humana, que traduz ao computador, o código em forma binária, que ela possa entender. Exemplos:
JMP = é saltar..porque vem do inglês jump.
MOV B,A = é mover o conteúdo do registrador B para o registrador A, em hexadecimal é 47, que em binário é 1000111. Então, ao invés de memorizar 1000111 para codificar seu programa, basta escrever o mnemônico, e tudo estará certo. Isso facilita a linguagem humana do programa.
Operando
É o que se usa com as instruções, vem após o código de operação. No exemplo acima, o B,A são operando da instrução MOV. Podem ser:
-endereço;
-registrador;
-par de registradores;
-dado imediato;
Endereço
Pode ser uma informação de 16 bits correspondendo à uma posição na memória, ou uma informação de 8 bits correspondendo ao endereço de uma porta de entrada ou saída, de um contador ou outro circuito periférico qualquer do sistema.
Registrador
O registrador usado como operando das instruções podem ser:
A acumulador
B registro
C registro
D registro
E registro
F registro
H registro
L registro
Par de Registradores
São para registradores usados como 16 bits:
B = formados pelos registradores B e C;
D = formados pelos registradores D e E;
H = formados pelos registradores H e L;
PSW = formados pelos registradores A e Flags;
SP = ponteiro de pilha;
Registro de Flags
Os bits 1, 3 e 5 não são utilizados. Eles têm o valor indicado acima no microprocessador 8080 e valor indefinido no microprocessador 8085. Servem para fazer verificações, exemplo:
- O flag C( bit 0): Bit de transporte. Terá valor 1 se ocorre transporte(vai um), ou um empréstimo se ocorrer uma operação aritmética. É usado em outras operações não aritméicas.
- O flag P( bit 2): Bit de paridade. Terá valor 1 se ocorrer paridade, ou seja, um número par de 1s.
- O flag AC( bit 4): Bit de transporte auxiliar(auxiliary carry). Terá valor 1 se ocorrer um transporte(e-vai-um) do bit 3 para o bit 4, numa operação aritmética.O bit A é usado para operações aritméticas decimais.
- O flag Z( bit 6): Bit zero. Terá valor 1, se o resultado de uma instrução de operação for zero. Caso contrário é posta em reset(0).
- O flag S( bit 7): Bit de sinal. Terá valor 1, se o resultado d euma instrução de operação tiver o bit mais significativo a 1.Se não zerá reset(0).
MODOS DE ENDEREÇAMENTOS
-Dado Imediato
É uma infromação de 8 ou 16 bits, e é o próprio dado que será utilizado pela instrução. Assim como o mnemônico possui símbolos ao invés de 8 ou 16 bits que o forma. O operando pode ser especificado das seguintes maneiras:
1- Letra identificadora do registrador
2- Dado no sistema de numeração hezadecimal, decimal, octal ou binário
3- Constante no código ASCII
4- Label ou rótulo
5- Contador de licalização
6- Expressão
O 8085 possui instruções de endereçamento imediato para 1 byte e 2 bytes. No primeiro caso, é necessária uma instrução de 2-bytes; o byte adicional contem o dado a ser usado. Se for necessário um dado de 16 bits, torna-se necessária uma instrução de 3-bytes, já que são necessários dois bytes para guardar o dado. O endereçamento imediato é usado para introduzir constantes nos cálculos. Os operandos imediatos de dezasseis bits podem ser endereços de memória para carregar no par de registos H, a serem utilizados no endereçamento por par de registos.
Por exemplo, um dado imediato de 1 byte:

Exemplo de dado imediato de 2 bytes:

Quando o operando da instrução é um dado, as seguintes regras deem ser seguidas para identificar o sistema de numeração usado:
hexadecimal= deve iniciar com um dígito numérico(0 a 9) e deve ser acrescentado ao final do número a letra H.
Exemplo:
MVI A, 27H
CALL 1000H
CPI 0A2H
JUMP 0E22AH
decimal= deve ser acrescentado ao final do número a letra D, quando não houver identificação do sistema de numeração, será assumido que o número está representado no sistema decimal.
Exemplo:
ADI 25D
JNZ 322D
MVI B, 14
octal= deve ser acrescentado ao final do número a letra Q.
Exemplo:
MVI M, 20Q
SUI 37Q
binário= deve ser acrescentado ao final do número a letra B.
Exemplo:
ORI 10010011B
MVI A, 11110000B
letras identificadoras do registrador
As letras identificadoras dos registradores são:
A- registrador acumulador
B- registrador B ou par de registradores B e C
C- registrador C
D- registrador D ou par de registradores D e E
E- registrador E
H- registrador H ou par de registrador H e L
L- registrador L
PSW- par de registradores A e flags
SP- registrador de pilha, stack pointer
M- posição de memória de endereço igual ao conteúdo do par de registradores H e L
Constante no código ASCII
Um dado pode ser constante, neste caso, a constante deve estar entre aspas simples:
Exemplo:
MVI B, '@'
CPI 'CR'
Lembre-se, que o código é ascii.
Label ou Rótulo
O label é um rótulo que se dá a um endereço.Pode ser:
1- uma constante de valor previamente definido por instruções especiais.
2- um endereço previamente definido por instruções especiais.
3- o endereço da posição de memória do primeiro byte de uma instrução. Neste caso, o código de operação da instrução de endereço especificado, deve ser precedido deste label, seguido por dois pontos.
O label pode conter de um a seis caracteres alfanuméricos, porém o primeiro deve ser um caracter alfabético.
Exemplo:
JUMP INICIO
ROT: OUT PORTA 3
Para não haver confusão de dados, o label deve ser definido uma única vez.
Contador de localização
O operando de uma instrução pode ser o indicador de um endereço de memória localizado num certo número de endereços atrás ou à frente do primeiro byte desta instrução. Neste caso, o operando deve iniciar com o caracter "$" seguido pelo sinal e o número de bytes a ser incrementado ou decrementado do endereço do primeiro byte da instrução.
Exemplo:
JMP $+5
Expressão
As expressões são combinações aritméticas, lógicas ou especiais entre as maneiras anteriormente vistas de especificar-se o operando. As combinações mais usadas são:
soma - indicada por: +
subtração - indicada por: -
multiplicação - indicada por: *
divisão - indicada por: /
AND lógico - indicado por: AND
OR lógico - indicado por: OR
EXCLUSIVE OR lógico - indicado por: XOR
COMPLEMENTO 1 - indicado por: NOT
Exemplo:
MVI B, 25H*3H
CALL INICIO + 1AH
CPI 7H OR 12H
- endereçamento direto
Contém um simples endereço de memória onde está o dado a ser utilizado. São necessários três bytes para guardar uma instrução de endereçamento directo. O primeiro byte contem o opcode (código de operação). O segundo byte contem o byte menos significativo do endereço, enquanto o terceiro byte contem o byte mais significativo do endereço .

- endereçamento por par de registro
Pode especificar-se um endereço de memória através dos 16 bits de um par de registos. O conteúdo desse par de registos é então utilizado como endereço para a célula de memória que contem os dados a usar.Uma instrução deste tipo não precisa possuir os dois bytes que especificam o endereço de memória. Neste caso a memória ocupada com o programa é menor, o tempo de execução também diminui, já que o acesso aos registos é mais rápido que o tempo de acesso á memória RAM. Uma das aplicações deste modo de endereçamento é na manipulação de listas de dados em memória. Este tipo de manipulações é mais fácil já que o microprocessador possui instruções para incrementar e decrementar pares de registos, possibilitando assim que o par registos aponte para a próxima posição de dados numa sequência. Normalmente utiliza-se para esse efeito o par de registos H (registos H e L) . Algumas instruções permitem o uso dos pares B (registos B e C) e D (registos D e E) para endereçamento de memória.

- endereçamento por ponteiro de pilha
O endereçamento por ponteiro de pilha (stack pointer) permite que o programador adicione ou retire um dado de 16 bits da lista de dados. A lista é designada por pilha (stack) e reside na RAM. São possíveis duas operações na pilha, a operação push e a operação pop. Numa operação push, o conteúdo de 16 bits de um par de registos é transferido para a pilha, por transferência de 8 bits para a posição de memória indicada pelo registo SP -1 e os restantes 8 bits para a posição de memória indicada pelo registo SP. O conteúdo do registo SP é então actualizado par o seu valor inicial menos 2, preparando-o assim para o armazenamento de novo dados de 16 bits.


O ponteiro de pilha está sempre apontando para o último byte empurrado para a pilha. Esta localização designa-se topo da pilha. Uma operação pop na pilha, retira 2 bytes da pilha. Em primeiro lugar é lido o byte de dados apontado pelo endereço existente em SP. A seguir é lido o byte existente no endereço indicado por SP + 1, como se mostra na figura. São então adicionadas duas unidades ao conteúdo original de SP, de forma que este aponte para o próximo dado da pilha. Fica assim SP preparado para nova operação pop para retirar 2 bytes da pilha ou uma operação push para acrescentar dados à pilha.


A pilha é uma lista de comprimento variável que se expande para baixo na memória à medida que mais dados lhe são acrescentados (push) ou se contrai para cima, à medida que lhe são retirados dados (pop). A principal aplicação da pilha é no entanto, na programação de subrotinas, como se verá adiante.


Referências Bibliográficas:Por favor ler o tópico específico desse item...há muitas referências e gosto de lembrar de todas!