Nota de Aula - 8085 - JW
Nota de Aula - 8085 - JW
Nota de Aula - 8085 - JW
Notas de Aula
Microprocessador 8085
Microprocessador 8088
Goiânia, 2006
2
Observações
2. Não se pretende, com o uso desta apostila, dispensar os livros didáticos indicados na referência
básica, mas apenas facilitar o ensino da disciplina em questão, reunindo num só volume o
material a ser usado em sala de aula.
3. A apostila está distribuídas em capítulos que cobrem dois dos três temas principais, que são:
Obs.: As 96 horas de aulas teóricas serão ministradas em 48 aulas de 2 horas cada uma.
As 32 horas de aulas práticas serão ministradas em 16 aulas de 2 horas cada uma.
BIBLIOGRAFIA BÁSICA
Microprocessador 8085:
Microprocessador 8086:
Microcontrolador 8051:
6. SILVA JR., Vidal Pereira da, “Aplicações Práticas do Microcontrolador 8051,” Érica, São Paulo,
1994.
7. GIMENEZ, Salvador P., “Microcontroladores 8051: Teoria do hardware e do software /
Aplicações em controle digital / Laboratório e simulação,” Pearson Education do Brasil Ltda, São
Paulo, 2002. ISBN: 85.87918-28-1
8. NERYS, José Wilson L., “Apostila de Microprocessadores”
EMENTA
PROGRAMA
2 - Arquitetura do 8085:
- Princípio Básico de Operação de um Microprocessador
- Diagrama de Blocos do Microprocessador 8085
- Pinagem;
- Principais Características;
- O Sistema Mínimo;
- Modos de Endereçamento;
- Busca e Execução de Instruções.
- Interrupções
- Temporizadores
- Comunicação Serial
- Simulação Digital
- Construindo um Sistema Baseado no Microcontrolador 8051
8 - Atividades de Laboratório
LABORATÓRIO
Laboratório Conteúdo
1 Uso do Kit do 8085
Programa de Simulação ABACUS
2 Instruções de transferência de dados (uso do Kit e do simulador ABACUS)
3 Instruções aritméticas (uso do Kit e do simulador ABACUS)
4 Instruções lógicas (uso do kit e do simulador ABACUS)
5 Programação 8085 (uso do kit e do simulador ABACUS)
6 Programação 8085 com Interrupção
7 Programação 8085 com Interrupção
8 Microprocessador 8086: características básicas
9 Microcontrolador 8051: Sequência de LEDs e Motor de passo (uso de Kit e de
simulador)
10 Microcontrolador 8051: Motor de corrente contínua (uso de Kit e de simulador)
11 Microcontrolador 8051: Conversores AD e DA (uso de Kit e de simulador)
12 Projeto usando 8051
13 Projeto usando 8051
14 Projeto usando 8051
15 Projeto usando 8051
16 Projeto usando 8051
AVALIAÇÃO
9. MICROCONTROLADORES 8086/8088.....................................................................................104
Data da mesma época do ábaco o octograma chinês Yin Yang, o qual é tido como a primeira representação
binária dos números de 0 a 8. Foi criado pelo imperador chinês Fou-Hi para representar a interação entre as duas
energias que juntas são o fundamento da “totalidade”.
1614 – LOGARITMO – O cientista escocês JOHN NAPIER criou os logaritmos. Através das tabelas criadas,
as operações de multiplicação e divisão tornaram-se mais simples, pois eram substituídas por operações
de adição e subtração, reduzindo o tempo de processamento.
1642 – PASCALINE – O cientista francês BLAISE PASCAL criou uma calculadora capaz de realizar
operações de adição e subtração. A máquina implementada utilizava rodas e engrenagens, com as quais
era possível representar números decimais de 0 a 9. Pascal desenvolveu essa máquina para ajudar seu
pai na coleta de impostos. A máquina teve mais de 50 versões diferentes em uma década.
1671 – O matemático alemão francês GOTTFRIED LEIBNIZ criou uma calculadora de 4 funções, capaz de
realizar operações de adição, subtração, multiplicação e divisão. É a antecessora das calculadoras atuais.
O problema comum às calculadoras até esta época era a necessidade de entrar com todos os resultados
intermediários.
1801 – CARTÃO PERFURADO – O Tecelão francês JOSEPH MARIE JACQUARD aperfeiçoou o tear
construído por Vaucanson. Ele construiu uma máquina de tear que memorizava em cartões perfurados
os padrões de desenho dos tecidos e depois os reproduzia com fidelidade, lendo comandos na presença
ou ausência de orifícios. A versão seguinte do Tear, em 1804, era totalmente automatizada e podia fazer
desenhos muito complicados. Esse é considerado o primeiro registro de programação semelhante à de
computadores modernos.
Para ampliar seus negócios, a TMC se uniu com duas pequenas empresas para formar a CTRC
(Computing Tabulation Recording Company), em 1914. Em 1924, a CTRC se tornou uma empresa
internacional e mudou seu nome para IBM (Internacional Business Machine).
1936 – COMPUTADORES Z1, Z3 e Z4 – O cientista alemão KONRAD ZUSE criou o computador - Z1,
baseado em relé eletro-mecânico. Criou também o computador Z3, que foi o primeiro computador de
propósito geral controlado por programa. Criou ainda o Z4, computador projetado para o
desenvolvimento de mísseis. Ele foi destruído por bomba na 2a. guerra mundial.
1943 – COLOSSO – Na Inglaterra, em 1943, Alan Turing, do Serviço de Inteligência Britânico, construiu o
Colosso, de dimensões gigantescas. A máquina, abrigada em Bletchley Park, tinha 2000 válvulas e lia
símbolos perfurados numa argola de fita de papel, inserida na máquina de leitura fotoelétrica,
comparando a mensagem codificada com sequências conhecidas até encontrar uma coincidência.
Processava cerca de 5 mil caracteres por segundo e foi usada para descodificar as mensagens dos
alemães, tendo sido decisiva no resultado final da guerra.
Colosso Mark I
1944 – MARK I – Na Universidade de Harvard em 1937, o professor Howard Aiken, financiado pela IBM,
começou a construir o Mark I, concluído em 1944. Baseado em um sistema decimal, manipulava
números de até 23 dígitos e tinha medidas grotescas: 15 m de comprimento e 2,5 m de altura; 760.000
peças envoltas em vidro e aço inoxidável brilhante; 800 km de fios e 420 interruptores para
controle.trabalhava sob o controle de um programa perfurado em uma fita de papel. Adição e subtração
em 0,3 s, multiplicação em 3 s e divisão em 12 s,
1946 – ENIAC – (Electronic Numerical Integrator and Computer) - 1o Computador de propósito geral a
válvula: 18.000 válvulas, 30 toneladas, 15.000 pés quadrados, 140 kW, representação e aritmética com
números decimais, 5.000 adições /seg. Projetado pela Ballistics Research Labs. Foi aproveitado no
desenvolvimento da Bomba “H”.
1946 – VON NEWMANN MACHINE – A Máquina de Von Newman, ou “Máquina de Touring” introduziu o
conceito de programa armazenado (Stored Programa Concept) no qual a memória conteria, além de
dados, programas. Os computadores modernos são baseados na máquina de Von Newman.
1950 – UNIVAC – (Universal Automatic Computer) – Lançado pela SPERRY, foi o 1o Computador de
aplicação científica e comercial. Seguiram UNIVAC II e UNIVAC 1100 series .
1947 – TRANSISTOR – Invenção do transistor pelos cientistas John Bardeen, William Shockley e Walter
Brattain. Passou a ser usado em escala comercial somente em 1952 pela Bell Laboratories.
1958 – CIRCUITO INTEGRADO – O engenheiro Jack Kilby, da Texas Instruments, criou o Circuito
Integrado.
1960 – IBM 7090, 7094 – Computador transistorizado. Utilização de linguagens de programação de alto nível,
tais como FORTRAN, COBOL e PASCAL.
1971 – 4004 (INTEL) - 1o microprocessador a ser lançado, de 4 bits, com aplicação voltada para calculadoras
(manipulação de números em BCD) - 45 instruções - 640 Bytes de memória - clock de 108 KHz -
60.000 instruções/seg. (OBS: desempenho superior ao ENIAC) - 2.300 transistores.
1972 – 8008 (INTEL) - 1o microprocessador de 8 bits, com aplicação voltada para terminais (que trabalham com
caracteres - codificação ASCII) - 48 instruções - 16KB de memória - clock de 200 KHz - 300.000
instruções/seg. 3500 transistores.
1974 – 8080 (INTEL) - Processador de 8 bits, de propósito geral - 72 instruções - opera com 12V - clock de 2
MHz - 640.000 instruções/s. 64KB de memória. 6.000 transistores.
1975 – Z80 (ZILOG), 6502 (MOS) – Utilizado pelo 1o APPLE (APPLE 1) em 1976 por Steve Wozniak e Steve
Jobs (data da fundação da APPLE).
1976 – 8085 (INTEL) – “8080” operando com 5V - 2 instruções a + que o 8080 - melhor performance. 5 MHz -
370.000 instruções/s. 6500 transistores.
1978 – 8086 (INTEL) - Processador 16 bits (barram. externo de 16 bits e registradores de 16 bits). 5 MHz - 0.33
MIPS, 8 MHz - 0.66 MIPS e 10 MHz - 0.75 MIPS. 29.000 transistores.
1979 – 8088 (INTEL) - Processador 16 bits (barram. externo de 8 bits e registradores de 16 bits) - 133
instruções - chip utilizado no primeiro PC em 1981. O PC/XT seria lançado em 1983 com HD de 10
MB e 128 Kbyte RAM. 29.000 transistores. Lançado o 68.000 (MOTOROLA) que foi utilizado no
Machintosh em 1984
1982 – 80186/188 - 80286 - 80287 (INTEL) – PC/AT – 16 bits, modo protegido, 24 linhas endereços.
1985 – 80386 (INTEL) – Processador de 32 bits - bus ext. de dados de 32bits - 275.000 transistores. 16MHz -
2.5 MIPS, 20 MHz - 2.5 MIPS, 25 MHz - 2.7 MIPS, 33 MHz - 2.9 MIPS.
1989 – 80486 (INTEL) - Processador de 32 bits: “386” que incorpora o 387 (coprocessador), cache interna (L1)
de 8KB e maior performance - 235 instruções - 1,2 milhões de transistores. 25 MHz - 20 MIPS, 33
MHz - 27 MIPS, 50 MHz - 41 MIPS.
1991 – WEB – Tim Berners-Lee desenvolve a Rede Mundial de Computadores (World Wide Web). O primeiro
servidor Web é lançado. O conceito de conexão de vários usuários a um único computador por via
remota nasceu no MIT no final da década de 50 e início da década de 60. As idéias básicas da Internet
foram desenvolvidas em 1973 por Bob Kahn e Vint Cerf.
1993 – Pentium 60 MHz e 66 MHz - Processador de 32 bits – bus ext. de 64 bits - 5V - 3 milhões de
transistores. Primeiro processador de 5a geração.
1994 – Pentium 90 MHz e 100 MHz - Alimentação de 3,3V (maior confiabilidade). 3.2 milhões de transistores.
1996 – Pentium Pro 200 - Incorpora cache L2 de 256kB, utilizando tecnologia MCM (Multi-Chip Module) - 5
milhões de transistores - idealizado para programas de 32 bits. Usa memória de 64 bits.
1997 – Pentium 200MMX (Pentium MultiMidia eXtensions): contém 57 novas instruções dedicadas para
programas de Multimídia. 4.5 milhões de transistores. 200 MHz e 166 MHz. Barramento de 64 bits.
Cada instrução MMX equivale a várias instruções comuns.
1997 – Pentium II 233, 266, 300MHz – utiliza o slot I. 7,5 milhões de transistores (tecnologia 0.35 micron),
cache L2 com 512kB - 242 pinos - 64GB de memória endereçável. Poder de processamento de 32 bits
do Pentium Pro e maior eficiência no processamento de 16 bits. Instruções MMX.
1998 – Pentium II 450 MHz - Cache L2 de 512 kB, 7.5 milhões de transistores, tecnologia 0.25 micron,
barramento de 64 bits. 64 GB de memória endereçável.
1999 – Pentium III 450 e 500 MHz (até 1,2 GHz) – Barramento de sistema de 100 MHz ou 133 MHz, cache L2
de 512 kB, processador de 32 bits, 9,5 milhões de transistores, tecnologia 0.25 micron, 64 GB de
memória endereçável. 70 novas instruções voltadas para multimídia e processamento 3D.
2000 – Pentium IV – até 2 GHz, barramento de sistema de 400 MHz, Cachê L1 de 32 kB e L2 de 256 kB, 42
milhões de transistores.
A quantidade cada vez maior de transistores numa única pastilha foi acompanhada da redução do
tamanho físico dos transistores. Essa redução é mostrada na Fig. 1.2.
A redução do tamanho do transistor resulta no aumento da velocidade de operação e também na redução
das conexões internas, além de permitir a inserção de um número cada vez maior de transistores numa única
pastilha. O aumento da capacidade de integração de transistores resulta ainda na redução do consumo de energia
elétrica e do custo dos microprocessadores. Há um postulado que diz que o gate de um transistor não pode ser
menor do a largura correspondente a 10 átomos. A previsão de pesquisadores da Intel é a dimensão do gate dos
transistores alcançarão esse valor por volta do ano 2017 (http://www.intel.com/update/archive/issue2/focus.htm).
COMPUTADOR (definições):
Microcomputador:
- Computador que tem a CPU implementada em um único chip: o microprocessador
Minicomputador:
- Multi-usuário;
- grande capacidade de armazenamento;
- operação com matrizes e ponto flutuante melhorada;
Supercomputador:
- Computador idealizado para resolver problemas matemáticos de processos reais, tais como:
aerodinâmica, meteorologia, física, etc
- altíssima performance (GFLOPs) para repetidas operações aritméticas (iteração);
- operações com matrizes e números em ponto flutuante;
- mercado limitado.
Computadores Analógicos:
- operam diretamente com grandeza física (variáveis contínuas);
Computadores Digitais:
- operam com variáveis discretas (números).
CPU
Control Unit - Unidade de Controle (UC) - tem por função básica o controle das demais unidades da CPU de
uma forma lógica e sincronizada.
ALU (Aritmetic and Logic Unit) - Unidade Lógica e Aritmética (ULA) - realiza funções básicas de
processamento de dados (adição, subtração, funções lógicas, etc.).
Registers - Registradores - São usados para o armazenamento interno da CPU. Existem diversos registradores na
CPU e o principal deles é chamado de Acumulador.
CPU interconnection - É o barramento interno da CPU; ele permite a comunicação entre a Unidade de
Controle, a Unidade Lógica e Aritmética e os Registradores.
1.4.2 Memória
É o local de armazenamento de dados e programas. Possui palavras de tamanho fixo, sendo cada
palavra vinculada a um endereço único. Possui ainda linhas de controle, sendo as principais: READ (leitura) /
WRITE (escrita).
Existem dois tipos básicos de memória: Memória somente para leitura (ROM), onde ficam
armazenados permanentemente informações fundamentais para o funcionamento do computador e cujos dados
não são perdidos na falta de energia; e a memória RAM, que permite gravar e apagar dados de acordo com os
interesses do usuário, e cujo conteúdo é perdido quando o computador é desligado. A memória RAM divide-se
ainda em Memória Dinâmica (DRAM) e memória estática (SRAM), que serão melhor detalhadas
posteriormente. A principal característica a ser destacada neste ponto é a baixa velocidade de acesso da memória
RAM.
Com o passar dos anos os processadores tornaram-se cada vez mais rápidos, o mesmo não acontecendo
com as pastilhas de memória, que evoluíram de forma bem menos acentuada (em particular, a memória
dinâmica, que possui velocidade de acesso bem menor que a estática, mas é bem mais barata). Para evitar com
que a baixa velocidade de acesso da memória comprometesse o desempenho dos processadores mais modernos,
um tipo especial de memória RAM foi criado: a memória CACHE.
A memória CACHE consiste numa pequena quantidade de memória RAM estática (SRAM) usada para
acelerar o acesso à RAM dinâmica. Quando há necessidade de ler dados da memória dinâmica, estes são antes
transferidos para a memória cache. Enquanto o processador lê dados da memória cache, mais dados são
antecipadamente transferidos da memória dinâmica para a memória cache, de forma que o processamento torna-
se mais rápido.
É a unidade através da qual o usuário se comunica com o sistema. Ela abriga componentes
responsáveis pelo interfaceamento do sistema com periféricos tais como teclado, LCD, mouse, impressora e
monitor. É também através da unidade de entrada e saída que são enviados sinais de interrupção para a CPU.
1.4.4 Barramento
Barramento é o meio físico usado para o transporte de um conjunto de sinais digitais usados para
comunicação entre o processador, a memória e o meio externo. O barramento específico para a comunicação
entre o processador e a memória é chamado de barramento de sistema. Para a comunicação com os periféricos os
três tipos mais comuns de barramento hoje são: barramento ISA, usado para interfaces seriais, paralelas,
interface para drivers e alto falante; barramento PCI, usado para interfaces IDE e USB; e barramento AGP,
usado para placas de vídeo 3D de alto desempenho.
Um barramento é constituído de um barramento de dados, um barramento de endereços e um
barramento de controle. O barramento de dados nos computadores mais modernos possui até 64 linhas (bits) e
permite o fluxo bidirecional de dados. O microprocessador 8085, objeto de estudo na primeira parte do presente
curso, possui 8 bits de dados e, por esta razão, é denominado de processador de 8 bits.
A quantidade de posições de memória que um computador pode acessar é ditada pela quantidade de bits
do barramento de endereços. Um barramento com 32 bits pode acessar até 4.294.967.296 (232) posições de
memória, o que corresponde a 4 GB de memória (4.294.967.296 = 4 × 1024 × 1024 × 1024 = 4 GB). Todos os
processadores da classe Pentium possuem barramento de endereço com 32 bits. Os processadores Pentium II,
Pentium III e Celeron possuem barramento de endereço de 36 bits, podendo então acessar até 64 GB de
memória.
O barramento de controle de um computador comporta uma série de sinais com finalidades diversas.
Alguns exemplos são: sinal RW que indica se a operação é uma leitura ou uma escrita, sinal MIO, que indica se
a operação envolve a memória ou a unidade de entrada e saída, sinal de RESET, entradas das interrupções, sinal
de CLOCK, etc.
Barramento ISA - O barramento ISA (Industry Standard Architecture) é formado por slots de 8 e 16 bits
existentes nas placas de CPU e foi originado no IBM PC, na versão de 8 bits, e aperfeiçoado no IBM PC AT,
quando foi criada a versão de 16 bits. Permite transferência de dados em grupos de 8 ou 16 bits a um clock de
8 MHz. Embora possua velocidade de transferência pequena para os padrões atuais, o barramento ISA ainda
é muito utilizado para placas tais como fax/modem, placas de som e placas de rede, cujos desempenhos não
ficam comprometidos com a baixa velocidade de transferência do barramento.
Barramento PCI - O barramento PCI (Peripheral Component Interconnect) foi desenvolvimento pela Intel,
quando do desenvolvimento do processador Pentium. Ele opera com 32 ou 64 bits, apresenta taxa de
transferência de até 132 MB/s, com 32 bits e possui suporte para o padrão PnP (Plug and Play). Seu clock é
geralmente de 33 MHz, para valores de clock interno acima de 150 MHz.
Barramento AGP - O barramento AGP (Accelerated Graphics Port) foi devolvido pela Intel com o intuito de
aumentar a taxa de transferência entre a CPU e a placa de vídeo, melhorando o desempenho de operação com
gráficos. Esse barramento foi incorporado à CPU de processadores Pentium II mais modernos. A principal
vantagem do AGP é o uso de maior quantidade de memória para armazenamento de texturas para objetos
tridimensionais, além de alta velocidade no acesso a essas texturas para aplicação na tela.
• Aumento de clock
• Aumento do número interno de bits
• Aumento do número externo de bits
• Redução do número de ciclos para executar cada instrução
• Aumento da capacidade e velocidade da memória cache
• Execução de instruções em paralelo
FLOPS - FLOating point instructions Per Seconds (Instruções com Ponto Flutuante Por Segundo). É também
uma unidade de desempenho do microprocessador. Indica a capacidade de trabalhar com números
decimais.
Representação em Ponto Fixo - Sistema numérico no qual o ponto está implicitamente fixo (à direita do digito
mais a direita);
Representação em Ponto Flutuante - Sistema numérico no qual um número real é representado por um par
distinto de numerais: uma mantissa (ou significante) e um expoente. Possibilita representação de
números fracionários.
Bit - Abreviatura para 'Binary Digit', ou, Dígito Binário. Pode assumir valor 0, que corresponde a tensão O V, ou
1, que representa normalmente uma tensão de 5 V ou 3.3 V.
Byte - Conjunto (cordão) de 8 bits. É a unidade básica de dados nos computadores, que também utilizam alguns
múltiplos de 8, tais como 16 bits (Word) e 32 bits (Dword).
BYTE
nibble superior nibble inferior
Bit 7 Bit 6 Bit 5 Bit 5 Bit 3 Bit 2 Bit 1 Bit 0
Set de instruções - Conjunto de Instruções. Conjunto de Mnemônicos (siglas que fazem lembrar uma ação) que
representam todas as instruções do processador. Cada processador possui o seu set de instruções
particular.
CISC - Complex Instruction Set Computer: Tecnologia atribuída às CPUs de um modo geral, que contém set de
instruções complexo. O barramento de comunicação entre as unidades que compõem a CPU é comum a
todas as unidades, ou seja, não há comunicação direta entre unidades, através de um barramento
exclusivo.
RISC - Reduced Instruction Set Computer: Computador com set de instruções reduzido. Principais
características:
• Conjunto de instruções limitado e simples;
• Grande número de registradores de propósito geral;
• Pipeline otimizado. Em outras palavras, há comunicação direta entre algumas unidades, através de
barramento exclusivo, possibilitando, assim, o processamento paralelo de intruções.
BIOS - Basic Input/Output System – É o conjunto mínimo de instruções necessárias para a inicialização do
computador. Também gerencia o fluxo de dados entre o sistema operacional do computador e os
dispositivos periféricos conectados.
Memória EPROM - (Erasable Programmable Read Only Memory) - São memórias somente de leitura usadas
para a gravação de programas. A gravação é feita através de uma gravadora específica e os dados
gravados podem ser apagados através de raios ultravioletas. Pode-se repetir esse processo gravar/apagar
por várias vezes.
Memória EEPROM ou E2PROM - (Electrically Erasable Programmable Read Only Memory) - São memórias
que podem ser usadas tanto para leitura quanto para escrita porque a gravação pode ser através de
gravadora específica ou pelo sistema. São apagadas eletricamente. o é feita através de uma gravadora
específica e os dados gravados podem ser apagados através de raios ultravioletas. Pode-se repetir esse
processo gravar/apagar por várias vezes.
1o dígito: Armazena as unidades (ou 100 = 1). No ex.: seis unidades (ou 6 × 100);
2o dígito: Armazena as dezenas (ou 101 = 10). No ex.: quatro dezenas (ou 4 × 101);
3o dígito: Armazena as centenas (ou 102 = 100). No ex.: três centenas (ou 3 × 102);
A ponderação é dada pelo número 10 elevado à potência representada pela coluna, sendo que a 1a
coluna da direita é 0.
1 + 2 + 0 + 8 + 0 + 0 + 64 + 128 = 20310
A ponderação é dada pelo número 2 elevado à potência representada pela coluna, sendo que a 1a coluna
é 0, a segunda coluna é 1 e assim sucessivamente.
O Sistema Hexadecimal é baseado nos mesmos princípios do decimal, apenas utiliza base 16. Utiliza 16
dígitos: 0 a 9, A, B, C, D, E e F. Exemplo: Ex.: 20DH ou 20Dh ou 20D16
O sistema hexadecimal é mais fácil de trabalhar que o sistema binário e é geralmente utilizado para
escrever endereços. Cada dígito hexadecimal é convertido em 4 dígitos binários equivalentes. Cada número
binário é convertido em hexadecimal convertendo-se grupos de 4 bits em seus dígitos hexadecimais
equivalentes.
6. Quantas posições de memória podem ser endereçadas com um barramento de endereços de 16 bits? E de
20 bits?
11. Converta os números abaixo (que estão na base indicada) para hexadecimal
[1] Ziller, Roberto M., “Microprocessadores – Conceitos Importantes,” Edição do Autor, Florianópolis, SC,
2000.
[2] http://www.intel.com/research/silicon/moorespaper.pdf
[3] www.maebee.com.br
[4] http://www.intel.com/intel/intelis/museum/exhibits/hist_micro/hof/
[5] http://www.computerhistory.org/timeline/
Principais Características:
Unidade responsável pelo tratamento das 5 interrupções externas do 8085. Essas interrupções são
vetoradas, o que significa que há um endereço fixo, pré-definido, para cada uma (RST n salta para a
posição de memória 8 vezes n: RST 5.5 = 4410 = 2Ch; RST 6.5 = 34h; RST 7.5 = 3Ch.). As interrupções
RST 5.5, RST 6.5 e RST 7.5 podem ser mascaradas, ou seja, elas podem ser bloqueadas via "software". Já a
interrupção TRAP não pode ser bloqueada e é a interrupção de maior prioridade do 8085. Ela normalmente
é ativada quando há problemas de falta de energia, para um desligamento seguro do microprocessador. A
interrupção INTR, na verdade, é um canal para expansão da capacidade de interrupção. Através desse canal
um CI especial (Exemplo: CI 8259) é conectado ao 8085, de modo a permitir um número maior de
interrupções. O sinal INTA\ faz parte da comunicação entre o 8085 e o CI usado para expansão da
capacidade de interrupção.
É através dessa unidade que o microprocessador recebe e envia dados de forma serial, ou seja, bit a bit, ao
invés de um byte por vez. O pino SID (Serial Imput Data) é usado para a entrada de dados de forma serial e
o pino SOD (Serial Output Data) é usado para a saída de dados de forma serial.
Esta unidade é responsável por gerar todos os sinais de controle do 8085, tais como os sinais de leitura
(RD\) e escrita (WR\) de memória, os sinais de liberação de barramento para um periférico (HLDA) e o
sinal de habilitação de endereço para um periférico (ALE). Todas as unidades internas do 8085 são
controladas por esta unidade, que contém, dentre outros, um contador em anel para sincronização da
operação de todas as unidades do 8085. Os sinais de controle para outras unidades são enviados após a
decodificação das instruções vindas do Registrador de Instruções (IR). Recebe ainda sinais do registrador
de Flags e da unidade de interrupções.
É responsável por todo o processamento realizado na CPU (execução de instruções aritméticas e lógicas). É
controlada por sinais internos emitidos pela Unidade de Controle. Tem como entrada os registradores A
(Acumulador) e TEMP (Temporário). É responsável pela sinalização de status das operações (FLAGS). É
um registrador de 8 bits.
Registrador "Acumulador"
É o principal registrador da CPU. É utilizado como Buffer temporário de entrada da Unidade Lógica e
Aritmética (ALU ou ULA). Freqüentemente é o registrador de entrada ou saída da CPU. É utilizado
implicitamente na maioria das instruções. É um registrador de 8 bits, o que permite trabalhar com números
sem sinal de 0 a 255 e números com sinal de -128 a +127. O resultado das operações resultantes da ULA é
enviado para o Acumulador.
Registrador "TEMP"
É um registrador auxiliar usado para a entrada de dados da Unidade Lógico-Aritmética. Os dados desse
registrador são enviados para a ULA juntamente com os dados do Acumulador.
É também conhecido como registrador F (de Flags), ou registrador PSW (Program Status Word) É um
registrador de 8 bits (mas somente 5 bits são utilizados) que armazena o estado da última operação
realizada na ULA. São 5 as flags do 8085, conforme mostrado a seguir:
Registrador F
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
S Z × AC × P × CY
AC = Auxiliar de Carry = flag usada como auxiliar de transporte. Assume valor 1 quando há transporte do
bit 3 para o bit 4. É usada em operações BCD
É um registrador de 8 bits que armazena o primeiro byte da instrução (OPCODE), ou seja, o conteúdo da
memória apontado (endereçado) pelo registrado PC.
É o registrador responsável pela decodificação de cada instrução e de definição dos ciclos de máquina que
serão controlados pela unidade de controle.
Registradores B, C, D, E, H e L
São registradores de propósito geral de 8 bits e que podem ser combinados aos pares para formar
registradores par (rp: register pair) para armazenar endereços (16 bits). Os pares formados são: BC, DE e
HL. O primeiro registrador de cada par armazena o byte mais significativo, isto é, B, D e H.
Registrador par HL
Registrador usado como apontador de dados na memória RAM, à semalhança do registrador PC, que
aponta instruções e dados na memória ROM (como será visto numa seção posterior). O registrador HL é
usado implicitamente em várias instruções e é referenciado nessas instruções “M”, de Memory.
O registrador apontador de pilha SP (Stack Pointer) é um registrador de 16 bits usado como apontador de
dados numa região especial da memória RAM, denominada de Pilha (Stack). Esse espaço de memória é
especialmente destinado a guardar temporariamente informações de registradores que serão usados em
outra tarefa. A ordenação de elementos na pilha é tal que somente um dado pode ser acessado num
determinado instante e a última palavra digital que entra é a primeira que sai (Lista LIFO - Last In First
Out). O apontador de pilha (registrador SP) aponta sempre para o topo desta pilha (top of stack), ou seja,
para o último dado que foi armazenado. Os dados normalmente armazenados são endereços de
chamadas/retornos de subrotina e endereços de retorno de interrupções, que automaticamente armazenados
pelo 8085 e ainda outros dados que podem ser armazenados pelo programador usando a instrução PUSH.
Posteriormente esses dados são retirados da pilha usando a instrução POP.
A freqüência de clock do 8085A deve ficar na faixa de 500 kHz a 3,125 MHz. Já a freqüência de clock
do 8085A-2 deve ficar entre 500 kHz e 5 MHz. A freqüência de clock é metade da freqüência do cristal
oscilador, como mostrado na expressão que segue. Isso ocorre porque o flip-flop que gera o clock divide o sinal
de entrada por 2.
f cristal
f clock =
2 J Q CL
X1
fcristal K Q CL
X2
Pinos de conexão do cristal. X1 pode ser uma onda Pino de alimentação. Vcc = +5 V
quadrada. Nesse caso, X2 pode ficar aberto. Requerimento de barramento. Ativo alto.
Indicas aos periféricos que a CPU está sendo ressetada Reconhecimento de HOLD. Indica que pedido foi aceito.
Pino de saída de dado serial. Saída de clock para os demais chips do sistema
Pino de entrada de dado serial. Reset do sistema. PC = 0000 h. Interrupções com máscara.
Pino da interrupção de maior prioridade. Não mascarável. 1 memória ou perif. prontos para acesso. 0 wait
Pino da interrupção que desvia para o endereço 3C h. Indica se a operação é de entrada/saída ou com memória
Pino da interrupção que desvia para o endereço 34 h. Com S0 e IO/M\ indicam estados do ciclo de máquina
Pino da interrupção que desvia para o endereço 2C h. Sinal que habilita periférico ou memória para leitura
Pino usado para expandir a capacidade de interrupção. Sinal que habilita periférico ou memória para escrita
Reconhecimento de pedido de interrupção. Sinal para carga da parte baixa do endereço (no latch 74373)
M1 M2
CLK
T1 T2 T3 T4 T1 T2 T3
PC FORA PC+1→PC INST →IR SBE
A15 - A8 PC S PC S
ALE
RD\
WR\
IO-M\
M1 M2
CLK
T1 T2 Twait T3 T4 T1 T2 T3
PC FORA PC+1→PC INST →IR SBE
A15 - A8 PC S PC S
ALE
RD\
WR\
IO-M\
Microprocessador (CPU)
Contador de Programa
(PC)
Barramento
de Endereços Barramento de Dados
Acumulador Registrador de
A ou ACC Instruções (IR)
Opcode
Outros ROM
Registradores: Unidade de
Endereço Instrução
Decodificação de
0000 h ADD B
B, C, D, E, H, L Instruções
0001 h MOV B,A
Unidade de Controle
RAM
Endereço Conteúdo
Unidade Lógica e Aritmética
(ALU)
O barramento de endereços é de 16 bits, sendo que os 8 bits menos significativos são usados também
para a transferência de dados, enquanto que os 8 bits mais significativos são exclusivos para endereços. Assim, a
chave de três estados desempenha um papel essencial na operação do microprocessador. Durante a comunicação
entre dois blocos os outros blocos encontram-se no estado de alta impedância, não havendo, portanto,
transferência de dados desses blocos para o barramento ou do barramento para estes blocos. O diagrama de
temporização para as duas instruções é mostrado na Fig. 2.6.
M1 M2
CLK
T1 T2 T3 T4 T1 T2 T3
ADD B PC FORA PC+1→PC INST →IR B → TMP SBE A+TMP→A
A15 - A8 PC S PC S
ALE
RD\
WR\
IO-M\
Supondo-se que o acumulador contenha o valor 10h e que o registrador B (que faz parte do bloco
denominado "outros registradores") contenha o valor 5h, a adição do conteúdo de B ao conteúdo de A é obtido
com a instrução ADD B. O resultado é guardado no próprio acumulador. Posteriormente, com a instrução MOV
B,A o conteúdo de A é copiado em B. Os passos para execução das duas instruções em seqüência são dados a
seguir:
CICLO DE BUSCA:
1 Na descida do sinal de clock em T1 o Contador de Programa (PC) é ativado, colocando o endereço atual no
barramento de 16 bits. O sinal ALE é o trigger para a transferência dos endereços de PC para o barramento.
2 Na subida do sinal de clock em T1 o endereço é transferido do barramento para a memória ROM.
3 Na descida do sinal de clock (estado T2) o PC é incrementado em 1, ficando pronto para apontar a próxima
instrução. O barramento está disponível para outras operações. Nesse instante, também, O sinal RD\ torna-
se baixo, habilitando uma operação de leitura. Como o sinal IO/M\ permanece baixo, trata-se de leitura de
memória.
4 Na subida do sinal de clock (ainda estado T2) nenhum bloco está ativo. O barramento continua disponível.
5 Na descida do sinal de clock (estado T3) o código da instrução ADD B, lida da memória ROM (endereço
transferido do barramento para a memória ROM no passo 2) é transferido para o barramento.
6 Na subida do sinal de clock o bloco IR (Registrador de Instrução) carrega a instrução vinda da ROM e que
está presente no barramento. Termina o ciclo de busca da instrução ADD B.
7 Na descida do sinal de clock, no início do estado T4, o conteúdo de B é transferido para o barramento.
8 Na subida do clock no estado T4 o conteúdo de B, presente no barramento, é transferido para um registrador
temporário (TMP), para, depois, ser transferido para a unidade lógica e aritmética.
9 Durante o estado T1 do ciclo de máquina M2 não há nenhuma operação na instrução ADD B, daí uma outra
instrução pode utilizar o barramento para iniciar o ciclo de busca. No caso mostrado dá-se início ao ciclo de
busca da instrução MOV B,A. Portanto, há "sobreposição busca-execução" (SBE). Busca da instrução
MOV B,A e execução da instrução ADD B.
10 No estado T2 do ciclo de máquina M2 a instrução iniciada (MOV B,A) não usa o barramento de
dados/endereços. Nessa fase a instrução ADD B é encerrada. Na descida do sinal de clock em T2 os
conteúdos de A (10 h) e do registrador temporário TMP (B = 5 h) são simultaneamente transferidos para a
Unidade Lógica e Aritmética (ULA), de onde o resultado da adição sai direto para o barramento. Na subida
do sinal de clock em T2 o resultado da operação é carregado no acumulador (A = 15 h). Encerra a
execução da instrução ADD B.
11 No estado T3 do ciclo de máquina M2 a instrução MOV B,A lida da ROM é transferida para o Registrador
de Instruções e decodificada, encerrando o ciclo de busca dessa instrução.
12 No estado T4 do ciclo M2 o conteúdo de A é transferido para um registrador temporário para,
posteriormente, ser transferido para o registrador B.
D7 D6 D5 D4 D3 D0 D2 D1
MSB LSB
MSB = Most Significant Bit (Bit mais significativo)
LSB = Least Significant Bit (Bit menos significativo)
a) Instruções de 1 byte:
Opcode (byte 1) D7 D6 D5 D4 D3 D2 D1 D0
Opcode (byte 1) 1 0 0 0 0 0 0 0 = 80 h
b) Instruções de 2 bytes:
Opcode (byte 1) D7 D6 D5 D4 D3 D2 D1 D0
Operando (byte 2) D7 D6 D5 D4 D3 D2 D1 D0
Opcode (byte 1) 0 0 1 1 1 1 1 0 = 3E h
Operando (byte 2) 0 0 1 1 0 0 1 0 = 32 h
c) Instruções de 3 bytes:
Opcode (byte 1) D7 D6 D5 D4 D3 D2 D1 D0
Operando 1 (byte 2=LSB) D7 D6 D5 D4 D3 D2 D1 D0
Operando 2 (byte 3 = MSB) D7 D6 D5 D4 D3 D2 D1 D0
Os bytes 2 e 3 contêm um dado ou um endereço de 16 bits. O byte 2 armazena o byte menos significativo
do endereço (low-order addr) ou o byte menos significativo do dado de 16 bits (low-order data). O byte 3
armazena o byte mais significativo do endereço (high-order addr) ) ou o byte mais significativo do dado (high-
order data)
Exemplo: STA 1234h - guarda o conteúdo do acumulador na posição de memória indicada pelo
endereço addr
((byte 3)(byte 2) ← (A)
Opcode (byte 1) 0 0 1 1 0 0 1 0 = 32 h
Operando 1 (byte 2) 0 0 1 1 0 1 0 0 = 34 h
Operando 2 (byte 3) 0 0 0 1 0 0 1 0 = 12 h
No ciclo de busca (primeiro ciclo de máquina) o microprocessador 8085 transfere o primeiro byte da
instrução (opcode = código de operação) para o Registrador de Instrução (IR). Nos ciclos de máquina que se
seguem os outros bytes são buscados na memória. Primeiro o byte 2 é transferido para um registrador
temporário (Z), depois é o byte 3 que é transferido para um registrador temporário (W).
Cada uma das instruções pode ser visualizada com um diagrama de temporização que mostra cada passo
da instrução.
O primeiro ciclo de máquina do 8085 é flexível podendo ter de 4 a 6 ciclos de clock; os demias ciclos
de máquina contém 3 ciclos de clock. O ciclo de instrução pode ter de 1 a 5 ciclos de máquina, como mostrado a
seguir, onde M é o ciclo de máquina e T é o estado dentro do ciclo de máquina:
M1 M2 M3 M4 M5
T1 T2 T3 T4 T5 T6 T1 T2 T3 T1 T2 T3 T1 T2 T3 T1 T2 T3
1. Enumerar todos os registradores (endereçáveis ou não) do microprocessador 8085. Qual a capacidade (em
bits) de cada um deles?
9. Dizer, em poucas palavras, a função de cada um dos seguintes pinos do 8085: HOLD, HLDA, INTR,
INTA, RST5.5, TRAP, READY, ALE, IO/M\, SID e SOD.
10. Apresentar um circuito combinacional para decodificar os sinais dos pinos RD\, WR\ e IO/M\ em
MEM_RD, MEM_WR, IO_RD, IO_WR. OBS: Utilizar apenas gates.
11. Codifique as instruções da tabela a seguir, coloque o endereço de cada instrução, escreva o significado de
cada instrução e responda às questões relativas à tabela.
Operação End. Mnemônico Comentário
(SP) ← 2090 h 2000
(H,L) ← 2050 h
(A) ← 53 h
(B) ← 0F h
(A) ← (A) + (B)
((H,L)) ← (A)
12. O diagrama de temporização a seguir refere-se às instruções ADD B e MOV B,A do microprocessador
8085.
CLK
T1 T2 T3 T4 T1 T2 T3 T4
ADD B PC FORA PC+1 PC INST IR B TMP SBE A+TMP A
A15 - A8 PC S PC S
ALE
RD\
WR\
IO-M\
(c) Marque, no diagrama, os estados T que correspondem ao período de execução da instrução MOV B,A;
(d) Marque, no diagrama, com simbologia diferente da usada no item (a), os estados T que correspondem
ao período de busca da instrução ADD B;
(e) Explique o significado dos sinais RD\, WR\ e IO-M\ no diagrama dado.
[1] Ziller, Roberto M., "Microprocessadores - Conceitos Básicos,"2a. Ed., Editora do Autor,
Florianópolis, SC, 2000.
[2] Kleitz, William, "Digital and Microprocessor Fundamentals - Theory and Applications," Prentice Hall,
Englewood Cliffs, New Jersey, 1990
[3] Malvino, Albert P., “Microcomputadores e Microprocessadores,” Tradução: Anatólio Laschuk, revisão
técnica: Rodrigo Araes Caldas Farias, McGraw-Hill, São Paulo, 1985.
Exemplo 1:
Para transferir o conteúdo do registrador B para o registrador A, o mnemônico da instrução é MOV A,B. A cada
mnemônico corresponde um código de operação (opcode) em hexadecimal. No caso dessa instrução é 78 h.
Para transferir o conteúdo do registrador E para o registrador D, o mnemônico da instrução é MOV D,E. O
opcode é 53 h.
Exemplo 2:
Para transferir o conteúdo do endereço 234B h da memória, a instrução e o código da instrução seriam:
LDA 234B h Opcode: 3A 4B 23 (O conteúdo do byte menos significativo é digitado primeiro)
As instruções do 8085 fazem referência aos dados de forma explícita ou implícita. Há 4 maneiras
distintas de se fazer esta referência:
DIRETO: O 2o e o 3o bytes da instrução contém o endereço da posição de memória onde se encontra o dado.
Exemplo: LDA addr = carrega o acumulador com o dado do endereço indicado
(A) ← ((byte 3)(byte 2))
REGISTRO: A instrução especifica o registrador ou o par de registradores onde o dado está armazenado.
Exemplo: MOV r1, r2 = move conteúdo do registrador r2 para o registrador r1
(r1) ← (r2)
INDIRETO POR REGISTRO: A instrução especifica o registrador par (rp) que contém o endereço da posição
de memória onde o dado está armazenado.
Exemplo: MOV r, M = move para o registrador r o conteúdo da memória localizado na posição
indicada pelo para HL
( r ) ← ((H)(L))
As instruções do 8085 são distribuídas em 5 grupos, cujas características são dadas a seguir:
3. Grupo Lógico - ANDs, ORs, XORs, comparações, rotações, ou complementos de dados em registradores
ou entre memória e um registrador.
Exemplo: ANA r = os conteúdos do acumulador e do registrador r são submetidos ao operador
lógico AND. O resultado é guardado de volta no acumulador.
(A) ← (A) ∧ (r)
5. Grupo de Controle, Pilha, Entrada e Saída - Inclui instruções para manutenção da pilha, leitura de portas,
escritas para portas, setar e ler máscaras de interrupção e setar e limpar flags.
Exemplo: IN porta = O dado de 8 bits presente na porta de entrada indicada é carregado no
acumulador
(A) ← (data)
As instruções apresentadas na tabela anterior estão na forma genérica. Cada uma dessas instruções é
representada por diferentes códigos de operação (OPCODES) para diferentes registradores. Na tabela a seguir as
instruções de transferência de dados são desmembradas em seus diferentes opcodes.
Na tabela a seguir as instruções aritméticas de dados são desmembradas em seus diferentes opcodes.
MNEMÔNICO OPCODE MNEMÔNICO OPCODE MNEMÔNICO OPCODE MNEMÔNICO OPCODE MNEMÔNICO OPCODE MNEMÔNICO OPCODE
ACI Dado8 CE ADD B 80 DAD H 29 DCX D 1B INX B 03 SBB M 9E
ADC A 8F ADD C 81 DAD SP 39 DCX H 2B INX D 13 SBI Dado8 DE
ADC B 88 ADD D 82 DCR A 3D DCX SP 3B INX H 23 SUB A 97
ADC C 89 ADD E 83 DCR B 05 INR A 3C INX SP 33 SUB B 90
ADC D 8A ADD H 84 DCR C 0D INR B 04 SBB A 9F SUB C 91
ADC E 8B ADD L 85 DCR D 15 INR C 0C SBB B 98 SUB D 92
ADC H 8C ADD M 86 DCR E 1D INR D 14 SBB C 99 SUB E 93
ADC L 8D ADI Dado8 C6 DCR H 25 INR E 1C SBB D 9A SUB H 94
ADC M 8E DAA 27 DCR L 2D INR H 24 SBB E 9B SUB L 95
ADD A 87 DAD B 09 DCR M 35 INR L 2C SBB H 9C SUB M 96
DAD D 19 DCX B 0B INR M 34 SBB L 9D SUI Dado8 D6
Obs.: Não se esquecer de que a subtração no 8085 não é feita diretamente. A subtração é feita através de uma
adição com o complementar de 2.
Na operação com complementar de 2 houve um transporte (carry), mas na subtraçao no 8085 a Flag CY é
o complementar do carry, ou seja, CY = 0, como deveria ser o resultado de uma subtração direta.
1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1
+ 0 0 0 0 1 0 0 0 + 0 0 0 0 0 0 0 1
1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0
Carry = 0 CY = 0 Carry = 1 CY = 1
Exemplo: Suponhamos que o acumulador contém o valor 1Bh e a instrução DAA é usada. O resultado depois da
instrução DAA é 21 h.
Exemplo:
Mnemônico Código Comentário
MVI A,09h 3E 09 Carrega acumulador com valor 09h
MVI B,03h 06 03 Carrega registrador B com valor 03h
MVI C,10h 0E 10 Carrega registrador C com valor 10h
LXI D,1234h 11 34 12 Carrega registrador duplo DE com valor 1234h
LXI H,0123h 21 23 01 Carrega registrador duplo HL com valor 0123h
INR A 3C Incrementa 1 ao acumulador. A = 09h + 01h = 0Ah
DCR C 0D Decrementa 1 do conteúdo de C. C = 10h - 01h = 0Fh
INX D 13 Incrementa 1 ao registrador par DE. DE = 1234h + 1h = 1235h
DCX B 0B Decrementa 1 do conteúdo do registrador par BC. BC = 030Fh - 1h = 030Eh
DAD B 09 Adiciona ao registrador par HL o conteúdo do registrador par BC. HL =
0123h + 0310h = 0433h
DAA 27 Corrige para decimal os nibbles inferior e superior do acumulador. Antes: A
= 0Ah. Depois: A = 10h
Exemplo especial: Programa em assembly do 8085 para fazer a adição de dois números com mais de 8 bits
(maiores que 255). Os números são: 452 e 926. 452 decimal = 1C4 h. 926 decimal = 39E h
Obs.: Após a primeira adição (ADD C), a flag auxiliar de carry AC assume o valor 1, porque há transporte do
bit 3 para o bit 4. Também há transporte do bit 7 para o bit 8 (o qual está fora da capacidade do acumulador. A
ilustração da adição acima é mostrada abaixo em decimal, hexadecimal e binário.
Binário
Decimal Hexa
Byte Superior Byte Inferior
1 1 1 1 1 1 1 1 1
4 5 2 1 C 4 1 1 1 0 0 0 1 0 0
9 2 6 3 9 E 1 1 1 0 0 1 1 1 1 0
1 3 7 8 5 6 2 1 0 1 0 1 1 0 0 0 1 0
Obs.: Com exceção dos casos indicados, todas as intruções lógicas afetam as Flags
Mnemônico Simbologia NO de No de Modo de Flags Comentário
Genérico Ciclos Estados Endereçamento Afetadas
ANA r (A) ← (A) ∧ (r) 1 4 registrador todas O conteúdo do acumulador passa por uma operação lógica AND com o
conteúdo do registrador indicado em r. A flag CY é zerada e a flag AC
é setada.
ANA M (A) ← (A) ∧ ((H)(L)) 2 7 indireto por todas O conteúdo do acumulador passa por uma operação lógica AND com o
registrador conteúdo da posição de memória apontada pelo registrador par HL. A
flag CY é zerada e a flag AC é setada.
ANI dado8 (A) ← (A) ∧ (byte 2) 2 7 imediato todas o conteúdo do acumulador passa por uma operação lógica AND com o
dado fornecido no byte 2 da instrução. A flag CY é zerada e a flag AC
é setada.
XRA r (A) ← (A) ∀ (r) 1 4 registrador todas O conteúdo do acumulador passa por uma operação lógica XOR com o
conteúdo do registrador r indicado. As flags CY e AC são zeradas.
XRA M (A) ← (A) ∀ ((H)(L)) 2 7 indireto por todas O conteúdo do acumulador passa por uma operação lógica XOR com o
registrador conteúdo do endereço de memória apontado pelo registrador par HL. As
flags CY e AC são zeradas.
XRI dado8 (A) ← (A) ∀ (byte 2) 2 7 imediato todas o conteúdo do acumulador passa por uma operação lógica XOR com o
dado fornecido no byte 2 da instrução. As flags CY e AC são zeradas.
ORA r (A) ← (A) ∨ (r) 1 4 registrador todas O conteúdo do acumulador passa por uma operação lógica OR com o
conteúdo do registrador indicado em r. As flags CY e AC são zeradas.
ORA M (A) ← (A) ∨ ((H)(L)) 2 7 indireto por todas O conteúdo do acumulador passa por uma operação lógica OR com o
registrador conteúdo da posição de memória apontada pelo registrador par HL. As
flags CY e AC são zeradas.
ORI dado8 (A) ← (A) ∨ (byte 2) 2 7 imediato todas O conteúdo do acumulador passa por uma operação lógica OR com o
dado presente no byte 2 da instrução. As flags CY e AC são zeradas.
CMP r (A) - (r) 1 4 registrador todas Compara o conteúdo do registrador r com o conteúdo do acumulador. Na
operação o conteúdo de r é subtraído do conteúdo de A, sem que o
resultado seja guardado em A. Se o resultado da subtração for zero, ou
seja (A) = (r), a flag de zero Z = 1. Caso contrário, Z = 0. Se (A) < (r), a
flag de carry CY = 1. Caso contrário, CY = 0.
CMP M (A) ← (A) - ((H)(L)) 2 7 indireto por todas Compara o conteúdo da posição apontada pelo par HL com o conteúdo
registrador do acumulador. Na operação o conteúdo da posição apontada por HL é
subtraído do conteúdo de A, sem que o resultado seja guardado em A. Se
o resultado da subtração for zero, ou seja (A) = ((H)(L)), a flag de zero Z
Instruções de Desvio:
Mnemônico Simbologia NO de No de Modo de Flags Comentário
Genérico Ciclos Estados Endereçamento Afetadas
JMP addr (PC) ← (byte 3)(byte 2) 3 10 imediato nenhuma (Jump to address) = O controle é transferido incondicionalmente para a instrução
cujo endereço é dado no segundo e no terceiro bytes da instrução de desvio.
Jcondição addr Se (CCC), então, 2/3 7/10 imediato nenhuma (Jump to address if CCC) = Se a condição indicada for verdadeira o controle é
(PC) ← (byte 3)(byte 2) transferido para a instrução cujo endereço é dado no segundo e no terceiro bytes
da instrução de desvio. Caso a condição seja falsa, o processamento continua
sequencialmente.
JNZ addr Se (CCC), então, 2/3 7/10 imediato nenhuma (Jump if Not Zero) = Desvia para o endereço indicado se o resultado da operação
(PC) ← (byte 3)(byte 2) aritmética anterior a esta instrução não for zero, ou seja, desvia se Z = 0.
JZ addr Se (CCC), então, 2/3 7/10 imediato nenhuma (Jump if Zero) = Desvia para o endereço indicado se o resultado da operação
(PC) ← (byte 3)(byte 2) aritmética anterior a esta instrução for igual a zero, ou seja, desvia se Z = 1.
JNC addr Se (CCC), então, 2/3 7/10 imediato nenhuma (Jump if No Carry) = Desvia para o endereço indicado se a flag de Carry estiver
(PC) ← (byte 3)(byte 2) zerada (CY = 0).
JC addr Se (CCC), então, 2/3 7/10 imediato nenhuma (Jump if Carry) = Desvia para o endereço indicado se a flag de Carry estiver
(PC) ← (byte 3)(byte 2) setada (CY = 1).
JPO addr Se (CCC), então, 2/3 7/10 imediato nenhuma (Jump if Parity Odd) = Desvia para o endereço indicado se a paridade for Ímpar,
(PC) ← (byte 3)(byte 2) ou seja, se a flag de Paridade for zero (P = 0).
JPE addr Se (CCC), então, 2/3 7/10 imediato nenhuma (Jump if Parity Even) = Desvia para o endereço indicado se a paridade for Par,
(PC) ← (byte 3)(byte 2) ou seja, se a flag de Paridade estiver setada (P = 1).
JP addr Se (CCC), então, 2/3 7/10 imediato nenhuma (Jump if Plus) = Desvia para o endereço indicado se o valor no acumulador for
(PC) ← (byte 3)(byte 2) um número positivo, ou seja, tiver o sétimo bit zerado, ou ainda se a flag de Sinal
estiver zerada (S = 0).
JM addr Se (CCC), então, 2/3 7/10 imediato nenhuma (Jump if Minus) = Desvia para o endereço indicado se o valor no acumulador for
(PC) ← (byte 3)(byte 2) um número negativo, ou seja, tiver o sétimo bit setado, ou ainda se a flag de
Sinal estiver setada (S = 1).
CALL addr ((SP) - 1) ← (PCH) 5 18 imediato e nenhuma (Call address) = Chamada de subrotina. O processamento é desviado para o
((SP) - 2) ← (PCL) indireto por endereço indicado em addr, que é dado pelos bytes 2 e 3 da instrução. Antes do
registrador desvio para a subrotina, o endereço da próxima instrução é guardado na pilha. O
(SP) ← (SP) - 2 byte superior do endereço da próxima instrução é guardado na posição SP - 1 da
(PC) ← (byte 3)(byte 2) pilha e o byte inferior é guardado na posição SP - 2 da pilha. Ao final da
subrotina a instrução RET faz o processamento voltar para o programa principal
no endereço que foi guardado na pilha.
Ccondition addr ((SP) - 1) ← (PCH) 2/5 9/18 imediato e direto nenhuma (Call address if CCC is true) = Chamada de subrotina condicional. O
((SP) - 2) ← (PCL) por registrador processamento é desviado para o endereço indicado em addr se a condição
indicada em CCC for verdadeira. O endereço é dado pelos bytes 2 e 3 da
(SP) ← (SP) - 2 instrução. Antes do desvio para a subrotina, o endereço da próxima instrução é
(PC) ← (byte 3)(byte 2) guardado na pilha. O byte superior do endereço da próxima instrução é guardado
na posição SP - 1 da pilha e o byte inferior é guardado na posição SP - 2 da pilha.
Ao final da subrotina a instrução RET faz o processamento voltar para o
programa principal no endereço que foi guardado na pilha.
(a) O conteúdo guardado na pilha é sempre de 16 bits. Assim, o microprocessador normalmente guarda
o conteúdo de PC, que já é de 16 bits, mas o usuário normalmente guarda o conteúdo de
registradores de 8 bits, que então são associados 2 a 2;
(b) Os registradores duplos que podem ser guardados na pilha são PSW (= A + Flags), B (= B + C), D (=
D + E) e H (= H + L);
(c) Para guardar o conteúdo de um desses registradores duplos usa-se a instrução PUSH rp;
(d) Para recuperar o conteúdo que foi guardado na pilha usa-se a instrução POP rp;
(e) Quando uma informação é enviada para a pilha o byte mais significativo é guardado primeiro; isso
significa que o byte menos significativo vai ser retirado primeiro porque o último dado armazenado é
o primeiro a ser retirado;
(f) A pilha do 8085 evolui do maior endereço para o menor, ou seja, a cada vez que uma informação (2
bytes) é enviada para a pilha, o endereço do topo da pilha é reduzido de 2. Ele é acrescido de 2
quando a informação é retirada da pilha;
(g) O apontador de pilha SP aponta sempre para o topo da pilha, mas ele é incrementado de 1 antes de
cada byte ser armazenado.
Observações:
(a) Apesar da região da pilha continuar com o mesmo conteúdo após as instruções POP rp, eles não acessíveis
porque o Apontador de Pilha SP aponta para a posição original, de quando a pilha estava vazia;
(b) POP B vem antes de POP PSW porque a ordem de retirada da pilha é inversa à ordem de armazenagem.
3. Exemplo usando comparação entre registradores (A e B). A operação de comparação e volta é repetida até o
valor de B alcançar o valor 08h, quando então a flag de carry é setada, fazendo o processamento encerrar.
4. Exemplo similar ao anterior, mas usando a instrução JC endereço, ao invés de JNC endereço.
6. Outra versão de programa que faz a multiplicação de 4 por 3. A instrução ADI Dado8 é substituída pela
instrução ADD B. O acumulador vai assumir os valores 00 h, 04 h, 08 h e, finalmente, 0C h, isto é 12
decimal.
8. Programa que gera uma contagem crescente, em hexadecimal, de 00 h a FF h e envia o resultado para a
saída 1.
Obs.: Nesse programa o acumulador inicia com valor 00h e encerra quando o acumulador volta para o valor 00h,
após passar por todos os valores de 00 a FFh.
9. Subrotina de atraso de 1 ms. É feita a suposição de que um programa chama a subrotina denominada atraso,
que é dada logo a seguir. É suposto um tempo de 1μs para cada estado.
_____
_____
CALL atraso
_____
_____
10. Subrotina de atraso de 10 ms. É suposto um tempo de 1μs para cada estado.
4. Explique em poucas palavras como funciona a pilha no 8085. Mostre, através de um mapa de memória, a
evolução da pilha quando se realiza as seguintes instruções, na seqüência mostrada:
PUSH B, PUSH D, ADD B, PUSH PSW, ADD D, POP PSW, OUT 90, POP D, POP B
5. Mostre, através de um mapa de memória, a evolução da pilha quando se executam as seguintes instruções,
na seqüência mostrada:
PUSH PSW, PUSH B, CALL ADIÇÃO, (RET), MOV B, A, POP B, POP PSW
7. Considere o programa abaixo, em mnemônico, e responda as questões a seguir, sabendo que a subrotina no
endereço 0200 h provoca um retardo de 1ms e afeta o registrador B.
8. Escreva um programa que produz um retardo de 1 s, sabendo que o 8085 é acionado por um cristal de 6
MHz.
9. Escreva, a partir do endereço 4050 h, uma sub-rotina que produza um retardo de 0.5 ms, aproximadamente.
Suponha que a freqüência do cristal do 8085 seja 4,096 MHz.
10. Escreva um programa (usando bytes imediatos para os dados) que soma os decimais 500 e 650.
11. Descreva as etapas do ciclo de execução das instruções a seguir e explicar o que ocorre com os sinais de
controle envolvidos e os sinais de endereços e dados:
a) MOV B, M
b) LXI D, 4050 h
c) MOV E, B.
12. Faça o comentário de cada linha do programa abaixo e, a seguir, explique qual a finalidade do programa
completo. Complete os endereços.
Reset
Ícone para
mostrar os
mnemônicos
LEDs para
í
Memória RAM: Chaves para
Endereço, código entrada de dados
em hexadecimal
e mnemônico
Conteúdo da
memória RAM
O simulador conta com todas as possíveis instruções do 8085, cujos mnemônicos são mostrados quando o
ícone "Assembler" é pressionado. Pode também ser mostrado através do "menu" chamado de "ferramentas". Os
mnemônicos, do jeito que aparecem no ABACUS, são mostrados a seguir.
Da mesma forma que o kit didático, o ABACUS tem algumas sub-rotinas já prontas na memória ROM.
No caso do ABACUS são apenas 4, mostradas na tela a seguir, cujo acesso, no ABACUS, é através do "menu"
"Opções".
Nesse momento é interessante refazer o exemplo usado com o kit didático. Três detalhes devem ser
observados:
1. A memória RAM do ABACUS começa no endereço 2000 h, ao invés de 4000 h.
2. Não há necessidade de usar uma subrotina para apagar o display no ABACUS. No kit essa subrotina
é essencial.
3. É fundamental definir a posição da pilha no ABACUS, através do comando LXI SP, xx xx. Caso
contrário, pode ocorrer erros, com o simulador tentando acessar endereço fora da faixa permitida.
Exemplo 1: Faça no ABACUS um programa que executa uma contagem crescente em hexadecimal de 00
h até 60 h.
Exemplo 2: Faça no ABACUS um programa que executa, de forma ininterrupta, uma contagem
hexadecimal crescente de 00h até 60h seguida de uma contagem hexadecimal decrescente de 60h até 00h.
Label Mnemônico
Início LXI SP,2090H
MVI A,00H
SP 2090 h
volta: PUSH PSW
A ← 00 h CALL MOSTRAA
POP PSW
CPI 60H
A←A+1 Mostra A JZ decresce
cresce: INR A
N JMP volta
A = 60 h? decresce: DCR A
S PUSH PSW
CALL MOSTRAA
A←A–1
POP PSW
CPI 00H
Mostra A JZ cresce
JMP decresce
N
A = 00 h?
S
2. Faça no ABACUS um programa que executa uma contagem decrescente em hexadecimal de 60 h até 00 h.
4. Faça no ABACUS um programa que seleciona e mostra no display o maior número contido em uma tabela
inserida na memória. A tabela contém números aleatórios e tem início no endereço 2050h e termine no
endereço 205Fh.
6. Faça no ABACUS um programa que seleciona e mostra no display os números ímpares contidos em uma
tabela inserida na memória. A tabela contém números aleatórios e tem início no endereço 2050h e termine
no endereço 205Fh. Use uma subrotina de atraso com D = 02 h entre os valores mostrados no display.
7. Faça no ABACUS um programa que faz a ordenação em ordem crescente de uma tabela contendo 16
números de 8 bits. Os números já estão na memória a partir do endereço 2050h e devem ser mantidos nessa
faixa de endereços, porém, ordenados.
9. Faça no ABACUS um programa que seleciona e mostra no display os números maiores ou iguais a 20h e
menores que 50h, de uma tabela com 16 números, começando do endereço 2050 h.
Sugestão de tabela: 05h, 15h, 65h, 95h, 35h, 20h, 50h, 42h, 72h, 10h, 60h, 45h, 33h, 25h, 48h, 49h
11. Faça no ABACUS um programa que mostra um número (1 byte), lido pelo teclado, e multiplique este
número por outro número, também obtido pelo teclado, mostrando o resultado no display. O resultado
deverá conter 2 bytes.
12. Faça no ABACUS um programa que leia do teclado uma temperatura em oC (um byte) e converta-a em oF
(graus Farenheit) mostrando o resultado no display. (o programa só deve aceitar temperaturas de entrada de
até 255 graus farenheit, ou seja, um byte na saída). Trabalhar em hexadecimal.
13. Faça no ABACUS um programa que adicione dois números binários de qualquer tamanho (N bytes cada
um). O tamanho dos números binários (N) está na posição 2040 h. Os números começam nas posições 2041
e 2061 (1o byte é o menos significativo). O resultado deve substituir o número que começa na posição 2041.
14. Escrever uma sub-rotina que divida dois números de 8 bits. Os dois números estão nas posições 2050
(dividendo) e 2051 (divisor). O quociente deve ser armazenado na posição 2052 e o resto na posição 2053.
15. Faça no ABACUS um programa que lê um número de 1 byte pelo teclado (dividendo), em seguida lê outro
número de 1 byte pelo teclado (divisor), faz divisão e mostra o quociente no display de endereços e o resto
no display de dados.
16. Faça no ABACUS um programa que lê um número "×" pelo teclado e mostra no display o resultado da
operação 3× + 5.
17. Faça no ABACUS um programa que lê um número "×" pelo teclado e mostra no display o resultado da
operação 5×- 2.
18. Faça no ABACUS um programa que lê um número "×" pelo teclado e mostra no display o resultado da
operação 3(× + 5).
19. Faça no ABACUS um programa que lê um número "×" pelo teclado e mostra no display o resultado da
operação 5(× - 2).
20. O trecho de programa dado abaixo é usado para montar uma tabela de 10 números (cada um com dois
dígitos).
LABEL MNEMÔNICO LABEL MNEMÔNICO
LXI SP,2080h LEITURA: PUSH H
LXI H,2050h CALL LETECLA
MVI C,0Ah RLC
LÊ_PRÓXIMO: CALL leitura RLC
MOV M,A RLC
PUSH H RLC
PUSH B MOV B,A
CALL MOSTRAA CALL LETECLA
POP B ORA B
POP H POP H
INX H RET
DCR C
JNZ LÊ_PRÓXIMO
21. Codifique as instruções dadas a seguir usando o mnemônico do 8085; indique o endereço de cada instrução
e indique o conteúdo dos registradores pedidos e das flags de carry e de zero, após a execução da instrução
indicada.
22. O gráfico a seguir representa a função matemática de um componente não identificado. Escreva em
assembly do 8085 (mnemônico do 8085) um programa para ler um dado de 1 byte pelo teclado e mostrar no
display de dados o resultado da aplicação da função. Use as sub-rotinas necessárias do ABACUS para a
entrada de dados e para mostrar o resultado no display de dados. O programa deve sempre voltar para a
entrada de um novo dado.
Resultado no display
60
30
30 70 Dado de entrada
(a)
Label Mnemônico
S
A < 15 h ?
S
A > 45 h ?
Mostra A
C C–1
(b)
Label Mnemônico
E E+1 A A–B
S
CY = 0?
N
A E
Mostra A
Fim
24. Faça, para executar no ABACUS, um programa que lê um número “x” de 1 dígito pelo teclado e mostra no
display de dados o resultado de x2 – 2.
[1] Ziller, Roberto M., “Microprocessadores – Conceitos Importantes,” Editora do autor, Florianópolis, SC,
2000.
[2] Intel, “MCS-80/85TM Family User´s Manual,” Outubro de 1979.
[3] Malvino, Albert P., “Microcomputadores e Microprocessadores,” Tradução: Anatólio Laschuk, revisão
técnica: Rodrigo Araes Caldas Farias, McGraw-Hill, São Paulo, 1985.
O laboratório de microprocessadores conta com um Kit Didático para realização de experimentos usando
o microprocessador 8085. Esse Kit já possui várias sub-rotinas no programa residente (chamado de programa
monitor). Elas são dadas a seguir, juntamente com uma breve descrição e com os endereços onde elas estão
armazenadas.
O programa a seguir mostra uma contagem hexadecimal crescente de 00 h até FF h no display do Kit
didático. O programa deve ser digitado a partir da posição de memória 4000 h.
O programa a ser executado pelo Kit deve ser digitado através do teclado e deve ser usado o código
hexadecimal de cada instrução. No exemplo anterior aparece uma coluna com os códigos das instruções e com
os dados em hexadecimal. Por exemplo, o código “3Eh” corresponde à instrução “MVI A”; logo a seguir aparece
00 h, que é o dado a ser transferido para o acumulador.
Na instrução seguinte “CALL APDIS”, verifica-se que “CD” é o código da instrução de chamada de
subrotina “CALL”, “A1” o byte menos significativo do endereço da subrotina chamada e “05” é o byte mais
significativo do endereço.
Obs: Em toda instrução que contém endereço ou dado de 16 bits o byte menos significativo é digitado
primeiro.
A figura a seguir ilustra o teclado e o display do Kit didático. Cada uma das teclas do teclado da direita
apresenta 2 ou 3 funções. Uma delas é um dígito hexadecimal, que vai de 0 a F. A outra é uma das funções
explicadas a seguir.
RB, RC, RD, RE, RA e RF Estas teclas permitem visualizar no display de dados o conteúdo dos registradores
B, C, D, E, A e F. Elas devem ser precedidas da tecla XRG. Ou seja, quando se deseja visualizar, por
exemplo, o conteúdo do acumulador (registrador A), usa-se as teclas <XRG> <RA>
SP Permite visualizar o conteúdo do apontador de pilha, ou seja, o endereço atual de armazenagem ou leitura
da pilha. Usa-se as teclas <XRG> <SP>.
M Permite visualizar o conteúdo de memória cujo endereço é dado pelo par HL. Ao digitar-se <XRG> <M>,
o conteúdo dos registradores H e L é mostrado no display de endereços e o conteúdo da posição de memória
correspondente é mostrado no display de dados.
SUB Substitui-se o conteúdo de uma determinada posição de memória por outro byte. Usa-se digitando essa
tecla, seguida do endereço desejado. O conteúdo atual aparece no display de dados quando, então, pode-se
substituído. Em seguida digita-se <EXC>. Resumindo:
<SUB> <endereço>
<novo conteúdo> <EXC>
DSP Permite mostrar (Display) o conteúdo de uma determinada posição de memória. Uso:
<DSP> <endereço desejado>
DNX Permite mostrar no display o conteúdo do próximo endereço de memória, após o uso da tecla DSP.
Usando repetidas vezes essa tecla, pode-se percorrer todo o programa digitado.
DMN Permite mostrar no display de dados o conteúdo de memória do endereço anterior ao atual. É usado da
mesma forma que a tecla DNX.
GO É usada para executar o programa. Uso: <GO> <endereço de início do programa> <EXC>
SST Permite executar o programa passo-a-passo. Uso: <SST> <endereço de início do programa> <NXT>
RST É usada para “ressetar” o programa, ou seja, zerar o conteúdo do contador de programa e de outros
registradores.
Como exemplo, mostra-se como o programa usado na seção anterior é digitado no kit didático.
<INS> <4000>, <3E>, <00>, <CD>, <0B>, <07>, <F5>, <CD>, <A1>, <05>, <F1>, <3C>, <C3>, <02>, <40>
<EXC>
Convém, neste ponto, usar a tecla <RST> para zerar o contador de programa.
Obs.: Somente o endereço inicial é digitado. A cada novo dado digitado o endereço é automaticamente
incrementado.
Obs.: Provavelmente a contagem será tão rápida que não será vista no display porque nenhuma subrotina de
atraso de tempo foi usada.
Sugere-se, como exercício, adicionar uma subrotina de atraso de tempo após a instrução CALL DBYTE.
Usar, por exemplo, DEL 1, cujo endereço é 0770 h. Assim, acrescenta-se essa subrotina CALL DEL 1 da
seguinte forma:
<INS> <4009>, <CD>, <70>, <07>, <F1>, <3C>, <C3>, <02>, <40> <EXC>
Obs.: No kit didático não há como deslocar os comandos que já tinham sido digitados depois da instrução CALL
DBYTE. Assim, todos eles foram digitados novamente após a instrução CALL DEL 1. Observar sempre que
o byte menos significativo de um endereço é digitado primeiro. O endereço 4009 h foi usado porque ele é o
primeiro endereço depois da instrução CALL DBYTE.
É importante ainda frisar como é feita a distribuição de memória no Kit Didático. A memória ROM
consiste em uma pastilha de memória 2716, de 2 kbytes, o que significa 2048 posições de 8 bits cada uma. Sendo
2048 = 800 h, os endereços vão de 000 h até 7FF h. A memória RAM consiste em 6 pastilhas de memória 2114,
de 1 kbyte. Porém, cada posição de memória da pastilha 2114 contém apenas 4 bits, o que torna necessário o uso
de duas a duas para formar 1 byte (8 bits). Em cada conjunto de 2 pastilhas em paralelo o de acesso vai de 000 h
até 3FF h.
A figura a seguir ilustra a distribuição de memória no Kit Didático. Procura-se mostrar a memória do
modo como ela está colocada no kit.
Observar que o último endereço de memória ROM é 07FF h e que o último endereço de memória RAM
é 4BFF h.
EXPERIMENTO 1
Objetivo: Familiarização com o simulador ABACUS e com o kit didático
2. Inclua, após a instrução CALL MOSTRAA, uma subrotina de atraso de tempo com D = 05 h, execute o
programa novamente e observe o aumento no tempo entre cada valor mostrado no display. O trecho a ser
incluído é mostrado a seguir:
Endereço Mnemônico
2009 MVI D, 05
200B CALL DELAY
200E POP PSW
200F INR A
2010 JMP 2005
4. Inclua, após a instrução CALL DBYTE, a subrotina de atraso de tempo DEL 1 (50 ms), execute o programa
novamente e observe o aumento no tempo entre cada valor mostrado no display. O trecho a ser incluído é
mostrado a seguir:
5. Questões do Experimento 1
EXPERIMENTO 2
Objetivo: Familiarização com as instruções de transferência de dados
Roteiro:
1. Codifique as operações dadas na tabela a seguir e insira no ABACUS os mnemônicos resultantes. Depois,
execute cada instrução PASSO-A-PASSO, observando o que ocorre no registrador, ou nos registradores e
posições de memória envolvidas.
2. Complete a tabela dada a seguir, fazendo uma adaptação do que foi feito na tabela anterior. Acrescente os
códigos das operações e insira-os no kit didático. Execute cada instrução PASSO-A-PASSO, observando o
que ocorre no registrador, ou nos registradores e posições de memória envolvidas.
3. Questões do Experimento 2
EXPERIMENTO 3
Objetivo: Familiarização com as instruções aritméticas do 8085
Material: Computador com o simulador ABACUS e kit didático
Roteiro:
1. Codifique as operações dadas na tabela a seguir e insira no ABACUS os mnemônicos resultantes. Depois,
execute cada instrução PASSO-A-PASSO, observando o que ocorre no registrador, ou nos registradores e
posições de memória envolvidas.
Operação End. Mnemônico 2Comentário
(H,L) ← 2050h 2000 LXI H, 2050
((H,L)) ← 10 h 2003
(E) ← 05 h
(A) ← 01 h
(B) ← FF h
(A) ← (A) + (B)
(A) ← (A) + ((H,L)) + CY
(A) ← (A) + 21 h
(A) ← (A) - (E)
(A) ← (A) - (B) - CY
(A) ← (A) - 33 h
(B,C) ← 2F01 h
(B) ← (B) + 1
(C) ← (C) - 1
(B,C) ← (B,C) - 1
2. Complete a tabela dada a seguir, fazendo uma adaptação do que foi feito na tabela anterior. Acrescente os
códigos das operações e insira-os no kit didático. Execute cada instrução PASSO-A-PASSO, observando o
que ocorre no registrador, ou nos registradores e posições de memória envolvidas.
Operação End. Mnemônico Código Comentário
(H,L) ← 4050h 4000 LXI H, 4050 21 50 40
((H,L)) ← 10 h 4003
(E) ← 05 h
(A) ← 01 h
(B) ← FF h
(A) ← (A) + (B)
(A) ← (A) + ((H,L)) + CY
(A) ← (A) + 21 h
(A) ← (A) - (E)
(A) ← (A) - (B) - CY
(A) ← (A) - 33 h
(B,C) ← 2F01 h
(B) ← (B) + 1
(C) ← (C) - 1
(B,C) ← (B,C) - 1
3. Questões do Experimento 3
(a) Qual o conteúdo do registrador “A” após a operação (A) ← (A) + 21 h no ABACUS?
(b) Qual o valor da flag de carry ao final da tabela do ABACUS e do kit didático?
(c) Qual o conteúdo dos registradores A, B, C e D ao final da tabela?
(d) Escreva um programa (usando bytes imediatos para os dados) que soma os decimais 500 e 650.
EXPERIMENTO 4
Objetivo: Familiarização com as instruções lógicas do 8085
Material: Computador com o simulador ABACUS e kit didático
Roteiro:
1. Codifique as operações dadas na tabela a seguir e insira no ABACUS os mnemônicos resultantes. Depois,
execute cada instrução PASSO-A-PASSO, observando o que ocorre no registrador, ou nos registradores e
posições de memória envolvidas.
Operação End Mnemônico Comentário
(A) ← 0F h 2000
(B) EA h
(C) ← 52 h
(A) ← (A) ∧ (C)
(H,L) ← 2040 h
((H,L)) FF h
(A) ← (C) ∧ ((H,L))
(A) ← (A) ∨ 44 h
(A) ← (A) ∀ 23 h
(A) – 33 h
(An+1) ← (An)
(A0) ← (A7)
(CY) ← ( CY )
(A) - (B)
2. Complete a tabela dada a seguir, fazendo uma adaptação do que foi feito na tabela anterior. Acrescente os
códigos das operações e insira-os no kit didático. Execute cada instrução PASSO-A-PASSO, observando o
que ocorre no registrador, ou nos registradores e posições de memória envolvidas.
Operação End Mnemônico Código Comentário
(A) ← 0F h 4000
(B) EA h
(C) ← 52 h
(A) ← (A) ∧ (C)
(H,L) ← 4040 h
((H,L)) FF h
(H,L) ← 0000 h
(A) ← (C) ∧ ((H,L))
(A) ← (A) ∨ 44 h
(A) ← (A) ∀ 23 h
(A) – 33 h
(An+1) ← (An)
(A0) ← (A7)
(CY) ← ( CY )
(A) - (B)
3. Questões do Experimento 4
(a) Qual o conteúdo final dos registradores A, B, C, H e L no ABACUS?
(b) Qual o valor final das flags de carry CY e de zero, no ABACUS, após a instrução de comparação (A) – 33
h? E o conteúdo de A?
(c) Qual o conteúdo das flags de carry CY e de zero Z, no kit didático, após a instrução de comparação (A) –
(B)? E o conteúdo de A?
EXPERIMENTO 5
Objetivo: Programação com o assembly do 8085
Material: Computador com o simulador ABACUS
Roteiro:
1. O programa a seguir gera os múltiplos de 4, a partir de 4 até 20 h. Esses valores são armazenados na
memória a partir do valor dado para HL. Insira os mnemônicos no ABACUS e execute o programa.
Observe o resultado.
Label Mnemônico Label Mnemônico
INÍCIO
LXI SP, 2090 h POP B
LXI H, 2050 h INX H
MVI C,01 h INR C
MVI B,04 h JMP volta A ← 00 h
volta: MVI A,00 h fim: HLT
PUSH B
CALL produto produto: ADD B P1 ← A
MOV M,A DCR C A←A+1
CPI 20h JNZ subrotina
JNC fim RET
2. O programa a seguir é uma nova versão do programa anterior incluindo a subrotina para mostrar os
múltiplos de 4 no display de dados e retirando as instruções para armazenamento na memória.
Label Mnemônico Label Mnemônico
LXI SP, 2090 h JNC fim
MVI C,01 h POP B
MVI B,04 h INR C
volta: MVI A,00 h JMP volta
PUSH B fim: HLT
CALL produto
PUSH PSW produto: ADD B
CALL MOSTRAA DCR C
POP PSW JNZ subrotina
CPI 50h RET
3. O programa a seguir é uma nova versão dos programas anteriores, onde o número para o qual se deseja os
múltiplos é inserido através do teclado.
Label Mnemônico Label Mnemônico
LXI SP, 2090 h JNC fim
MVI C,01 h POP B
CALL LETECLA INR C
MOV B,A JMP volta
volta: MVI A,00 h fim: HLT
PUSH B
CALL produto
PUSH PSW produto: ADD B
CALL MOSTRAA DCR C
POP PSW JNZ subrotina
CPI 50h RET
4. Questões do Experimento 5
(a) Por que foram usadas as instruções PUSH B e POP B no primeiro programa?
(b) Por que foram usadas as instruções PUSH PSW e POP PSW no segundo e no terceiro programas?
(c) Observando o programa durante a execução, verifica-se que ele vai ficando mais lento na medida em que os
múltiplos maiores vão sendo mostrados. Por que isso acontece?
(d) Você pode sugerir uma maneira de resolver o problema citado no item anterior?
(e) Qual a finalidade da instrução CPI 50 h no segundo e no terceiro programas?
EXPERIMENTO 6
Objetivo: Programação com o assembly do 8085
Material: Computador com o simulador ABACUS e kit didático
Roteiro:
N S
A = 00h ?
2. O programa a seguir é uma nova versão do programa anterior, mas com contagem em decimal que vai de
00 a 99 e volta para 00, de forma ininterrupta.
Label Mnemônico Label Mnemônico
LXI SP, 2090 h decresce: PUSH PSW
MVI A,00 h CALL MOSTRAA
cresce: PUSH PSW POP PSW
CALL MOSTRAA ADI 99 h
POP PSW DAA
ADI 01 h CPI 00 h
DAA JNZ decresce
CPI 99 h JMP cresce
JNZ cresce HLT
3. O programa a seguir é uma adaptação do programa anterior (contagem decimal) para ser executado no kit
didático. Codifique o programa e insira-o no kit didático.
Label Mnemônico Código Label Mnemônico Código
LXI SP, 4090 h decresce: CALL APDIS
MVI A,00 h PUSH PSW
cresce: CALL APDIS CALL DBYTE
PUSH PSW CALL DEL1
CALL DBYTE POP PSW
CALL DEL1 ADI 99 h
POP PSW DAA
ADI 01 h CPI 00 h
DAA JNZ decresce
CPI 99 h JMP cresce
JNZ cresce HLT
4. Questões do Experimento 6
(a) Por que a instrução INR A foi substituída pela instrução ADI 01 h no programa 2?
(b) Por que foi usada a instrução ADI 99 h nos programas 2 e 3, ao invés de DCR A, como no programa 1?
(c) Por que foi usada a instrução CALL APDIS no programa 3?
(d) Por que foi usada a instrução CALL DEL1 no programa 3?
(e) Substitua a instrução CALL DEL1 por CALL DEL2 e observe o efeito?
EXPERIMENTO 7
Objetivo: Programação com o assembly do 8085 e uso de INTERRUPÇÕES
Material: Computador com o simulador ABACUS e kit didático
1. Execute os programas dados a seguir usando o simulador ABACUS e usando o módulo didático.
Programa 1: Usa subrotinas para gerar de forma ininterrupta uma sequência crescente de 00 h a FF h no display
de dados, seguida de uma seqüência decrescente (FF h a 00 h). Complete os códigos.
Programa 2: Adapte o programa 1 para que a contagem crescente seja chamada através da interrupção RST 7.5 e
a contagem decrescente seja chamada pela interrupção RST 6.5. Desabilite a interrupção RST 5.5.
crescente: DI F3 crescente: DI F3
PUSH PSW F5 PUSH PSW F5
CALL MOSTRAA CD 6E 03 CALL APDIS CD 0B 07
MVI D,01h 16 01 CALL DBYTE CD A1 05
CALL DELAY CD F1 05 CALL DEL1 CD 70 07
POP PSW F1 POP PSW F1
CPI FF FE FF CPI FF FE FF
RZ C8 RZ C8
INR A 3C INR A 3C
JMP crescente C3 ___ ___ JMP crescente C3 ___ ___
decresc: DI F3 decresc: DI F3
DCR A 3D DCR A 3D
PUSH PSW F5 PUSH PSW F5
CALL MOSTRAA CD 6E 03 CALL APDIS CD 0B 07
MVI D,01h 16 01 CALL DBYTE CD A1 05
CALL DELAY CD F1 05 CALL DEL1 CD 70 07
POP PSW F1 POP PSW F1
CPI 00 FE 00 CPI 00 FE 00
RZ C8 RZ C8
JMP decresc C3 ___ ___ JMP decresc C3 ___ ___
20CB h: JMP decresc C3 ___ ___ 4BDA h: JMP decresc C3 ___ ___
20CE h: JMP crescente C3 ___ ___ 4BD7 h: JMP crescente C3 ___ ___
Perguntas:
2. Quais os comandos a serem usados para bloquear a interrupção RST 7.5 e usar a interrupção RST6.5
para a contagem crescente e a RST 5.5 para a contagem decrescente?
[1] Ziller, Roberto M., “Microprocessadores – Conceitos Importantes,” Editora do autor, Florianópolis, SC,
2000.
[2] Intel, “MCS-80/85TM Family User´s Manual,” Outubro de 1979.
[3] Digibyte, “Manual do Usuário do Kit Didático KMD85”, Abril de 1984.
O 8085 tem 8 instruções de recomeço por software (restart), que são: RST 0, RST 1, RST 2, RST 3,
RST 4, RST 5, RST 6 e RST 7. Estas instruções são para chamadas de subrotinas que são usadas com
frequência. O efeito de uma instrução RST é o mesmo de uma chamada de subrotina, com uso da pilha para
guardar o endereço de retorno. A diferença é que cada instrução RST desvia o processamento para um endereço
predeterminado, como mostra a tabela abaixo. Um outro detalhe é que a chamada de uma RST é feita com
apenas 1 byte de código, ao contrário de uma chamada de subrotina normal, que é feita com 3 bytes de código.
Do mesmo modo que no caso de uma subrotina comum, quando uma instrução RET é encontrada o
processamento volta para o programa principal.
INSTRUÇÕES DE RECOMEÇO
Instrução Efeito Código de Posição do Vetor
Operação
RST 0 CALL 0000h C7 0000h
RST 1 CALL 0008h CF 0008h
RST 2 CALL 0010h D7 0010h
RST 3 CALL 0018h DF 0018h
RST 4 CALL 0020h E7 0020h
RST 5 CALL 0028h EF 0028h
RST 6 CALL 0030h F7 0030h
RST 7 CALL 0038h FF 0038h
Verifica-se da tabela acima que há apenas 8 posições (8 bytes) disponíveis para cada instrução de
recomeço. Sendo assim, normalmente essas posições vetoradas são usadas apenas para desviar para uma
subrotina que é frequentemente usada e que não caberia em apenas 8 posições. Uma instrução de desvio
incondicional JMP addr é então usada. A chamada da subrotina através de uma dessas instruções de recomeço é
mais eficiente que a chamada direta da subrotina.
6.2 Interrupções
Além das 8 instruções de recomeço por software, o 8085 possui 4 instruções de recomeço por hardware
(Interrupções Externas). Essas instruções são chamadas de TRAP (pino 6), RST 7.5 (pino 7), RST 6.5 (pino
8) e RST 5.5 (pino 9). Quando qualquer desses pinos é ativado, os circuitos internos do 8085 produzirão uma
chamada de subrotina ( CALL ) por hardware que desviarão o processamento para o endereço predeterminado. A
tabela das posições de recomeço por hardware (interrupções externas) é dada a seguir.
As operações de entrada e saída por interrupção usam uma das interrupções por hardware dadas na tabela,
de forma que, quando o periférico está pronto para a transferência de dados a interrupção selecionada é acionada,
permitindo a transferência de dados de uma forma mais rápida que a transferência Programada.
Interrupções do 8085
Instrução Efeito Código Posição Pino
de Operação do Vetor
TRAP CALL 0024h não tem 0024 h 6
RST 5.5 CALL 002Ch não tem 002C h 9
RST 6.5 CALL 0034h não tem 0034 h 8
RST 7.5 CALL 003Ch não tem 003C h 7
As interrupções externas tem uma ordem de prioridade, de forma que, no caso de dois ou mais pedidos
simultâneos de interrupção, a ordem de atendimento é:
8085
Ativada apenas por Nível RST 6.5
TRAP - acionada simultaneamente por nível e por transição. É usada para eventos catastróficos tais
como falhas na alimentação elétrica e erros de paridade.
RST 7.5 - acionada por transição somente
RST 6.5 - acionada apenas por nível
RST 5.5 - acionada apenas por nível
INTR - acionada apenas por nível. Essa interrupção em particular, permite a expansão da capacidade
de interrupções do 8085. Através desse pino um dispositivo de suporte pode ser usado para
aumentar os pinos de interrupção.
RESET IN
Pino 36
RECONHECIMENTO
DE TRAP
No circuito da Fig. 6.2 o sinal alto de clock habilita a porta AND na saída do Flip-Flop, enquanto que a
transição do clock do nível baixo para o nível alto faz com que a saída do Flip-Flop assuma o valor 1 e,
consequentemente, a saída geral do circuito da interrupção TRAP assume o valor 1, fazendo com que o
processamento seja desviado para o endereço 0024 h.
Um sinal baixo no pino RESET IN ou um sinal alto de RECONHECIMENTO DE TRAP limpa o pedido
de interrupção.
A Fig. 6.3 mostra os circuitos para as interrupções RST 7.5, RST 6.5 e RST 5.5. Observe que as portas
AND de saída dos circuitos das interrupções tem três entradas. O sinal IE estando alto, todas as interrupções
estão habilitadas. Esse sinal fica alto quando a instrução EI (entrada do flip-flop) é executada. Se nenhuma das
interrupções estiver com máscara, então os sinais M7.5, M6.5 e M5.5 permanecem em nível baixo e,
consequentemente as respectivas entradas das portas AND estarão altas. Dessa forma, todas as interrupções
estarão aptas a serem acionadas.
Um pulso ascendente (transição do nível baixo para o nível alto) no pino 7 faz com que a saída I7.5 do
flip-flop correspondente à interrupção RST 7.5 fique alta, acionando essa interrupção.
Um nível alto no pino 8 faz com que a interrupção RST 6.5 seja executada e um nível alto no pino 9 faz
com que a interrupção RST 5.5 seja executada. Os sinais I7.5, I6.5 e I5.5 quando estão em nível alto indicam que
há interrupção pendente.
Um sinal R7.5 alto limpa uma interrupção RST 7.5 pendente. Um sinal de Reconhecimento de
interrupção RST 7.5 também faz com que a saída do flip-flop seja zerada, limpando qualquer interrupção RST
7.5 pendente.
O bloqueio total das interrupção mostradas na Fig. 6.3 pode ser feito de três maneiras distintas: (a) através
da instrução DI (Desable Interrupt), que desabilita todas as interrupções, com exceção da TRAP; (b) através de
um sinal alto no pino 36 (RESET IN) ou (c) através de um sinal alto de reconhecimento de qualquer interrupção.
1 I 7.5
D Q
Pino 7
Flip-flop
RST 7.5
R 7.5 CLR
RECONHECIMENTO
DE RST 7.5
EI IE
DI S Q
Flip-flop
RESET IN R
QUALQUER RECONHECIMENTO
DE INTERRUPÇÃO
Fig. 6.3: Circuitos das interrupções RST 7.5, RST 6.5 e RST 5.5
A setagem de máscara também é mostrada na Fig. 6.3. Verifica-se que um sinal alto MSE (Mask Set
Enable) é necessário para habilitar qualquer das máscaras de interrupção. A partir daí, desejando-se mascarar
(não permitir a execução) a interrupção RST 7.5, o sinal M7.5' deve ser levado ao nível alto. Desejando-se
mascarar a interrupção RST 6.5 o sinal M6.5' deve estar em nível alto. E, finalmente, se a interrupção que se
deseja mascarar é a RST 5.5, o sinal M5.5'deve ficar em nível alto.
SÍMBOLO SIGNIFICADO/COMENTÁRIO
I7.5, I6.5, I5.5 Interrupções Pendentes - assumem valor 1 quando há interrupção pendente
IE Flag que indica (com valor 1) quando as interrupções estão habilitadas
M7.5, M6.5 e M5.5 Máscaras de Interrupção (Sinal baixo habilita as portas AND) - podem
desabilitar uma interrupção pendente. Sinal alto interrupção bloqueada
RST 7.5, RST 6.5 e RST 5.5 interrupções mascaráveis podem ser bloqueadas via software
TRAP não é mascarável nem passível de habilitação/desabilitação por EI/DI
EI Enable Interrupt - Instrução usada para habilitar todas as interrupções, exceto a
TRAP. Ativo alto.
DI Disable Interrupt - Instrução que Desabilita as Interrupções, exceto a TRAP
(baixo)
MSE Mask Set Enable - Habilita a setagem de máscara. Quando alto as máscaras
M7.5', M6.5' e M5.5' podem ser reconhecidas
RESET IN \ A inicialização do sistema desabilita as interrupções pendentes e zera o flip-flop
da TRAP
QUALQUER Quando qualquer das interrupções é atendida, um sinal alto desabilita as
RECONHECIMENTO DE interrupções pendentes, menos a TRAP, evitando que a interrupção em
INTERRUPÇÃO execução seja interrompida.
SIM Set Interrupt Mask - Instrução que seta as máscaras de interrupção, fazendo
com que determinada interrupção não seja ativada.
RIM Read Interrupt Mask - Intrução que lê o estado das máscaras das interrupções.
Embora os endereços de desvio sejam os indicados na Fig. 6.2 e 6.3, os endereços de desvio no ABACUS
e no kit didático são diferentes. Na verdade, como o usuário final não pode inserir instruções/dados na ROM do
ABACUS nem do kit didático, o criador dessas ferramentas incluiu no programa monitor uma instrução de
desvio para a RAM, de forma que a cada interrupção o programa seja automaticamente desviado para um
endereço acessível pelo usuário final. Esses endereços são dados na tabela a seguir.
Observações.:
(a) É comum usar a instrução EI como penúltima instrução de uma subrotina, tendo em vista que o
microprocessador automaticamente desabilita todas as interrupções com o bit QUALQUER
RECONHECIMENTO DE INTERRUPÇÃO.
Subrotina: -----------
EI
RET
(b) Quando se deseja evitar que uma parte do programa principal seja interrompida por qualquer interrupção,
exceto a TRAP, usa-se o comando DI no começo do trecho a ser protegido.
Programa principal: -----------
------------
DI
------------
------------
EI
Exemplo:
O programa a seguir, a ser implementado no ABACUS, a cada interrupção RST 5.5, mostra uma
contagem hexadecimal crescente de 00 h até FF h e dá mais um passo e pára em 00 h.
Setagem de Máscara
Habilita Saída Serial
da Saída Serial
Irrelevante
Exemplo: Desejando-se habilitar apenas a interrupção RST 5.5 e mascarar as demais, o conteúdo do
acumulador antes da instrução SIM é dado a seguir:
A execução do comando RIM (Read Interrupt Mask) faz com que o estado das máscaras de interrupção
sejam transferidos para o acumulador.
A seguir é mostrado o significado de cada bit do acumulador após a execução da instrução RIM. É
também dado um exemplo, onde é mostrado o conteúdo do acumulador e a interpretação de cada bit, após a
execução da instrução RIM.
Habilita
Serial Input Data - Dado de
-
Interrupt Enable
Entrada Serial
Interrupção
Exemplo: Após a instrução RIM o conteúdo do acumulador ficou:
Significado:
INTR
Controlador
Microprocessador de
INTA
Interrupção 8 pedidos de
8085 interrupção
Dados 8259
1. O nível lógico de um ou mais dos pinos IR (IR0 a IR7) é levado a 1, setando o correspondente registrador de
pedido de interrupção IRR;
2. O 8259 envia um pulso alto para o 8085 através do pino INTR (pino 10);
3. O 8085 envia de volta um sinal baixo INTA (Interrupt Acknowledge) de reconhecimento de pedido de
interrupção;
4. Após receber o sinal de OK, o 8259 o bit ISR (In Service Register) do pedido de maior prioridade, limpa o
registro de interrupção IRR correspondente e envia para o 8085 o código de chamada de subrotina;
5. O 8085 responde com outro sinal INTA baixo solicitando o byte inferior do endereço da subrotina;
6. O 8259 envia o byte inferior de endereço correspondente ao pedido de interrupção;
7. Um outro sinal INTA baixo é enviado pelo 8085 solicitando o byte superior do endereço da subrotina;
8. O 8259 envia o byte superior do endereço da subrotina para o 8085 e, em seguida, limpa o bit ISR
correspondente;
9. A seguir, o conteúdo do contador de programa (PC) é enviado para a pilha e o processamento é desviado
para o endereço indicado
• Comunicação Serial: quando é enviado um bit de cada vez. É empregada, por exemplo, na comunicação via
linha telefônica (através de um modem), no mouse, câmara fotográfica digital, impressora serial,
instrumentos eletrônicos, agendas eletrônicas. A taxa de transmissão é medida em bit por segundo (bps ou
bit/s).
• Comunicação Paralela: quando é enviado um grupo de bits, simultaneamente. É empregada, por exemplo,
na comunicação entre um computador e uma impressora paralela. A taxa de transmissão é, em geral, medida
em bytes por segundo; OBS: a transmissão paralela é utilizada em substituição à transmissão serial quando a
distância entre transmissor/receptor é pequena e deseja-se maior velocidade de transferência.
MÉTODOS DE CONTROLE DE ENTRADA E SAÍDA
Referem-se a técnicas de hardware e software utilizadas para controlar o fluxo de dados entre o
computador e seus periféricos. Os três métodos mais frequentemente encontrados são:
Microprocessador
bit 7
8 bits Porta 11 h STATUS
8085
Nesse exemplo, quando a CPU está pronta para receber dados ela envia um bit alto de INÍCIO (bit 6) para
o periférico. Quando os dados estão prontos, um bit alto de STATUS (bit 7) é enviado de volta à CPU. Em
seguida os dados são transferidos do periférico para a CPU. O grande problema nesse tipo de transferência de
dados é que a CPU fica aguardando o bit alto de STATUS, o que pode significar um tempo considerável, uma
vez que a maior parte do tempo é gasto esperando o periférico terminar o processamento de dados.
Nesse exemplo a CPU não precisa aguardar o processamento do periférico. Quando o periférico está
pronto para transferir ou receber os dados um bit de INTERRUPÇÃO é enviado à CPU. O processamento
normal da CPU é interrompido para atender o pedido externo. Um bit de RECONHECIMENTO de interrupção é
enviado para o periférico, havendo então a transferência dados para a CPU.
HOLD
MEMÓRIA
Nesse tipo de operação as transferências de dados são mais rápidas porque o acumulador não é utilizado e
não há necessidade de leituras da memória ROM. O dados vão diretamente da memória para o periférico, ou
vice-versa. O controlador de DMA é fisicamente conectado aos barramentos de dados, endereços e controle,
dependendo apenas da liberação dos mesmos pela CPU. Dessa forma, quando o periférico está pronto para a
transferência de dados, um sinal de HOLD alto é enviado à CPU solicitando a liberação do barramentos. A CPU
responde com um sinal HLDA, informando que o processamento foi interrompido e os barramentos liberados. O
controlador de DMA realiza então a transferência de dados em alta velocidade e devolve o controle dos
barramentos para a CPU, enviando um sinal de HOLD baixo.
25. Explique como funciona uma interrupção no 8085. Explique habilitação e máscara de interrupção,
interrupção vetorada, interrupção por nível, interrupção por transição. Exemplifique escrevendo as linhas de
programa para mascarar as interrupções RST 5.5 e RST 7.5.
26. Para que servem as instruções EI e DI? Descreva as instruções SIM e RIM.
28. Insira os bits adequados do acumulador para mascarar a interrupção RST 6.5 e deixar as demais livres.
29. Faça a leitura do acumulador mostrado abaixo, após uma instrução RIM.
30. Zerar o flip-flop da interrupção RST 7.5, setar e habilitar as interrupções RST 7.5 e RST 6.5 e mascarar a
interrupção RST 5.5. Comente o valor de cada bit utilizado na instrução de setagem de máscara. Desenhe
um circuito simples com fototransistor que possa ser usado para acionar a interrupção RST 7.5 com a
interrupção de um sinal luminoso.
31. Faça um programa no ABACUS, usando o assembly do 8085, que mostre uma contagem decimal crescente
no display de zero a 50. Ao alcançar o valor 50, a interrupção RST 7.5 deve ser habilitada e o programa
deve ficar aguardando um pedido de interrupção. Quando a interrupção RST 7.5 for solicitada, a contagem
no display deve se tornar decrescente (e a interrupção desabilitada) até alcançar o valor zero. Alcançado o
valor zero, a interrupção deve ser habilitada novamente para iniciar outra contagem decimal até 50, e assim
sucessivamente.
32. Faça um programa no ABACUS que mostre uma contagem decimal no display, sendo que esta contagem
deve ser crescente até que ocorra uma interrupção RST 6.5, quando então a contagem deverá se tornar
decrescente. Caso ocorra uma nova interrupção RST 6,5 o programa deve voltar a contar na forma
crescente, ou seja, a cada interrupção muda-se o modo de contagem alternando entre crescente e
decrescente.
33. Como é feita a comunicação entre o microprocessadore 8085 e o controlador de interrupção 8259?
35. Faça um programa no ABACUSusando a linguagem assembly do 8085 que mostre um valor zero no display
enquanto aguarda um pedido de interrupção RST 6.5. Ocorrida a interrupção, o programa deve fazer uma
contagem decimal crescente no display de zero a 60, sem interrupções. Ao alcançar o valor 60, o programa
deve ficar esperando um pedido de interrupção RST 7.5. Ocorrida a interrupção, o programa deve fazer uma
contagem decimal decrescente no display até zero. A contagem deve se repetir caso ocorra novamente a
interrupção RST 6.5 e, depois, a RST 7.5.
36. Faça o comentário de cada linha do programa a seguir e explique qual a finalidade do programa completo.
Complete os endereços.
37. É mostrado a seguir o que representa cada bit do acumulador quando se deseja mascarar interrupções.
Escreva as instruções para mascarar as interrupções RST7.5 e RST6.5, em seguida, habilitar a RST5.5.
(a) Programa principal: Escreva as instruções para habilitar as chaves do ABACUS como entrada de dados
e os LEDs como saída de dados, mascarar as interrupções RST6.5 e RST5.5, habilitar a interrupção
RST7.5 e ficar aguardando num "loop" um pedido de interrupção;
(b) Subrotina: Escreva uma subrotina para rotacionar, de dois em dois (0-1, 1-2, 2-3, …, 6-7), os LEDs para
a esquerda, quando há um pedido da interrupção RST7.5. O processamento volta para o "loop" quando
forem alcançados os LEDs 6 e 7.
[1] Ziller, Roberto M., “Microprocessadores – Conceitos Importantes,” Editora do autor, Florianópolis, SC,
2000.
[2] Intel, “MCS-80/85TM Family User´s Manual,” Outubro de 1979.
[3] Malvino, Albert P., “Microcomputadores e Microprocessadores,” Tradução: Anatólio Laschuk, revisão
técnica: Rodrigo Araes Caldas Farias, McGraw-Hill, São Paulo, 1985.
A entrada de dados seriais para o 8085 pode ser feita através do pino 5 do microprocessador, que é o
pino SID (Serial Input Data). Os dados seriais que chegam a esse pino são transferidos para o bit 7 do
acumulador a cada execução da instrução RIM.
O pino 4, SOD (Serial Output Data) pode ser usado para a transferência serial de dados para um
periférico. Nesse caso, a instrução SIM é usada para transferir o conteúdo do bit 7 do acumulador para o pino 4,
mas apenas se o bit 6 do acumulador, SOE (Serial Output Enable) estiver setado.
O programa acima repete o Laço 8 vezes, recebendo, portanto 8 bits para formar um byte. Esses bits
chegam através do pino SID, que é transferido para o bit 7 do acumulador. Cada novo bit que é carregado é
isolado através da instrução ANI 80 h. A seguir, esse novo bit é "juntado" (usando a instrução ORA B) aos bits
anteriores que já estão guardados em B. O acumulador, nesse momento contém todos os bits lidos. A rotação à
direita é necessária para receber um novo dado no bit 7. O conteúdo rotacionado do acumulador é guardado em
B.
Supondo, por exemplo, que os bits 1 1 0 0 0 0 1 e 0 são carregados no 8085 usando o programa
anterior, tem-se:
Na primeira execução de MOV B,A o conteúdo de B será 0 1 0 0 0 0 0 0, porque o primeiro dado
(1) foi recebido no bit 7 do acumulador, mas foi rotacionado à direita antes da transferência para B.
Após a segunda execução de MOV B,A o conteúdo de B será 0 1 1 0 0 0 0 0.
Após a oitava execução de MOV B,A o conteúdo de B será 1 0 1 0 0 0 0 1. Vê-se aqui que o
primeiro dado (1) a ser carregado já voltou para o bit 7 de B, sendo, portanto necessário fazer uma rotação à
esquerda para encerrar o primeiro byte de entrada. Assim, após sair do Laço, e após a instrução RLC, o conteúdo
do acumulador (mas não o de B) conterá o byte de entrada, que é: 0 1 0 0 0 0 1 1. A leitura foi feita do bit
menos significativo para o bit mais significativo.
Os microcomputadores atuais utilizam uma pastilha especial para a comunicação serial. Os primeiros
PCs usavam o CI 8250:UART (Universal Asynchronous Receiver-Transmitter), que permitia o armazenamento
de apenas um byte por vez, limitando a velocidade de comunicação serial. Atualmente o CI utilizado é o 16550,
que permite o armazenamento simultâneo de até 16 bytes de informação. A seguir são dadas as características da
Interface Serial no PC:
• Possui 2 interfaces seriais;
• São interfaces assíncronas;
• São baseadas no CI 16550 UART (Universal Asynchronous Receiver /Transmiter); Este CI é um upgrade do
CI 8250 da National utilizado PC original (com taxa de transmissão máxima de 9.600bit/s);
• Características do CI 16550 UART:
⇒ Taxa de transmissão de até 115.200bit/s;
⇒ FIFO de 16 bytes; Esta FIFO armazena dados que foram recebidos pela interface serial mas que
não foram lidos pelo microprocessador; evita erro de overrun (perda de informação por
sobreescrita);
⇒ Função Loopback (diagnóstico);
⇒ Funções para controle de modem.
A placa mãe de um microcomputador Pentium possui 2 interfaces seriais: cada uma delas pode ser
configurada de duas formas:
Processo de comunicação no qual os caracteres são enviados independentemente uns dos outros.
Uma das aplicações mais comuns deste tipo de comunicação é na interface entre teclado e computador.
Neste circuito cada tecla gera um código ASCII de 7 bits que é transmitido bit a bit para o computador por
intermédio de dois ou três condutores. Para verificar a eficiência deste tipo de transmissão serial deve-se
observar o desempenho de um bom digitador: sabe-se que ele não supera uma taxa de 60 palavras por minuto
(cerca de 8 caracteres/seg). Logo a transmissão serial, relativamente lenta, é aceita neste caso.
Observe uma característica importante nesta interface: em alguns momentos a porta serial será utilizada
para transferir dados a uma taxa de 10 a 20 caracteres/seg, em outros esta pode cair para 1 ou 2 caracteres/seg, e
ainda, em grande parte do tempo, o teclado não é utilizado chegando a uma taxa de zero caracteres/seg. Por
causa deste tipo de característica de transmissão de dados, um protocolo de comunicação assíncrono deve ser
estabelecido entre estes dispositivos.
A técnica aceita para comunicação serial assíncrona é a de segurar a linha de saída da transmissão serial
no nível lógico 1 (marca) até que chegue dados para transmissão. Cada caracter será iniciado com um nível
lógico 0 (start bit). Este 1o bit, o start bit, é utilizado para sincronizar a transmissão e a recepção. O dado é
transmitido colocando-se o bit menos significativo em primeiro lugar após o start bit. No final do dado são
transmitidos stop bits (1, 11/2 ou 2) com nível lógico 1. Opcionalmente pode-se transmitir um bit de paridade
após o MSB do caracter e antes do stop bit (ver figura abaixo: esta figura considera apenas 1 stop bit).
Os bits de start e de stop não carregam informações, e são necessários pela natureza da comunicação
serial assíncrona. Para se configurar uma porta serial vários parâmetros devem ser especificados. Os parâmetros
mais comuns são:
• tamanho do caracter ou bits por caracter (usualmente de 5 a 8 bits);
• stop bits (1, 11/2 ou 2);
• bit de paridade, usado para detectar erros simples: pode ser especificado como ímpar, par ou
nenhum;
• taxa de transmissão, etc.
Uma das considerações que devem ser feitas ao se utilizar a comunicação serial entre periféricos e
computador (ou entre dois computadores) é a seleção de parâmetros de comunicação compatíveis. Um dos
problemas mais comuns é o de configuração de taxas de transmissão distintas entre o transmissor e o receptor.
Processo de comunicação no qual o transmissor e o receptor estão sincronizados pelo mesmo sinal de
clock. O transmissor envia continuamente caracteres de sincronismo sempre que não existir dado a ser
transmitido.
Na transmissão serial assíncrona os bits de start e stop representam um grande overhead nos dados
transmitidos, reduzindo a taxa de transferência de informações. Na transmissão serial síncrona também
necessitamos de um certo tipo de overhead para sincronismo, pois como o receptor saberia quando o dado é
significativo (para recebê-lo e guardá-lo) ?
O start bit (da comunicação assíncrona) é substituído por um caracter de sincronismo. Este caracter diz ao
receptor que os dados estão a seguir. Os dados são transmitidos entre caracteres especiais que servem para
sincronismo e para informar quando iniciam e terminam os dados, para detecção de erros e para indicar o final
do pacote. Veja o formato típico de um pacote de dados no exemplo do protocolo BISYNC logo abaixo:
Com este tipo de transmissão fica claro que o overhead é reduzido: para uma mesma taxa de transmissão,
o modo síncrono será mais rápido que o assíncrono.
Interface RS-232: Interface proposta pela IBM na década de 60 e que vigora até hoje como a principal interface
para transmissão de dados (a baixas velocidades). Esta interface utiliza normalmente um conector DB25
(Conector em forma de "D" com 25 pinos). Pode ainda utilizar o DB9 (usado para conectar o mouse) e o DB15.
Seus circuitos elétricos são desbalanceados (ou seja, há um terra comum para todos os sinais). Quando a
interface RS-232 está inativa ela fica transmitindo Marca (-12V). Seus níveis elétricos são mostrados na tabela
abaixo.
Interface RS-422: Interface que proporciona taxa de transferência de até 10 Mbit/s (para distâncias de até
300m). Seus circuitos elétricos são balanceados (ou seja, cada sinal é transmitido através de um par de
condutores: um positivo e um negativo, o que proporciona maior imunidade ao ruído). Esta interface geralmente
está disponível em conectores DB37.
Como já foi enfatizado anteriormente, o microprocessador 8085 precisa de alguns componentes auxiliares
que, além de conterem memórias ROM e RAM, possibilitem a comunicação do 8085 com ambiente externo.
Dois desses componentes são os Circuitos Integrados 8156 e 8355.
A Fig. 6.2 mostra um sistema mínimo baseado no 8085 e contendo uma pastilha de memória RAM (8156)
e uma de memória ROM (8355).
A13 ALE
CLK OUT
A10 IO-M\
A9 READY
A8 RESET IN\
RESET OUT
8 bits: AD0 a AD7 RD\
8085 WR\
CE A10 CE1\
A9
ALE ALE
A8 IO-M\
PA
IO-M\
RD\
RD\ RESET
PB
RESET CLK
READY
PC WR\
8156 PA 8355 PB
No sistema mínimo mostrado na Fig. 7.2 o pino de endereço A13 do 8085 é usado para
habilitar/desabilitar a RAM e a ROM. Ele é conectado ao pino CE (Chip Enable) da RAM e ao pino CE\ da
ROM. Isso significa que, quando o pino A13 está em nível baixo, a ROM fica habilitada e a RAM desabilitada.
Quando em nível alto a ROM fica desabilitada e RAM fica habilitada. Dessa forma, o endereço inicial da ROM é
0000 h e o da RAM é 2000 h, como demonstrado abaixo.
A15 A14 A13 A12 A11 A10 A9 A8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0
Endereço Inicial da ROM
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
Endereço Final da ROM
0 0 0 0 0 1 1 1 1 11 1 1 1 1 1
0 7 F F
Endereço Inicial da RAM
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 0 0
Endereço Final da RAM
0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1
2 0 F F
Como a ROM 8355 tem 2048 bytes (800 h) de memória, as posições ocupadas por estes bytes vão de 0 a
2047, que em hexadecimal é 0000 h até 07FF h. O número de linhas de endereço necessárias são 11 (de AD0 a
A10) , porque 211 = 2048.
Como a RAM 8156 tem apenas 256 bytes de memória, os endereços desses bytes vão de 0 a 255 (00 h a
FF h). Daí, como o endereço inicial escolhido para a memória RAM é 2000 h na conexão do sistema mínimo
dado, o endereço final será 20FF h. O número de linhas de endereço necessárias são 8 (de AD0 a AD7), porque 28
= 256.
A memória RAM do Kit didático usado no laboratório é a RAM 2114, de 1 K de memória, mas de apenas
4 bits. Assim, utiliza-se duas-a-duas para forma 1 byte por endereço. No kit o endereço inicial da RAM é 4000 h.
São necessárias 10 linhas de endereço: 210 = 1024 ( = 400h). Posições de memória: 0 a 1023 (000 h a 3FF h)
A15 A14 A13 A12 A11 A10 A9 A8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0
A Segunda RAM 2114 do Kit didático deve ser acessada a partir do primeiro endereço após a primeira
RAM, ou seja, endereço 4400 h.
A15 A14 A13 A12 A11 A10 A9 A8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0
A Terceira RAM 2114 do Kit didático deve ser acessada a partir do primeiro endereço após a segunda
RAM, ou seja, endereço 4800 h.
A15 A14 A13 A12 A11 A10 A9 A8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0
Endereço Inicial da SEGUNDA RAM 2114 do Kit Didático
0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
4 8 0 0
Endereço Final da SEGUNDA RAM 2114 do Kit Didático
0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1
4 B F F
Dessa forma, um circuito lógico deve ser usado quando há um conjunto de pastilhas de memória no
sistema mínimo. A Fig. 7.3 mostra o circuito lógico para conectar três conjuntos de RAMs.
A14
CS\ RAM 2114
A10 4000h – 43FFh
A11 Primeira RAM
Fig. 7.3: Circuito lógico para conexão de 3 conjuntos de RAMs 2114 ao sistema mínimo
Desejando-se conectar um quarto conjunto de RAMs, tem-se o circuito lógico da Fig. 7.4, a seguir.
A14
CS\ 2 × RAM 2114
A10 4000h – 43FFh
A11 Primeira RAM
Fig. 7.4: Circuito lógico para conexão de 4 conjuntos de RAMs 2114 ao sistema mínimo
A15 A14 A13 A12 A11 A10 A9 A8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0
Desejando-se acrescentar mais 4 conjuntos de RAMs, de forma a ter um sistema mínimo com 8 Kbytes de
memória, precisa-se de mais um pino de seleção, que no caso é o pino A12.
A14
2 × RAM 2114
A10 CS\
A11 4000h – 43FFh
A12 RAM – 1
2 × RAM 2114
ZONAS DE ENDEREÇO PARA A RAM CS\
2114, A PARTIR DE 4000h 4400h – 47FFh
RAM – 2
ZONA BYTES ENDEREÇO
1 1024 4000 – 43FF
2 1024 4400 – 47FF 2 × RAM 2114
3 1024 4800 – 4BFF CS\
4800h – 4BFFh
4 1024 4C00 – 4FFF RAM – 3
5 1024 5000 - 53FF
6 1024 5400 – 57FF
7 1024 5800 – 5BFF 2 × RAM 2114
8 1024 5C00 – 5FFF CS\
4C00h – 4FFFh
9 1024 6000 - 63FF
RAM – 4
10 1024 6400 – 67FF
11 1024 6800 – 6BFF
12 1024 6C00 – 6FFF 2 × RAM 2114
13 1024 7000 - 73FF CS\
5000h – 50FFh
14 1024 7400 – 77FF
15 1024 7800 – 7BFF RAM – 5
16 1024 7C00 – 7FFF
17 1024 8000 - 83FF
2 × RAM 2114
18 1024 8400 – 87FF CS\
19 1024 8800 – 8BFF 5400h – 57FFh
20 1024 8C00 – 8FFF RAM – 6
…
…
… 2 × RAM 2114
CS\
… 5800h – 5BFFh
45 1024 F000 – F3FF RAM – 7
46 1024 F400 – F7FF
47 1024 F800 – FBFF
48 1024 FC00 – FFFF 2 × RAM 2114
Total: 48 Kbytes = 49.152 bytes CS\
5C00h – 5FFFh
RAM – 8
A15 A14 A13 A12 A11 A10 A9 A8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0
Fig. 7.5: Circuito lógico para conexão de 8 conjuntos de RAMs 2114 ao sistema mínimo
As pastilhas 8156 e 8355 não são apenas memórias RAM e ROM; elas também contém portas de entrada
e saída paralela, além de temporizadores.
As três portas de Entrada e Saída da 8156 são: Porta A (8 bits), Porta B (8 bits) e Porta C (6 bits), que são
numeradas respectivamente como 21h, 22h e 23h no sistema mínimo da Fig. 7.2. Internamente, tem-se ainda
acesso a três outras portas: Porta 20h, usada como registrador de status e de comando, Porta 24h, usada como
byte inferior do contador de temporização e Porta 25h, usada como modo e contador (6 bits superiores) do
temporizador.
As duas portas de Entrada e Saída do 8355 são: Porta A (8 bits) e Porta B (8 bits), que são numeradas
respectivamente como 00h e 01h no sistema mínimo da Fig. 7.2. O endereçamento é dado na tabela a seguir:
O temporizador da 8156 possui é decrementador pré-setável, controlado pelas portas 20h, 24h e 25h. O
contador pode operar em 4 modos, mostrados nas figuras a seguir:
Comando D7 D6 D5 D4 D3 D2 D1 D0
Habilitação de interrupção A
Habilita;ão de interrupção B
Temporizador
Porta A
Porta C
Porta B
Modo 00
Modo 01
Modo 10
Modo 11
D7 D6 Estado do Temporizador
0 0 Não opera
0 1 Parar imediatamente
1 0 Parar depois de atingir contagem final
1 1 Começar contagem
Exemplo: Gerar uma onda quadrada de 1 kHz, sendo a frequência de clock de 3 MHz
3MHz
Contagem final = = 3000 = 0BB8 h
1kHz
0 1 0 0 1 0 1 1
Instruções Comentário
MVI A,B8h
OUT 24h
Onda quadrada contínua de 1kHz
MVI A,4Bh
OUT 25h
MVI A,Ceh
Começa contagem e dasabilita interrupções de A e B
OUT 20h
C B A Saída Selecionada
0 0 0 Yo
0 0 1 Y1
0 1 0 Y2
74LS138 0 1 1 Y3
1 0 0 Y4
1 0 1 Y5
1 1 0 Y6
1 1 1 Y7
A saída está ativa quando está em nível zero. A pastilha 74LS138 é habilitada fazendo G1 = 1, G2A = 0,
G2B = 0. Quando qualquer desses pinos está desativado o CI está desabilitado.
Voltando às 8 pastilhas de memória RAM do exercício anterior, pode-se fazer o endereçamento usando
um decodificador 74LS138. O pino A14 é usado para habilitação geral (G1) e os pinos A10, A11 e A12 são usados
para seleção da pastilha correspondente a cada faixa de endereço.
A11 A14
A12 A10
2 × RAM 2114
CS
4000h – 43FFh
\
RAM – 1
2 × RAM 2114
CS\
4400h – 47FFh
RAM – 2
2 × RAM 2114
CS\
4800h – 4BFFh
RAM – 3
2 × RAM 2114
CS\
4C00h–4FFFh
RAM – 4
2 × RAM 2114
CS\
5000h – 50FFh
RAM – 5
2 × RAM 2114
CS\
5400h – 57FFh
RAM – 6
C B A Saída
A12 A11 A10 Selecionada
CS\ 2 × RAM 2114
0 0 0 Yo
0 0 1 Y1 5800h – 5BFFh
0 1 0 Y2 RAM – 7
0 1 1 Y3
1 0 0 Y4
1 0 1 Y5 2 × RAM 2114
1 1 0 Y6 CS\
5C00h– 5FFFh
1 1 1 Y7
RAM – 8
Fig. 7.9: Uso do decodificador 74LS138 para conexão de 8 RAMs ao sistema mínimo
Cada 74LS138 pode endereçar 8 zonas de endereço ⇒ São necessários 6 decodificadores 74LS138 para
cobrir toda a memória possível a partir da posição 4000 h até FFFF h.
(b) Qual a finalidade dos pinos CE, WR e IO/M de uma memória RAM?
(c) Quantas linhas de endereço são necessárias para a ROM e para a RAM?
(d) Conceitue ROM, EPROM, RAM estática e RAM dinâmica
2. Gerar um pulso contínuo na saída do temporizador da pastilha 8156, em uma freqüência de 1 kHz, sabendo
que a freqüência de clock é de 1 MHz. Dê uma sugestão de como o temporizador pode ser usado para a
geração de sinal PWM (Modulação de Largura de Pulso).
3. Explicar para que serve e como é utilizado o decodificador 74139 num sistema com o microprocessador
8085. Esse decodificador tem duas entradas (A e B) e quatro saídas ( Y0 , Y1 , Y2 , Y3 ). Os habilitadores do
CI 74139 são G1 , G2 e G3 , como no caso do CI 74138. Faça um esquema mostrando uma aplicação.
4. Desenhar o circuito de conexão de 4 pastilhas de memória RAM, cada uma de 2 kbytes, a partir do endereço
1000 h, usando o decodificador 74139. Esse decodificador tem duas entradas (A e B) e quatro saídas ( Y0 ,
Y1 , Y2 e Y3 ). O habilitador da memória RAM é o pino CE\. Os habilitadores do CI 74139 são G1, G2 e
G3 , como no caso do CI 74138. Inclua as linhas de endereços / dados.
5. Faça um programa que leia um byte da porta serial e o mostre no display. A cada interrupção RST 7.5 o
programa deverá ler outro byte da porta serial e mostrá-lo no display.
6. Faça um programa que leia um dado do teclado, e então, envie este byte pela saída serial por 5 vezes
seguidas, com um intervalo de 1s entre cada repetição (destas 5 vezes). Em outras palavras, enviar o byte 5
vezes pela porta serial, parar por 1 segundo e tornar a enviar o byte por mais 5 vezes, parar por mais 1s... e
assim por diante. O bit menos significativo deve ser enviado primeiramente.
7. Faça um programa que leia dois números pelo teclado, some estes números e mostre o resultado no display,
repetindo esta operação indefinidamente. Caso ocorra uma interrupção RST 6,5, o programa passará a
subtrair esses números (1o - 2o), mostrando o resultado no display. Após uma nova interrupção RST 6,5 o
programa volta a somar os dois números, e assim sucessivamente. Caso ocorra uma interrupção RST 5,5 o
último resultado mostrado no display deverá ser enviado pelo pino SOD, uma única vez, após o que o
processamento volta ao programa principal.
8. A RAM 2114 é de 1 K, mas possui apenas 4 bits cada uma. Por isso são usadas de duas em duas de modo a
formar 1 byte para cada endereço . Deseja-se associar 4 grupos de RAMs 2114 (ver figura a seguir), de
modo a formar uma memória RAM de 4 Kbytes. Pede-se:
(a) Quais são as linhas de endereço para a operação das RAMs 2114?
(b) Qual a faixa de endereços (endereços contínuos) de cada grupo de RAMs?
(c) Use portas lógicas para desenhar o circuito de habilitação dos grupos de RAMs a partir do endereço
1000h;
(d) Use o decodificador 74139 (figura a seguir) para a habilitação dos grupos de RAMs a partir do endereço
1000h. Os pinos A e B são usados para selecionar a saída e o pino G1 é usado para habilitar a pastilha.
A Y0 \
Linhas de endereço:________________
B Y1 \
74139
Y2 \
A B Y
CS\ CS\ CS\ CS\ 0 0 Y0\
0 1 Y1\
1 0 Y2\
Pinos de habilitação 1 1 Y3\
9. A RAM 2114 é de 1 K, mas possui apenas 4 bits cada uma. Por isso são usadas de duas em duas de modo a
formar 1 byte para cada endereço . Deseja-se associar 4 grupos de RAMs 2114 (ver figura abaixo), de modo
a formar uma memória RAM de 4 Kbytes. Pede-se:
(e) Quais são as linhas de endereço para a operação das RAMs 2114?
(f) Qual a faixa de endereços (endereços contínuos) de cada grupo de RAMs?
10. Faça um programa para o ABACUS com a seguinte característica: Quando a chave CH0 OU a chave CH1
está ligada os LEDs ficam piscando em intervalos regulares. Quando estão desligadas, o programa fica num
loop de espera.
[1] Ziller, Roberto M., “Microprocessadores – Conceitos Importantes,” Editora do autor, Florianópolis, SC,
2000.
[3] Malvino, Albert P., “Microcomputadores e Microprocessadores,” Tradução: Anatólio Laschuk, revisão
técnica: Rodrigo Araes Caldas Farias, McGraw-Hill, São Paulo, 1985.
8. INTERFACE ANALÓGICA
Como os dados de um microprocessador estão na forma digital e os dados do mundo exterior estão na
forma analógica (contínua), é necessário fazer a conversão entre esses dados. Assim, tem-se o Conversor
Analógico-Digital (ADC), que faz a conversão de sinal analógico para sinal digital e o Conversor Digital-
Analógico (DAC), que faz a conversão de sinal digital para sinal analógico.
Estas chaves podem ser substituídas por transistores que trabalharão na região de corte quando D = 0, na
região de saturação quando D = 1.
VREF
I= (1 * D3 + 0.5 * D2 + 0.25 * D1 + 0.125 * D0 ) ,
R
onde os valores de D podem ser 0 para chave desligada e 1 para chave ligada. Assim, forma-se a tabela
abaixo, supondo VREF/R = 1:
Um vez que o conversor tem apenas 4 bits, existem 16 (24) possíveis valores de saída, sendo o menor
valor 0 (zero) e o valor máximo correspondente ao decimal 15, ou binário 1111, e hexadecimal ´F´. A tensão de
saída é dada por Vsaída = Rsaída*I. Os resistores ponderados são necessários para que a saída corresponda à fração
indicada na última coluna da tabela.
máx
incremento
1 LSB
2. Precisão Absoluta: Refere-se a quão próxima cada corrente de saída está de seu valor ideal. A precisão
depende da tolerância dos resistores, do descasamento dos transistores e da tensão de referência.
3. Precisão Relativa: Refere-se a quão próximo cada nível de saída está de sua fração ideal de saída total. A
precisão relativa depende principalmente da tolerância dos resistores ponderados. Se eles forem exatamente
iguais a R, 2R, 4R e 8R no caso do conversor de 4 bits, todos os degraus serão iguais a 1 incremento LSB. Se
os resistores não estiverem corretos os degraus poderão ser maiores ou menores que 1 incremento LSB.
4. Monotonicidade: Um conversor DA monotônico é aquele que produz um aumento na corrente de saída para
cada entrada digital sucessiva, ou seja, cada aumento no sinal de entrada produz um aumento no sinal de
saída. Se os resistores ponderados não estiverem corretos, pode-se ter um conversor não monotônico. O erro
máximo da saída do conversor deve ser de ±1/2 LSB para garantir que o conversor seja monotônico.
5. Tempo de Resolução (ou de Posicionamento): Tempo que a saída do conversor lva para se estabilizar dentro
de 1/2 LSB de seu valor final. Esse tempo depende, dentre outros fatores, das capacitâncias espúrias e do
tempo de retardo de saturação dos transistores.
Para que o conversor seja monotônico a tolerância dos resistores ponderados deve ser inferior à resolução
percentual. Assim, a tolerância dos resistores deve ser no máximo de 6.67% para o conversor de 4 bits e de 0.4%
para o conversor de 8 bits. Portanto, quanto maior o número de bits do conversor, maior a dificuldade de
contrução usando o modelo de resistores ponderados, além da difuldade com os diferentes valores. A solução
encontrada foi o modelo da Escada R-2R, mostrado na Fig. 8.4. Nesse circuito a corrente permanece constante
em cada ramo. O que muda é a posição do ponto de terra, onde o terra da corrente de saída é um terra virtual do
amplificador operacional. Dessa forma, a corrente de saída varia de acordo com o fechamento das chaves D.
A Fig. 8.5 mostra a conexão de um conversor Digital-Analógico (DAC0808) com um sistema mínimo
formado pelo microprocessador 8085, memória ROM 8355 e memória RAM 8156.
A conversão se encerra quando o sinal de saída do comparador estiver em nível baixo, ou seja, quando o
sinal Vsaída for maior que o sinal que se deseja converter, Vent. O resultado da conversão é obtido nas linhas de
transferência de dados do contador para o conversor DA. Observe que o sinal na saída do comparador pode ser
usado para indicar o fim da conversão. Durante a conversão esse sinal permanece em nível alto.
A desvantagem principal de um conversor do tipo mostrado na Fig. 8.6 é que o tempo de conversão pode
durar até 255 períodos de clock para um conversor de 8 bits e até 65535 períodos de clock para um conversor de
16 bits. Uma solução para reduzir o tempo de conversão é o conversor mostrado na Fig. 8.7, do tipo aproximação
sucessiva.
O processo de conversão desse tipo de conversor é diferente do anterior. Nesse conversor o número
máximo de períodos de clock utilizados na cconversão corresponde ao número de bits do conversor, ou seja, o
conversor de 8 bits leva até 8 ciclos de clock para completar uma conversão e o de 16 bits leva até 16 ciclos de
clock.
Um pulso alto de “início de conversão” enviado ao Registrador de Aproximação Sucessiva (RAS) dá
início ao processo. O registrador RAS começa setando o bit mais significativo D7 (MSB) que alimenta o
conversor DA. Se a saída do DA for maior que o sinal a ser convertido Vent, o bit MSB é zerado. Caso o bit D7
não resulte em saída analógica Vsaída maior que o sinal a ser convertido, o bit D7 é mantido. A seguir o segundo
bit mais significativo, D6, e os demais bits restantes são testados seguindo o mesmo procedimento, até atingir o
valor correto de conversão. Ao final da conversão, um sinal baixo é emitido para o Registrador Buffer, liberando
a saída digital e, ao mesmo tempo, conservando esse valor durante a próxima conversão.
5. Qual a tensão na saída de um conversor DA de 8 bits, cujo sinal de entrada seja 40 h e cuja tensão de
referência seja 5 V?
6. Considere o conversor DA de 4 bits da Fig. 8.2, com resistências ponderadas, onde a resistência R = 2 kΩ e
a resistência de saída seja Rsaída = 10 kΩ. Calcule a corrente e a tensão de saída do circuito. A tensão de
referência é VREF = 5 V.
7. Faça um programa para o ABACUS, que lê a tensão de alimentação de um motor de corrente contínua e
mostra no display de 7-segmentos correspondente ao endereço (usar CALL MOSTRAD) e lê a velocidade
de rotação do motor e mostra nos LEDs. A tensão (que varia de 0 a 255 V) é lida através de um conversor
Analógico-Digital de 8 bits e entrada de 0 a 5 V, que é conectado à porta A (21h) do sistema mínimo do
8085. Cada fim de conversão desse AD gera uma interrupção RST 6.5 para leitura da tensão. A tensão é lida
em base hexadecimal e mostrada em base decimal.
A velocidade (que varia de 0 a 2000 rpm) é lida também através de um conversor Analógico-Digital de 8
bits e entrada de 0 a 5 V, que é conectado à porta C (23h) do sistema mínimo. Cada fim de conversão desse
AD gera uma interrupção RST 5.5 para leitura da velocidade. A indicação de velocidade nos LEDs é feita da
seguinte forma: até 250 rpm apenas o LED0 fica ligado; de 250 rpm até 500 rpm, os LEDs 0 e 1 ficam
ligados e assim sucessivamente, até chegar no intervalo de 1750 rpm até 2000 rpm, quando todos os LEDs
ficam ligados. Seguir os passos dados.
Programa principal:
a. Habilita as interrupções RST 6.5 e RST 5.5 e mascara a RST 7.5;
b. Habilita a porta A (21 h) como entrada de dados e a porta B (22 h) como saída de dados (igual ao caso
do ABACUS). Considere que a porta C já está habilitada;
c. Zera registradores A, D e E;
d. Entra num loop que mostra continuamente o conteúdo de DE (tensão) no display (subrotina do
ABACUS) e o conteúdo de A (velocidade) nos LEDs.
Subrotina 1
(atendimento da RST 6.5 a cada fim de conversão do AD da tensão)
a. Lê o valor da tensão, presente na porta 21h;
b. Converte o valor lido (hexadecimal) em valor decimal, guardando o resultado em DE.
c. Retornar ao programa principal.
Observação: Não é o caso de usar DAA e sim fazer a conversão da base hexadecimal para a base
decimal. Essa conversão é feita da seguinte forma:
Passo 1: Divide-se o número hexadecimal pelo decimal 10 (hexadecimal 0A). O resto dessa primeira
divisão é o dígito menos significativo do número decimal resultante (d0). Se o quociente for
zero o processo é encerrado.
Passo 2: Se o quociente da divisão anterior for diferente de zero, divide-se esse quociente novamente
pelo decimal 10 até obter o segundo resto, que é o segundo dígito menos significativo (d1). Se
o quociente dessa segunda divisão for zero, o processo é encerrado.
Passo 3: Se o quociente da divisão anterior for diferente de zero, divide-se esse quociente novamente
pelo decimal 10 até obter o terceiro resto, que é o dígito mais significativo (d2). Como o valor
máximo possível é FF h, não há possibilidade de um Passo 4.
O decimal resultante é: d2d1d0. d2 deve ser mostrado em D e d1d0 deve ser mostrado em E.
Subrotina 2
(atendimento da RST 5.5 a cada fim de conversão do AD da velocidade)
(a) Lê o valor da velocidade, presente na Porta 23h;
(b) Verifica o valor da velocidade (através de seu equivalente digital) e carrega em A o valor hexadecimal
que liga os LEDs desejados, de acordo com o que foi explicado no item (d) da parte inicial desta
avaliação.
(c) Retorna ao programa principal com o valor de A definido no item anterior.
[1] Ziller, Roberto M., “Microprocessadores – Conceitos Importantes,” Editora do autor, Florianópolis, SC,
2000.
[3] Malvino, Albert P., “Microcomputadores e Microprocessadores,” Tradução: Anatólio Laschuk, revisão
técnica: Rodrigo Araes Caldas Farias, McGraw-Hill, São Paulo, 1985.
9. MICROCONTROLADORES 8086/8088
9.1 Introdução
Portanto:
• para aplicações orientadas a 8 bits (byte) o 8088 desenvolve a tarefa tão bem quanto o 8086;
• para aplicações orientadas a 16 bits (word), o 8088 será menos eficiente que o 8086 mas não com metade da
velocidade.
a) Barramento de endereços com 20 linhas: proporciona endereçamento para até 1MB (1.048.576 bytes) de
memória.
b) Capacidade de uso de coprocessador (8087).
c) Todos os registradores internos possuem 16 bits (alguns podem ser acessados pela metade - primeiros ou
últimos 8 bits).
d) Possui 2 modos de funcionamento: Mínimo e Máximo: no modo mínimo equivale a um 8085 acelerado. O
modo máximo é usado em ambientes multiprocessados (quando o 8088 convive com outros 8088) ou em
ambientes coprocessados (quando há processador aritmético). Desta forma, como o PC-XT tem soquete para
utilização do 8087, sua CPU funciona com o 8088 no modo máximo.
e) A CPU é dividida em 2 blocos: Unidade de Execução (EU) e Unidade de Interface com o Barramento (BIU).
f) BIU com fila de instruções (queue) de 4 bytes (8088) ou 6 bytes (8086).
g) Realiza instruções de divisão e multiplicação (para números com ou sem sinal), assim como operações com
strings (blocos de bytes).
h) Possui registradores de segmento, possibilitando segmentação de memória.
i) No RESET o endereço de memória acessado é FFFF0H.
Para ilustrar melhor as características do 8088, a tabela a seguir foi criada, onde é feita uma comparação
entre o 8085, o 8086 e o 8088. A seguir faz-se um paralelo entre os registradores do 8085 e os registradores do
8088 (os quais serão mais detalhadamente explicados nas próximas seções).
Uma das principais inovações do 8088 foi a separação entre lógica de execução e lógica de controle do
barramento, criando dois blocos que funcionam de forma assíncrona: a Unidade de Execução (EU) e a Unidade
de Interface com o Barramento (BIU).
A EU tem como função processar (decodificar e executar) instruções obtidas da BIU. A EU é constituída
de:
• Registradores de Dados;
• Registradores de Endereços;
• ALU;
• Unidade de Controle.
A BIU tem apenas funções de hardware: controla o acesso ao barramento (linhas de endereçamento,
linhas de dados e sinais de controle). A BIU é constituída de:
• Lógica de interface com o barramento;
• Registradores de segmento;
• Lógica para endereçamento de memória (somador);
• Fila de instruções (4 bytes para o 8088 e 6 bytes para o 8086).
1. A BIU coloca o conteúdo do IP (que é somado ao registrador CS) no barramento para efetuar a busca de
instrução;
2. O registrador IP é incrementado (aponta para a próxima instrução);
3. A instrução lida é passada para a fila;
4. A EU pega a primeira instrução da fila;
5. Enquanto a EU executa esta instrução a BIU faz uma nova busca de instrução para preencher a fila. Se a
instrução a ser executada pela EU for muito demorada a BIU preenche toda a fila.
Há 2 situações em que não são aproveitadas as instruções contidas na fila. São elas:
• Na execução de instruções de desvio. Neste caso a fila é descartada (ou seja, é sobreescrita);
• Quando a instrução faz referência à memória.
Definições:
⇒ Pipelining: introdução de paralelismo para executar programas de natureza sequencial. OBS: Esta tecnologia
é utilizada no projeto de processadores RISC.
⇒ Periférico: qualquer equipamento ou dispositivo que provê à CPU comunicação com o resto do sistema.
⇒ Interface: Conjunto de componentes capaz de controlar um dispositivo (device). OBS: uma placa de
expansão pode conter uma ou mais interfaces.
⇒ IP (Instruction Pointer): tem a mesma função do PC (Program Counter) no 8085.
⇒ Registrador de Segmento: registrador que armazena o endereço base. Deve ser somado ao endereço de
deslocamento (ou offset, ou ainda endereço lógico) para obter o endereço físico (ou endereço absoluto). No
8088 os segmentos definem blocos de 64Kbytes de memória. Há 4 registradores de segmento:
∗ Code Segment (CS): área destinada a código;
∗ Data Segment (DS): área destinada a dados;
∗ Extra Segment (ES): área extra destinada a dados;
∗ Stack Segment (SS): área destinada a armazenar endereços de retorno de rotinas de interrupções e de
sub-rotinas;
Barramento B
6
Unidade de Interfaceamento
com Barramento (BIU) 5
QUEUE
4
Extra Segment – ES 3
Code Segment – CS
Registradores de 2
Stack Segment – SS
Data Segment – DS Segmento
1
Instruction Pointer – IP
Sistema de Controle da
Unidade de Execução
Barramento A
AH AL AX
BH BL BX Unidade de
CH CL CX Execução (EU)
DH DL DX ULA
Stack Pointer SP
Base Pointer BP
Source Index SI
Destination Index DI
FLAGS
• Por haver uma área específica para armazenamento de código e outras áreas para armazenamento de dados,
pode-se trabalhar com tipos diferentes de conjuntos de dados (por exemplo, em um ambiente multitarefa
onde um programa atende várias entradas de dados);
• Programas que referenciam endereços lógicos (0000 a FFFF no caso do 8088) podem ser carregados em
qualquer espaço (físico) da memória (00000 a FFFFF): possibilita a realocação de programas.
SEGMENTAÇÃO
Registrador de Registrador de
Segmento + Offset
Σ
XXXX0 0YYYY
15 0 15 0
Extra Segment - ES Stack Pointer - SP
Base Pointer - BP
Code Segment - CS
Source Index - SI
Stack Segment - SS
Destination Index - DI
Data Segment - DS
Memória
Offset + Byte Endereçado
Representação: 2000h:2000h
Os Registradores de Dados são também chamados Registradores de Propósito Geral. São 4 registradores
de 16 bits de uso geral, normalmente utilizados pelo conjunto de instruções para realizar operações lógicas e
aritméticas. Podem também ser usados como registradores de 8 bits para instruções envolvendo 1 byte.
Registradores de Dados
15 8 7 0
AX AH AL Accumulator
BX BH BL Base
CX CH CL Counter
DX DH DL Data
AX – Acumulador primário – Todas as operações de I/O são realizadas através deste registrador. Operações que
utilizam dados imediatos necessitam de menos memória quando feitos através de AX. Algumas operações
com ´strings´ e instruções aritméticas pedem o uso deste registrador. Geralmente é usado pelos
compiladores como hospedeiro para valores retornados de subrotinas.
BX – Registrador Base – Parece com registrador HL do 8085. É o único registrador de finalidade geral que pode
ser utilizado no cálculo de endereço de memória. Todas as referências à memória que usam esse
registrador no cálculo do endereço usam o registrador DS, como segmento ´default´.
CX – Contador – Parece com o registrador BC do 8085. É decrementado durante operações com ´loops´ e
´strings´. Tipicamente, é usado para controlar o número de repetições do ´loop´. Também é usado para
rotações e deslocamentos de vários bits.
DX – Endereçador de I/O e Registrador de Dados – Parece com o registrador DE do 8085. Recebe o nome de
registrador de dados, principalmente por força dos mnemônicos. Em algumas operações de I/O, fornece o
endereço, coisa que nenhum outro registrdor pode fazer. Também é usado em operações aritméticas,
incluindo multiplicação e divisão, com o resultado a 32 bits. Pode ser usado por compiladores, juntamente
com AX, para retornar valores de subrotinas.
Este grupo de 4 registradores é tipicamente usado para gerar endereços de memória efetivo (nome dado à
porção offset do endereço físico). Apenas são usados em 16 bits. Podem ainda ser utilizados em operações
aritméticas e lógicas para gerar novos endereços efetivos.
Registradores Apontadores e Índices
15 0
Stack Pointer SP
Base Pointer BP
Source Index SI
Destination Index DI
SP – Ponteiro de Pilha – Parece com o registrador SP do 8085. Armazena o offset do endereço do topo da pilha.
Todas as referências ao SP, por definição, usam o registrador SS.
BP – Ponteiro da Base – Permite acessar dados no segmento da pilha. Tipicamente é usado para acessar
parâmetros que foram passados pela pilha.
SI e DI – Registradores de Indexação – São usados para acessar dados na memória de dados. São
extensivamente usados nas operações com ´strings´. Podem ser usados como operandos em todas as
operações lógicas e aritméticas de 16 bits.
No conjunto de instruções do 8088 nem todos os registradores são especificados. Em muitos casos, uma
instrução pode usar um só registrador ou conjunto de registradores específicos. Para outras instruções, os
registradores têm uso implícito. A tabela a seguir lista as operações que implicam no uso específico (implícito)
de um determinado registrador.
Registradores Operações
AX multiplicação de word (16 bits), divisão de word, I/O de word
AL multiplicação de byte, divisão de byte, I/O de byte, aritmética decimal
BX referência de memória (semelhante ao reg. par HL do 8085)
CX operação de strings, loops
CL deslocamento, rotação
DX multiplicação de word, divisão de word, end. indireto de I/O (0-65535)
SP operação de stack
SI operação de string (origem)
DI operação de string (destino)
Registradores de Segmento
15 0
Code Segment CS
Data Segment DS
Stack Segment SS
Extra Segment ES
DS – Segmento de Dados – Todo acesso a dados usa este registrador como referência, mas existem 3 exceções:
(a) endereços para acessos à pilha são calculados usando o registrador de segmento de pilha (SS); (b)
endereços para acessos a dados que usam o BP são calculados usando o SS e (c) operações com ´strings´,
que usam o DI no cálculo do endereço, são feitas usando ES.
SS – Segmento de Pilha – Todos os acessos a dados que usam os registradores SP ou BP tomam como referência
o registrador de segmento de pilha (SS).
ES – Segmento Extra – Operações com ´strings´, que usam DI para calcular o endereço, são feitas usando o
registrador ES para definir o segmento.
O registrador de segmento default é selecionado pelo hardware do 8088. Em alguns casos é possível não
levar em conta o registrador default e especificar um registrador de segmento diferente (ver exemplo abaixo).
EXEMPLO:
A instrução MOV [BX],CX move o conteúdo de CX para a posição de memória calculada utilizando o
registrador de segmento DS (segmento default para dados) e o registrador de dados BX. Mas, se escrevermos
MOV CS:[BX],CX forçamos o uso do registrador de segmento CS para o cálculo da posição de memória
destino (que será CS:BX).
Da mesma forma, a instrução MOV AX,[BP] acessa posição de memória diferente da instrução MOV
AX,ES:[BP].
Notar que não há registrador de segmento e registrador de offset alternativos para a busca de instruções
(que deve sempre ser o par CS :IP) e para operações de pilha (que deve sempre ser o par SS: SP).
Este registrador contém o endereço offset da próxima instrução a ser executada pelo microprocessador.
Tem a mesma função do PC utilizado no 8085.
É um registrador de 16 bits mas apenas 9 bits são usados. Seis deles são bits de status que refletem os
resultados de operações aritméticas e lógicas.
Os outros três são bits de controle. O conjunto de instruções do 8088 possui instruções específicas setar e
ressetar seus flags (que será visto mais adiante).
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
× × × × O D I T S Z × A × P × C
Flags de Status
C – Flag de carry – reflete o ´vai um´ do bit mais significativo, nas operações aritméticas (de 8 ou 16 bits). Ele
também é modificado por algumas instruções de rotação e deslocamento.
Obs.: As operações de subtração usam aritmética em complemento dois e, por isso, o ´carry´ é invertido e
passa a funcionar como ´borrow´. Se, após uma operação de subtração, obtém-se C = 1, isso indica que não
houve ´borrow´, mas C=0, indica que houve ´borrow´.
P – Flag de Paridade – indica a paridade (par), dos 8 bits menos significativos, do resultado da operação
realizada.
P = 1 número par de ´1´ nos 8 bits menos significativos
P = 0 número ímpar de ´1´ nos 8 bits menos significativos
A – Flag Auxiliar de Carry – reflete o ´vai um´ do bit 3, em uma operação de 8 bits.
S – Flag de Sinal – é igual ao bit de mais alta ordem do resultado de uma operação aritmética.
S = 0 resultado positivo
S = 1 resultado negativo
O – Flag de Overflow – seu conteúdo é obtido através de uma operação XOR do ´carry in´ com o ´carry out´ do
bit de mais alta ordem do resultado de uma operação aritmética. Ele indica um ´overflow´ de magnitude,
em aritmética binária com sinal. Indica que o resultado é muito grande para o campo destino.
Flags de Controle
T – Flag de Trap (armadilha) – usada para a depuração de programas. Coloca o 8086 no modo passo a passo.
Após cada instrução uma interrupção é gerada automaticamente.
I – Flag de Interrupção – habilita ou desabilita a interrupção externa (pedida pelo pino INTR). Ao contrário do
8085, onde as interrupções RST 7.5, RST 6.5 e RST 5.5 podem ser habilitadas/desabilitadas
individualmente, no 8086 todas são habilitadas ou desabilitadas ao mesmo tempo. A habilitação/
desabilitação individual pode ser feita através do controlador de interrupção 8259.
I = 1 interrupção habilitada
I = 0 interrupção desabilitada
D – Flag de Direção – determina se as operações com ´strings´ vão incrementar ou decrementar os registradores
de indexação (SI e DI).
D = 1 os registradores SI e DI serão decrementados, ou seja, a ´string´ será acessada a partir do
endereço mais alto em direção ao mais baixo.
D = 0 os registradores SI e DI serão incrementados, ou seja, a ´string´será acessada a partir do
endereço mais baixo em direção ao mais alto.
EXEMPLO:
Descreva o estado dos flags após a execução da instrução ADD AL,1 (Adiciona 1 ao conteúdo do
registrador de 8 bits AL), sabendo que inicialmente AL =7Fh.
O microprocessador 8088 é um CI com 40 pinos. Na figura a seguir alguns pinos apresentados tem duas
definições. O 8088 tem dois modos de operação que são selecionados pelo pino 33 (MN / MX ). Quando este
pino é ligado um nível alto, o μP fica no modo mínimo e é compatível com o 8085, podendo substituir
diretamente este μP.
Vcc A15 A16/ A17/ A18/ A19/ Vcc MN/ RD RQ/ RQ/ lock S2 S1 S0 QS0 QS1 Test RDY RST
S3 S4 S5 S6 MX GT0 GT1
40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Gnd A14 A13 A12 A11 A10 A9 A8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK GND
No PC, o 8088 é usado no modo máximo (MN / MX =0). As definições a seguir são relativas a este
modo.
(a) AD0-AD7 (9 -16): transmitem os 8 bits menos significativos dos endereços multiplexados com o byte de
dados. Os bits de endereço (A0-A7) são apresentados no início do ciclo (T1) e os dados a partir de T2.
Ambos sinais são bufferizados para fazerem parte do barramento do sistema.
(b) A8-A15 (2-8 e 39): é a outra parte dos bits de endereços. Não são multiplexados (no 8086 são),
permanecendo estáveis durante grande parte do ciclo de acesso a barramento. Após bufferização fazem parte
do barramento do sistema.
(c) A16/S3 - A19/S6 (35-38): sinais de status e endereços multiplexados. No início do ciclo de barramento estão
presentes os bits dos endereços A16 a A19. Durante o restante do ciclo (a partir de T2) informa o status
interno do 8088.
S6 = 0 (permanece em nível baixo no modo máximo);
S5 indica o status do flag de interrupção (se = 1 a interrupção está habilitada);
S3 e S4 são decodificados para indicar qual registrador de segmento está sendo usado no momento (ver
tabela abaixo). Não são usados no PC-XT da IBM.
S3 S4 Reg. Segmento
0 0 Dados Extra (ES)
0 1 Pilha (SS)
1 0 Código (CS)
1 1 Dados (DS)
(d) Clock (19): sinal de entrada responsável pela geração da temporização no μP. No projeto do PC este sinal é
gerado pelo CI 8284A, tendo freqüência de 4,77Mhz e ciclo de trabalho (duty cycle) de 33%.
(e) RQ / GT0 (Request / Grant) (31): sinal bidirecional, usado por outros controladores de barramento local
para requerer o uso do barramento (faz o papel dos pinos HOLD e HLDA do 8085). No PC este sinal é ligado
ao co-processador 8087.
(f) RQ / GT1 (30): idem ao anterior, com grau de prioridade menor. No PC não é usado.
(g) Lock (29): é ativado pela instrução LOCK e permanece ativo até o fim da próxima instrução. É usado para
indicar a outros controladores de barramento que estes não devem tentar obter o controle do barramento
durante a execução da instrução seguinte à LOCK. O PC não é projetado para multi-controladores e portanto,
este pino não é usado.
(h) NMI (17): sinal de entrada, usado para gerar uma interrupção não mascarável no μP. No PC este sinal é
mascarado externamente por uma lógica programável (um FlipFlop). É equivalente ao pino TRAP do 8085.
(i) INTR (18): entrada para solicitação de interrupção mascarável. No PC este pino é ligado ao CI 8259A que
expande esta entrada de 1 para 8, adicionando, dentre outras funções, níveis de prioridade.
(j) Ready (22): sinal de entrada usado para inserir estados de espera no ciclo de barramento, estendendo-os. No
PC este sinal vem do chip do clock 8284A que o sincroniza com o clock do sistema.
(l) Reset (21): usado para reiniciar o μP. No PC este sinal vem do chip de clock 8284A que recebe uma entrada
da fonte do sistema. A fonte envia um sinal chamado "Power Good" indicando que os níveis de tensão estão
apropriados e o sinal Reset pode ser então removido para iniciar o μP. A situação dos registradores do 8088
após o RESET é a seguinte:
(m) QSO, QS1 (24, 25) - Queue Status: sinais de saída que fornecem o status da fila de instrução (queue) do
8088. No PC são ligados ao co-processador de modo que este possa acompanhar o status da fila 8088.
(n) TEST (23): pino de entrada, utilizado em conjunto com a instrução WAIT (não confundir com estado de
espera, "wait state"). Se após a instrução WAIT o pino TEST estiver em nível alto, o 8088 espera em estado
inativo até este pino obter sinal baixo. No PC é ligado a um pino de saída do 8087.
(o) S0, S1, S2 (26 - 28) (status): apresentam informações de status sobre o tipo de ciclo de barramento que
está sendo desenvolvido. Este status é válido no início de cada ciclo de barramento (durante o período T1).
No PC estess pinos são ligados ao 8288, chip controlador de barramento, onde são decodificados. Os sinais
de saída decodificados no 8288 formam as linhas de controle do sistema. Os sinais de controle gerados pelo
8288 a partir das informações de status são: IOR, IOW, MemR , MemW e ALE. Os bits de status
podem ser vistos na tabela abaixo.
Tipo de ciclo no BUS
S2 S1 S0
0 0 0
Reconhecimento de interrupção ( INTA )
0 0 1
Leitura I/O ( IOR )
0 1 0
Escrita I/O ( IOW )
0 1 1 Halt
1 0 0 Busca de instrução
1 0 1
Leitura memória ( MemR )
1 1 0
Escrita memória ( MemW )
1 1 1 Passivo
T1 a T4 períodos de relógio
ALE – Address Latch Enable – O endereço só é reconhecido depois que este sinal vai para nível alto, mas
o endereço só é efetivamente usado quando este sinal volta para o nível lógico baixo. Durante o
ciclo T2 os sinais de endereço são removidos.
AD0 – AD15 Barramento de dados. No ciclo de leitura esse barramento é colocado em estado de alta
impedância no estado T2, em preparação para a leitura de dados. No ciclo de escrita a
CPU coloca os dados no barra barramento no estado T2.
*
RD Ativo baixo. Indica leitura de dados da memória ou de um dispositivo de entrada e saída. Ativado
em T2.
*
WR Ativo baixo. Indica escrita de dados na memória ou em um dispositivo de entrada e saída.
Ativado em T2.
DT/*R Indica a direção da transferência de dados.
*
DEN Ativo baixo. Data Enable. Indica que vai haver tráfego de dados no barramento.
A19/S6, A16/S3 Barramento de dados durante ciclo T1. Barramento de sinais de estado de T2 a T4.
TW Wait State – Tempo de espera. No período de leitura a CPU lê o dado do barramento no período
T3, após o dispositivo lido entregar esses dados. Se o dispositivo não conseguir entregar os dados até o final do
ciclo T3, o pino READY do 8086 é colocado em nível lógico baixo, fazendo com que a CPU fique estado de
espera, repetindo do estado T3 quantas vezes forem necessárias, enquanto aguarda o dispositivo entregar os
dados. No período de escrita pode acontecer o mesmo. A CPU está pronta para entregar os dados, mas o
dispositivo não está pronto para recebe-los. O pino READY é colocado em nível baixo, gerando períodos de
espera.
Já foi explicado numa seção anterior como é feita a composição do endereço físico do 8088. Uma das
características desse microprocessador é a sua capacidade de endereçar mais que 64 kbytes de memória. O 8088
possui 20 bits de endereços, permitindo ter uma memória física de 1.048.576 bytes (ou 1MB).
A geração de 20 bits, já explicada, é feita manipulando o conteúdo de registradores especiais chamados
Registradores de Segmento. O valor carregado no registrador de segmento é usado para localizar, no espaço de
1MB, a região de 64kB onde as instruções do 8088 irão operar. Um outro registrador (que pode ser um reg.
apontador, um reg. índice ou o BX) pode especificar 64kB dentro de um segmento. O endereço de memória
físico será formado pelo deslocamento do conteúdo do registrador de segmento de 4 bits para a esquerda
(acrescentado-se 4 bits 0 à direita), somado a outro valor de 16 bits (acrescentado-se 4 bits 0 à esquerda),
resultando num endereço físico com 20 bits. É interessante observar que diferentes combinações de endereços
lógicos (offsets) e registradores de segmento podem oferecer o mesmo endereço físico, como exemplificado a
seguir:
EXEMPLO: supondo que SS=8F00h, SP=21F1h, CS=9020h, IP=0FF1h, os endereços físicos para um
acesso à pilha e para a busca da próxima instrução são dados por:
SS = 8F00h 8F000
SP =21F1h + 021F1
endereço físico → 911F1h
CS = 9020h 90200
IP = 0FF1h + 00FF1
endereço físico → 911F1h
Na realidade os quatro registradores de segmento no 8088 (CS, DS, SS e ES) podem assumir o mesmo
valor, ou valores próximos, ou seja, podem se sobrepor parcial ou totalmente. O programador deve tomar
cuidado para que isto apenas ocorra se for estritamente necessário.
Estes 4 registradores podem apontar para qualquer região de 64 kB, no espaço de 1 MB. Uma vez
setados, haverá uma região de 64kB para o código (CS), 64kB para dados (CS), 64kB para pilha (SS) e 64kB
para dados extra (ES). Em qualquer momento que o programa necessite manipular a memória física, fora das
atuais regiões de 64 kB, ele deve manipular o registrador de segmento apropriado (alterando-o através de
instruções de transferência de dados. As figuras a seguir ilustram as regiões definidas pelos registradores de
segmento sem e com sobreposição.
FFFFFH
Offset +
≤ 64 kB
CS × 16
Offset +
≤ 64 kB
DS × 16
Offset +
≤ 64 kB
ES × 16
Offset +
≤ 64 kB
SS × 16
00000H
MULTIPLICIDADE DE ENDEREÇOS
Um mesmo endereço pode ser acessado usando diferentes registradores de segmentos e diferentes registradores
de offset
FFFFFH
≤ 64 kB
Endereço Físico
CS × 16
≤ 64 kB
SS × 16
00000H
Exemplo: Endereço Físico = 10020 h
Conceito de tipo → Cada símbolo (nome de variável, endereço, constante) tem um determinado tipo.
Exemplos:
MOV AX, [BX] → copia o word endereçado por BX para AX → o tipo do símbolo usado já está implícito
(uma vez que AX é de 16 bits), não havendo necessidade de informar ao assembly.
INC [BX] → é necessário informar se deve ser incrementado o BYTE de offset BX ou o WORD de offset BX:
INC BYTE PTR [BX] incrementa o byte cujo offset é o valor contido em BX
INC WORD PTR [BX] incremeta word que se encontra nos endereços BX e BX+1.
7 6 5 4 3 2 1 0
mod reg r/m
Como observado anteriormente, um endereço físico (20 bits) é constituído de duas partes:
• um segmento ou valor base;
• um offset ou endereço efetivo.
Um Endereço Efetivo (EA: Effective Address) é a parte offset do endereço físico. Ele é formado pela
soma de um deslocamento (um número) com um registrador base (BX ou BP) e com um registrador índice (SI
ou DI) (exemplo: MOV AX, [BP+SI+4]). A referência de memória com omissão de qualquer uma destas partes
é também chamada de Endereço Efetivo (por exemplo, a parte offset do exemplo anterior poderia ser [BP+4] ou
[BP+SI]).
Uma das vantagens de se escrever instruções com endereços efetivos é que um endereço de memória
pode ser modificado baseado em condições do programa. Isto é particularmente útil quando se trabalha com
tabelas (ou matrizes). Por exemplo, BP pode ser setado para apontar para a base (o início) da tabela e SI (que
armazena o resultado de um cálculo) localiza um elemento na tabela.
A tabela abaixo sumariza os modos de endereçamento do 8088 e os registradores que estão disponíveis
em cada modo.
Modo Endereçamento Exemplo Registrador de Operação
Mnemônico Segmento acessado
Imediato MOV AX, 1000H Code CS AX ← 1000H
Registrador MOV DX, CX - DX ← CX
Direto MOV AH, [1000H] Data DS AH ← [1000H]
Indireto por Registro MOV AX, [SI] Data DS AL ← [SI]; AH ← [SI+1]
(BX, BP, SI, DI)
Indexado MOV AX, [SI+6] Data DS AL ← [SI+6]; AH ←[SI+7]
(SI ou DI)
Baseado MOV AX, [BP+2] Stack SS AL ← [BP+2]; AH ←[BP+3]
(BP ou BX)
Baseado e Indexado MOV AX, [BX+SI] Data DS AL ← [BX+SI];
AH ← [BX+SI+1]
Baseado e Indexado com MOV AX, [BX+SI+5] Stack SS AL ← [BX+SI+5];
deslocamento AH ← [BX+SI+6]
Strings MOVSB Extra, Dado [ES:DI] ← [DS:SI]
ES, DS se DF = 0 então:
SI ← SI+1 e DI ← DI+1
se DF = 1 então:
SI ← SI -1 e DI ← DI -1
ENDEREÇAMENTO POR REGISTRADOR
ENDEREÇAMENTO IMEDIATO
Operando faz parte da própria instrução. Usado para atribuir valores de 8 ou 16 bits a registradores
Obs.: Modo imediato não pode ser usado para os registradores de segmento, nem para as instruções PUSH
O operando está na memória. A instrução contém o offset do endereço do operando (o segmento é DS).
Ex.: MOV AX, [1000H] → copia para AX o conteúdo localizado nos offsets 1000H e 1001 H, ou seja,
AX = 1234 H.
Endereço Dado
1000H 34H
1001H 12H
1002H 25H
ENDEREÇAMENTO INDIRETO
O operando está na memória. A instrução, ao invés de conter o offset do endereço, como no caso direto,
contém um registrador, que contém o offset do endereço do operando. Os registradores de offset podem ser BX,
BP, DI ou SI (o segmento é DS).
Ex.: MOV AX, [BX] → copia para AX o conteúdo localizado no offset dado em BX. Se BX = 1000h,
então AX = 1234h
Endereço Dado
1000H 34H
1001H 12H
1002H 25H
Exemplo de aplicação: Tabelas, onde o endereço de leitura da tabela é dado através do registrador de
offset, que é incrementado para varredura da tabela.
ENDEREÇAMENTO INDEXADO
Uma constante, denominada base, e um registrador de índice são usados. A base e o índice são somados
para a obtenção do offset do endereço. Os registradores de índice podem ser BX, BP, DI ou SI
Ex.: MOV AX, 0100H[BX] → copia para AX o conteúdo localizado no offset dado por BX + 0100H.
Se BX = 1000h, então BX + 0100H = 1100H e AX = 1234h
Endereço Dado
1100H 34H
1101H 12H
1102H 25H
Exemplo de aplicação: Tabelas, onde a posição inicial da tabela pode ser dada através da base; o índice
pode então ser variado para varredura da tabela.
ENDEREÇAMENTO BASEADO
Endereço Dado
1100H 34H
1101H 12H
1102H xxH
Exemplo de aplicação: Tabelas, onde a posição inicial da tabela pode ser dada através da base; o
índice pode então ser variado para varredura da tabela.
ENDEREÇAMENTO RELATIVO
As instruções de desvio e chamadas de subrotina do tipo near ou short somam ou subtraem um valor de
deslocamento para o desvio, ao invés de usar o endereço longo.
Enquanto o 8085 possui apenas 5 canais de interrupção, o 8086 é capaz de tratar de 256 interrupções
diferentes, numeradas de 00h a FFh (ou 0 a 255 decimal). Ao contrário do 8085, a localização de cada
interrupção não vem pré-definida no microprocessador; existe uma tabela, mostrada a seguir, com os vetores de
interrupção, onde o endereço físico de cada interrupção é colocado.
0000h:03FDh IP high h
0000h:03FEh CS low h
0000h:03FFh CS high h
As interrupções de 0 a 31 (ou 00h a 1Fh) são reservadas. Elas têm finalidades específicas para o 8086.
Dentre as reservadas 5 interrupções já são pré-definidas no 8086:
São interrupções solicitadas através do pino INTR (pino 18). Nesse pino é conectado um controlador de
interrupção que amplia para 8 os pedidos de interrupção. São interrupções mascaráveis através do bit IF do
registrador de flags. A seqüência de atendimento de uma interrupção por hardware é:
8086 envia primeiro pulso *INTA para periférico, após receber pedido de interrupção. Após esse sinal
reconhecimento de pedido de interrupção o periférico prepara-se para enviar o número da interrupção
8086 envia segundo pulso *INTA para periférico, tendo como resposta do periférico o número da
interrupção colocada no barramento de dados
8086 salva PSW na pilha
Apaga flag TF (Trap – passo a passo) e, se for reservada, também IF (Interrupt Flag – desabilita
interrupções por INTR)
Salva CS (segmento) e IP (offset) na pilha
Carrega novo IP a partir do endereço 4*nn
Carrega novo CS a partir do endereço 4*nn + 2
São interrupções solicitadas através da instrução INT nn, onde nn deve estar entre 32 e 255 (as
interrupções de 0 a 31 são reservadas). As interrupções geradas pela instrução INT nn não são mascaráveis. A
seqüência de atendimento de uma interrupção por software e também de uma interrupção reservada é:
Apaga flag TF (Trap – passo a passo) e, se for reservada, também IF (Interrupt Flag – desabilita
interrupções por INTR)
Salva CS (segmento) e IP (offset) na pilha
Carrega novo IP a partir do endereço 4*nn
Carrega novo CS a partir do endereço 4*nn + 2
Embora existam 256 interrupções por software, cada uma delas pode ter até 256 sub-funções diferentes,
ou seja, através das interrupções por software, pode-se executar 256*256 = 65.536 funções diferentes.
Normalmente o registrador AH é usado para passar para a interrupção qual a função a ser executada. A tabela a
seguir exemplifica algumas dessas funções.
Podem ser movimentados byte ou word, sendo que os registradores Ponteiros (BP e SP), Índices (SI e
DI) e de Segmento (CS, DS, SS, ES) apenas podem ser acessados como word (16 bits).
DEFINIÇÃO DE POSIÇÃO DE MEMÓRIA: Ao escrever programas é conveniente dar nomes a
posições de memória: para isto utiliza-se pseudo-instruções.
Observações.:
(a) Um registrador de segmento não pode ser carregado usando o modo imediato. Exemplos
incorretos: MOV CS, 1000, MOV DS, 3A00.
(b) Somente o registrador BX e os ponteiros e índices podem referenciar memória. Exemplos
incorretos: MOV AX, [DX], MOV CX, [AX]
(c) Destino e fonte não podem especificar posições de memória ao mesmo tempo. Exemplo incorreto:
MOV [BX], [SI]
Mnemônico Descrição
XCHG AX, BX permuta registradores AX e BX (AX ⇔ BX)
XCHG AL, CL Permuta registradores AL e CL
XCHG DX, [SI] Permuta DX com o conteúdo da posição de memória endereçada por SI.
Neste exemplo DL ⇔ [SI] e DH ⇔ [SI + 1]
LAHF AH ← Flags low
SAHF Flags low ← AH
IN AH, 26 IN direto
IN AL, DX IN indireto para as 65536 portas (0 - 65535 ou 0000 - FFFF).
OUT 26, AX Aplica-se as mesmas regras da instrução IN.
OUT DX, AX
LEA BX, MEMBY Load Efective Address: carrega endereço efetivo. No exemplo, BX é
carregado com o endereço efetivo de MEMBY (notar a diferença desta
com a instrução "MOV BX, MEMBY")
LEA BX, [1000] BX ← 1000
LDS BX, dword ptr [SI] Load Pointer using DS. No exemplo BX ← [SI+1:SI], DS ← [SI+3:SI+2].
Esta instrução é util quando é preciso estabelecer novo endereço absoluto
(composição endereço base + endereço de offset)
LES BX, dword ptr [SI] Load Pointer using ES. No exemplo BX ← [SI+1:SI], ES ← [SI+3:SI+2]
XLAT AL ← [BX+AL]. Carrega registrador AL com o conteúdo (byte) da tabela
iniciada em [BX] e com offset AL
Obs.:
(a) A instrução IN somente pode ser usada para as primeiras 256 portas (0 a 255). Portas c/ endereço > 255
devem utilizar somente reg. DX (referência de I/O). Exemplo não permitido: IN AX, 3400.
(b) A instrução IN deve utilizar somente o registrador AX. Exemplo não permitido: IN BL,DX.
Mnemônico Descrição
#MAKE_COM# Diretiva para o compilador gerar um arquivo “.com”
ORG 100h Diretiva que indica o endereço inicial do programa: 0100 H
MOV AX, 0B800h Carrega registrador AX com valor B800 H
MOV DS, AX Copia valor de AX para DS, definindo segmento de dados
MOV CL, 'A' Carrega CL com o código ASCII do caractere ´A´, isto é, 41 H
MOV CH, 01011111b Carrega CH com o valor binário 01011111 b = 5F H
MOV BX, 15Eh Carrega registrador BX com valor 015E H
MOV [BX], CX Copia conteúdo de CX na posição DS:BX, ou seja, B800:015E
HLT Pára programa
MOV AL, var1 Carrega registrador de 8 bits AL com valor 7 (variável var1)
MOV BX, var2 Carrega registrador BX de 16 bits com valor 1234 H (var2)
RET Pára o programa
STOS BYTE PTR ES:[DI], AL Armazena o byte em AL no endereço ES:DI. (Poderia ser CS, DS ou SS)
ES:[DI] ← AL. Se D = 0 incrementa DI; se D = 1 decrementa DI
STOS WORD PTR ES:[DI], AX Armazena o word em AX no endereço ES:DI. (Poderia ser CS, DS ou SS)
ES:[DI] ← AL. Se D = 0 incrementa DI; se D = 1 decrementa DI
LODS BYTE PTR AL, ES:[DI] Carrega AL com byte da posição ES:DI
AL ← DS:[SI]. Se D = 0 incrementa SI; Se D = 1 decrementa SI
LODS WORD PTR AX, ES:[DI] Carrega AX com word da posição ES:DI
AL ← DS:[SI]. Se D = 0 incrementa SI; Se D = 1 decrementa SI
CMPS BYTE PTR ES:[DI],[SI] Compara bloco de bytes de duas regiões de memória
CMPS WORD PTR ES:[DI],[SI] Compara bloco de word de duas regiões de memória
MOVSB Copia bytes da região de origem padrão (DS:SI) para a região de destino padrão (ES:DI).
Sendo a origem e o destino as regiões padrões (ao contrário da instrução MOVS), a instrução
não precisa de argumentos.
ES:[DI] ← DS:[SI]. Se D = 0, incrementa SI e DI; Se D = 1, decrementa SI e DI.
MOVSW Copia words da região de origem padrão (DS:SI) para a região de destino padrão (ES:DI).
Sendo a origem e o destino as regiões padrões (ao contrário da instrução MOVS), a instrução
não precisa de argumentos.
ES:[DI] ← DS:[SI]; ES:[DI+1] ← DS:[SI+1].
Se D = 0, DI ← DI + 2 e SI ← SI + 2; Se D = 1, DI ← DI – 2 e SI ← SI – 2
Precedendo as instruções de transferência de strings com "REP" faz com que estas instruções sejam
repetidas o número de vezes igual ao conteúdo do registrador CX.
Mnemônico Descrição
#make_COM# Diretiva para o compilador
ORG 100h Diretiva para o compilador programa começa na posição 100h
LEA SI, a1 Offset SI assume o endereço do primeiro valor da variável a1.
LEA DI, a2 Offset DI assume o endereço da variável a2.
MOV CX, 5 Registrador CX recebe valor 5
REP MOVSB Instrução MOVSB é repetida até o registrador CX alcançar 0.
RET Encerra programa
a1 DB 1,2,3,4,5 Variáveis
a2 DB 5 DUP(0) A variável a2 terá 5 valores zero, conforme declarado em 5 DUP(0).
EXEMPLO 2: Um bloco de memória de 10 bytes com caractere "A3" é armazenado na memória, a partir do
endereço físico E0000 H.
Mnemônico Descrição
#make_COM# Diretiva para o compilador
ORG 100h Diretiva para o compilador programa começa na posição 100h
MOV AX, 0E000 H AX = E000 h
MOV ES, AX Segmento especial ES = AX = E000 h
MOV DI, 0000 DI = 0000h ES:DI = E0000 + 00000 = E0000 h
MOV AL, 0A3 H Byte a ser armazenado é colocado em AL
CLD clear direction flag (resseta flag "direção": modo auto-incremento)
MOV CX, 10 Faz CX = 10 serão armazenado 10 bytes a partir de E0000 h
REP STOSB Repete instrução 10 vezes
HLT Pára programa
EXEMPLO 3: Copiar um bloco de memória de 1000 bytes do endereço físico A1000H para o endereço físico
E1000 H.
Mnemônico Descrição
MOV AX, 0A000 H AX = A000 H valor que será passado para registrador de segmento DS
MOV DS, AX Segmento de dados DS = AX = A000 h
MOV SI, 1000 H SI = 1000h DS:SI = E0000 + 00000 = A1000 h
MOV AX, 0E000 H AX = E000 h valor que será passado para registrador de segmento ES
MOV ES, AX Segmento especial ES = AX = E000 h
MOV SI,1000 H Registrador de offset SI = 1000 h DS:SI = A1000 H
MOV DI,1000 H Registrador de offset DI = 1000 h ES:DI = E1000 H
CLD clear direction flag (resseta flag "direção": modo auto-incremento)
MOV CX, 03E7 H Faz CX = 03E7 h serão armazenado 1000 bytes a partir de E0000 h
REP MOVSB Repete instrução 1000 vezes serão copiados 1000 bytes
Mnemônico Descrição
NOT BX BX é complementado (seus bits são invertidos)
NOT BYTE PTR [SI] Byte apontado por SI é complementado
NOT WORD PTR [SI] Word apontado por SI é complementado
AND CX, DX Função AND entre CX e DX
AND BL, BYTE PTR [SI] Função AND entre BL e conteúdo do Byte apontado por SI
AND AX, 8000 H Função AND entre AX e 8000 H
OR CX, DX Função OR entre CX e DX
OR BL, BYTE PTR [SI]
OR AX, 8000
XOR CL, DH Função XOR entre CL e DH
XOR BX, WORD PTR [SI] Função XOR entre BX e o Word apontado por SI
XOR AX, 8000
TEST CX, DX Semelhante ao AND, apenas não altera os operandos. É utilizado quando se
deseja testar vários bits: se o teste do 1o bit fracassa, pode-se testar o 2o bit.
TEST AX, 3000
SHL AL, 1 Deslocar à esquerda uma vez. Formato: SHL destino, contador
SHL BX, CL Deslocar a esquerda CL vezes.
Mnemônico Descrição
ADD SI, DX soma de registradores
ADD BYTE PTR [BX], CH
ADD DI, 6000
ADC SI, DX soma de registradores com carry
ADC BYTE PTR [BX], CL
SUB AX, BX subtração de registradores
SUB BL, 34 subtração de cte imediata
SBB AX, CX subtração de registradores com borrow
SBB BL, 34 subtração de cte imediata com borrow
DAA ajuste decimal para adição
DAS ajuste decimal para subtração
AAA ajuste ASCII para adição
AAS ajuste ASCII para subtração
INC CL incremento de registrador
INC WORD PTR [SI] incremento de byte apontado por SI
DEC CX decremento de registrador
DEC WORD PTR [SI]
NEG DX complemento de 2 de registrador
NEG WORD PTR [SI]
CMP BL, BH comparação entre dois registradores, BL e BH
CMP [BX], CX comparação entre word apontado por BX e CX
MUL BL multiplicação de byte: AX ← AL * BL
MUL CX multiplicação de word: DX:AX ← AX * CX
IMUL BL multiplicação de número com sinal
DIV BL divisão de byte: AX ← AL / BL (AL: quociente; AH: resto)
DIV CX divisão de word: DX:AX ← AX / CX (AX: quoc.; DX: resto)
IDIV BL divisão de número com sinal
Mnemônico Descrição
Desvio Incondicional
JMP [BX] IP ← [BX+1:BX]
JMP BX IP ← BX
JMP DWORD PTR [BX]; IP ← [BX+1:BX] ; CS ← [BX+3:BX+2]
Desvio condicional
JNC LABEL desvia para LABEL se flag carry = 0 (se não há carry)
JS LABEL desvia para LABEL se MSB =1 (flag de sinal =1)
LOOP LABEL decrementa CX e desvia para LABEL se CX ≠ 0
LOOPE LABEL decrementa CX e desvia para LABEL se CX ≠ 0 e ZF = 1
CALL e RETURN
CALL DELAY chamada de sub-rotina "DELAY"
CALL [BX] chamada de sub-rotina iniciada pelo conteúdo de memória
apontado por BX: IP ← [BX+1:BX]
CALL BX chamada de sub-rotina iniciada pelo BX: IP ← BX
RET retorno de sub-rotina
IRET retorno de rotina de interrupção (restaura CS e IP)
Mnemônico Descrição
STI seta flag Interrupção
CLI resseta flag Interrupção
STC seta carry flag
CLC resseta carry flag
CMC complementa carry flag
STD seta flag direção
CLD resseta flag direção
HLT para a CPU
WAIT para a CPU até o pino test ficar ativo
NOP sem operação (utilizado para gerar delay)
LOCK instruction coloca Pino LOCK em "0" durante a execução da próxima instrução
(instruction)
Apesar de possuir 20 bits de endereço, a arquitetura do 8088 suporta apenas 64KB (65.536) endereços de
dispositivos de I/O pois os bits de endereçamento A16 a A19 não são utilizados. A configuração usada no PC
também não usa toda esta capacidade. Somente os 10 bits menos significativos do barramento de endereços são
utilizados. Como 210 = 1024, este é o número de endereços de I/O disponíveis no PC (0000h a 03FFh). A figura
abaixo mostra a divisão de endereços no PC.
O bit A9 tem um significado especial no projeto do PC: quando está inativo (0), os dados não podem ser
recebidos (pelo micro) vindo dos slots. São habilitados apenas dados vindos de dispositivos de I/O instalados na
própria placa mãe (mother board, main board ou system board). Quando ativo (1), são habilitados a recepção
apenas de dados provenientes dos slots.
Tem-se assim 512 portas para uso interno do PC e 512 portas para uso de dispositivos conectados nos
slots (ver figura abaixo).
Esta divisão aplica-se apenas à instrução IN (instrução de entrada de I/O). Para a instrução OUT
(instrução de saída de I/O), todos os 1024 endereços podem ser utilizados nos slots.
Em sintonia com a restrição da instrução IN, o PC usa a primeira metade dos endereços para os
dispositivos da placa principal (placa mãe) e a metade restante para os dispositivos dos slots (ver figura abaixo).
A seguir serão apresentados os mapas de endereços de I/O do PC-XT. Deve-se observar que novas
placas (por exemplo, placas de som ou de rede) poderão decodificar endereços que atualmente estão livres.
Dispositivos de I/O residentes na placa principal fazem o serviço de interrupção, transferência de dados
(DMA), contagem, etc. Na figura abaixo pode ser visto o mapa de endereçamento de I/O para a placa principal.
01FF h
O conhecimento destes endereços torna-se a base de qualquer projeto de interface, já que representam o
ponto de entrada e saída de dados (ver figura na página 16).
Nem todos os 512 endereços disponíveis no slots podem ser utilizados para interfaceamento pois vários
endereços são previamente reservados para dispositivos comuns ao sistema. Os dispositivos de I/O que
normalmente são conectados nos slots são joysticks, portas paralelas (impressoras), portas seriais (RS-232),
adaptador gráfico (CGA, MDA, EGA, VGA), acionador de disquetes e de disco rígido. Para evitar problemas de
incompatibilidade de placa de interface entre diferentes micros deve-se evitar a duplicação desses endereços.
O modo mais simples de decodificar um endereço para uma porta de I/O ou um grupo de endereços para
projetos de interface é inspecionar o mapa de endereçamento e encontrar um bloco de endereços não utilizado, e
então, construir um circuito decodificador adequado. O endereço decodificado dever ser acionado logicamente
com os sinais de barramento IOR (leitura de I/O) ou IOW (escrita de I/O) para gerar entradas ou saídas de
dados, respectivamente.
Outro sinal importante é o AEN (Address ENable), gerado pelo controlador de DMA. Quando ativo (1), o
DMA assume o controle dos barramentos e o microprocessador é desabilitado. Portanto, tem a função de
desabilitar a decodificação de endereços de I/O durante o ciclo de DMA: deve fazer parte da lógica de
decodificação. Como mostrado mais à frente, a faixa de endereços de 0300h à 031Fh está livre para uso em
placas de interface.
9.11.4 O Slot do PC (ISA 8 bits)
O slot do PC apresenta todos os sinais de interesse para a interface com qualquer dispositivo de I/O. Os
sinais disponíveis nos slots são os sinais de endereçamento, de dados, clock, tensões, etc. A configuração dos
sinais no slot ISA 8 bits pode ser visualizada na figura da página 17. Os sinais mais utilizados são dados a seguir:
Servem para controlar o acesso aos CI's de I/O). Alguns principais sinais de controle são:
IOW (B13) - habilita escrita nos periféricos de I/O quando em nível lógico baixo;
IOR (B14) - habilita leitura dos periféricos pelo microprocessador quando em nível lógico baixo;
RESET DRV (B2) - sinal de reset utilizado para ressetar portas programáveis da placa de interface;
AEN (A11): utilizado na lógica de decodificação de endereços para indicar quando está ocorrendo um DMA;
CLOCK (B20): sinal de clock fornecido pela placa principal, freqüência = 4,77 MHz;
DADOS: de D0 à D7 (A9 - A2): sinais provenientes do barramento de dados;
ENDEREÇOS: de A0 à A9 (A31 - A22): sinais provenientes do barramento de endereços.
Todos os demais sinais não são usados freqüentemente, pois apenas placas de interface mais
sofisticadas necessitam destes outros recursos.
0220 h
80 Reservada ou Não Documentada
026F h
0270 h
16 Porta Paralela ou Impressora # 2
027F h
0280 h
112 Reservada ou Não Documentada
02EF h
02F0 h
16 Porta Serial #2
02FF h
0300 h
32 Placa de Prototipo
031F h
0320 h
16 Adaptador de Disco Rígido
032F h
0330 h
64 Não Documentada
036F h
0370 h
16 Impressora Paralela Principal
037F h
0380 h
48 Reservada ou Não Documentada
03AF h
03B0 h
16 Placa de Vídeo Monocromática
03BF h
03C0 h
16 Placa de Vídeo EGA
03CF h
03D0 h
16 Placa de Vídeo CGA
03DF h
03E0 h
16 Reservado
03EF h
03F0 h
16 Disco Flexível e Porta Serial
03FF h
Mnemônico Descrição
#make_BIN# Diretiva do compilador para gerar um arquivo “.bin”
MOV AX, 5 Registrador AX = 0005 (decimal)
MOV BX, 10 Registrador BX = 0010 (decimal)
ADD AX, BX Faz AX AX + BX AX = 0005 h + 000A h = 000F h (15 dec)
SUB AX,1 Faz AX AX – 0001 h AX = 000F – 0001 = 000E h (14 dec)
HLT Pára programa
V1 DB 4, 3, 2, 1, 0 Valores do vetor V1
V2 DB 0 Valor inicial da variável V2
3. Criar um programa para fazer uma contagem hexadecimal crescente de 00 a FFh e mostrar a contagem
no vídeo e no display de 7- segmentos.
4. Repetir o programa anterior para uma contagem hexadecimal de 0000h até FFFF h, ininterrupta.
5. Criar um programa para fazer uma contagem decimal crescente de 0 a 50, ininterrupta. Mostrar
resultado no display de 7-segmentos.
7. Criar um programa para fazer uma contagem hexadecimal decrescente de FFh a 00 ininterrupta e
mostrar a contagem no vídeo e no display de 7- segmentos.
8. Criar um programa para fazer um contagem decimal decrescente ininterrupta de 50000 a 0. Mostrar no
display de 7-segmentos.
9. Fazer um programa que simula um cronômetro decrescente que conta de 20:00 min até 00:00. Mostrar o
resultado no vídeo, no formato apresentado.
10. Fazer um programa que simula um relógio no formato hh:mm:ss. Mostrar resultado no vídeo.
11. Criar um programa para mostrar três diferentes frases no vídeo, em linhas diferentes.
12. Fazer um programa para somar os elementos de dois vetores de 5 valores, cada. O resultado deve ser
mostrado no vídeo.
13. Fazer um programa para ler dois valores pelo teclado, adiciona-los e mostrar o resultado no display de
7-segmentos.
14. Adapte o programa “stepper_motor” do Emu8086 para que o motor fique girando 10 vezes para um
lado e 10 vezes para o outro lado, ininterruptamente.
15. Adapte o programa “traffic_ligths” do Emu8086 de forma a simular um cruzamento simples, ou seja,
permissão para seguir em frente ou virar à direita para as duas avenidas (sinal de dois tempos).
16. Adapte o programa “traffic_ligths” do Emu8086 de forma a simular um cruzamento onde os dois
sentidos da avenida horizontal tenha permissão para seguir em frente, virar à esquerda ou virar à direita
e os veículos da avenida vertical tenham permissão apenas para seguir em frente ou virar à direita (sinal
de três tempos).
17. Adapte o programa “traffic_ligths” do Emu8086 de forma a simular um cruzamento onde os veículos de
todas as pistas possam seguir em frente, virar à direita ou virar á esquerda (sinal de quatro tempos).