DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
Denny daniel collina apostila de sitemas microprocessados
1. CENTRO FEDERAL DE EDUÇÃO TECNOLÓGICA DE MINAS GERAIS
DEPARTAMENTO DE ENSINO DO SEGUNDO GRAU
COORDENAÇÃO DO CURSO TÉCNICO DE ELETRÔNICA
LABORATÓRIO
DE
SISTEMAS
MICROPROCESSADOS I
Introdução Teórica
Junho/2007 Prof. Denny Daniel Collina
denny@deii.cefetmg.br
2.
3. Índice Analítico
1. Introdução aos Computadores. __________________________________________________________ 5
1.1 O computador. [07] [08] ____________________________________________________________ 5
1.2 Organização básica de um computador. [08] __________________________________________ 6
1.2.1 O microprocessador.______________________________________________________________ 7
1.2.2 Memórias. ______________________________________________________________________ 9
1.2.3 Tipos de memórias _______________________________________________________________ 9
1.2.3.1 RWM - Memórias de leitura e escrita. ____________________________________________ 10
1.2.3.2 ROM - Memórias apenas de leitura.______________________________________________ 11
1.2.4 Memórias de programa e de dados. _________________________________________________ 12
1.3 Linguagens de programação.________________________________________________________ 13
1.3.1 Linguagens de baixo nível. [10] ___________________________________________________ 13
1.3.2 Linguagens de alto nível. [01] ____________________________________________________ 14
1.4 Etapas da elaboração de um programa. [07] ___________________________________________ 15
1.4.1 Compilação e Link-edição. [04] ___________________________________________________ 16
1.4.2 Simulação e execução. ___________________________________________________________ 17
1.5 Questões de revisão._______________________________________________________________ 17
2. O primeiro programa em linguagem assembly. ____________________________________________ 19
2.1 Elaboração do fluxograma.__________________________________________________________ 19
2.2 A configuração básica do computador. _______________________________________________ 20
2.3 Editando o código fonte.____________________________________________________________ 22
2.3.1 Formatação. ____________________________________________________________________ 22
2.4 Executando o assembler. ___________________________________________________________ 23
2.5 Executando o linker. _______________________________________________________________ 26
2.6 Executando o simulador. ___________________________________________________________ 27
2.6.1 Área de Código. ________________________________________________________________ 28
2.6.2 Área dos Registradores. __________________________________________________________ 28
2.6.3 Área de Status do simulador. ______________________________________________________ 29
2.6.4 Pinos de interrupção. ____________________________________________________________ 30
2.6.5 Portas Paralelas. _______________________________________________________________ 30
2.6.6 Área de Dados. _________________________________________________________________ 30
2.6.7 Menu de Comandos._____________________________________________________________ 31
2.6.7.1 Dump. _____________________________________________________________________ 31
2.6.7.2 Help Simulation. _____________________________________________________________ 31
2.6.7.3 Patch Code. ________________________________________________________________ 32
2.6.7.4 Quit Exit. ___________________________________________________________________ 33
2.6.7.5 Reset. _____________________________________________________________________ 33
2.7 Simulando o programa._____________________________________________________________ 33
3. A linguagem assembly para o Z80. [10] ________________________________________________ 35
3.1 Labels. __________________________________________________________________________ 35
3.2 Mnemônicos ou códigos de operação. ________________________________________________ 36
3.3 Operandos._______________________________________________________________________ 36
3.3.1 Constantes numéricas. ___________________________________________________________ 36
3.3.2 Constantes de Caracteres. ________________________________________________________ 36
3.3.3 Operações com Constantes._______________________________________________________ 36
3.4 Comentários. _____________________________________________________________________ 37
3.5 Pseudo-instruções. ________________________________________________________________ 37
3.6 Cuidados ao se definir variáveis e constantes. _________________________________________ 40
Índice. I
4. 4. As Instruções do μPZ80________________________________________________________________ 43
4.1 Instruções de transferência de 8 bits. _________________________________________________ 44
4.2 Instruções de transferência de 16 bits. ________________________________________________ 46
4.3 Instruções aritméticas e lógicas. _____________________________________________________ 49
4.3.1 Registrador de flags. _____________________________________________________________ 49
4.3.2 Operações aritméticas com operandos em 8 bits. _______________________________________ 51
4.3.3 Instruções de comparação. ________________________________________________________ 52
4.3.4 Operações com valores codificados em BCD.__________________________________________ 53
4.3.5 Operações aritméticas com operandos em 16 bits. ______________________________________ 54
4.3.6 Operações lógicas. ______________________________________________________________ 55
4.4 Modos de endereçamento. __________________________________________________________ 57
4.4.1.1 Endereçamento direto ou estendido.______________________________________________ 57
4.4.1.2 Endereçamento de registrador. __________________________________________________ 57
4.4.1.3 Endereçamento imediato e imediato estendido. _____________________________________ 57
4.4.1.4 Endereçamento relativo. _______________________________________________________ 58
4.4.1.5 Endereçamento indireto. _______________________________________________________ 58
4.4.2 Endereçamento indireto utilizando os pares BC e DE. ___________________________________ 59
4.4.3 Endereçamento indireto utilizando o par HL. ___________________________________________ 60
4.5 Instruções de desvio. _______________________________________________________________ 62
4.5.1 Instruções de desvio absoluto incondicional. ___________________________________________ 63
4.5.2 Instruções de desvio absoluto condicional. ____________________________________________ 63
4.5.3 Instruções de desvio relativo incondicional. ____________________________________________ 64
4.5.4 Instruções de desvio relativo condicional. _____________________________________________ 65
4.6 Instruções de subrotina e de pilha.____________________________________________________ 66
4.6.1 Instruções de subrotina.___________________________________________________________ 67
4.6.1.1 Chamada de subrotina incondicional. _____________________________________________ 67
4.6.1.2 Chamada de subrotina condicional. ______________________________________________ 68
4.6.1.3 Retorno de subrotina incondicional. ______________________________________________ 68
4.6.1.4 Retorno de subrotina condicional. ________________________________________________ 69
4.6.2 Instruções de pilha. ______________________________________________________________ 69
4.7 Instruções de rotação e deslocamento. ________________________________________________ 73
4.7.1 Instruções de rotação. ____________________________________________________________ 74
4.7.2 Instruções de deslocamento. _______________________________________________________ 77
4.8 Instruções de entrada e saída. _______________________________________________________ 77
4.9 Instruções de controle da CPU._______________________________________________________ 79
A. O Código ASCII. ______________________________________________________________________ 81
B. O Conjunto Completo de Instruções do Z80. ______________________________________________ 83
B.1 Instruções de Transferência de 8 bits._________________________________________________ 83
B.2 Instruções de Transferência de 16 bits.________________________________________________ 84
B.3 Instruções de Permuta, Transferência de blocos e Pesquisa de grupos. ____________________ 85
B.4 Instruções Aritméticas de 8 bits. _____________________________________________________ 86
B.5 Instruções Aritméticas de 16 bits. ____________________________________________________ 86
B.6 Instruções de propósito geral e de controle da CPU _____________________________________ 87
B.7 Instruções de Rotação e Deslocamento _______________________________________________ 87
B.8 Instruções de Manipulação de bit. ____________________________________________________ 88
B.9 Instruções de Entrada e Saída _______________________________________________________ 89
B.10 Instruções de Desvio ______________________________________________________________ 90
B.11 Instruções de Chamada e Retorno de subrotina. _______________________________________ 90
C. Referências Bibliográficas._____________________________________________________________ 91
Índice II
5. Índice de Instruções
ADC A,byte ___________________________50 LD (DE),A ____________________________ 57
ADC A,reg8 ____________________________50 LD (end),A ___________________________ 43
ADC HL,reg16 __________________________53 LD (end),reg16 ________________________ 45
ADD A,(HL) ___________________________60 LD (HL), reg8 ________________________ 58
ADD A,byte ___________________________49 LD A,(BC) ____________________________ 57
ADD A,reg8 ____________________________49 LD A,(DE) ____________________________ 57
ADD HL,reg16 __________________________52 LD A,(end) ___________________________ 42
AND (HL) _____________________________58 LD reg,byte __________________________ 43
AND byte _____________________________54 LD reg16,(end) ________________________ 44
AND reg8 ______________________________54 LD reg16,dbyte ________________________ 44
BIT n,(HL) ___________________________58 LD reg8,(HL) _________________________ 58
CALL C,end ___________________________66 LD reg8,reg8’ _________________________ 42
CALL end _____________________________65 LD SP,reg16 ___________________________ 70
CALL M,end ___________________________66 NEG __________________________________ 50
CALL NC,end __________________________66 NOP __________________________________ 77
CALL NZ,end __________________________66 OR (HL) ______________________________ 58
CALL P,end ___________________________66 OR byte ______________________________ 54
CALL PE,end __________________________66 OR reg8 ______________________________ 54
CALL PO,end __________________________66 ORG __________________________________ 36
CALL Z,end ___________________________66 OUT (C),reg8 _________________________ 76
CCF __________________________________54 OUT (port),A _________________________ 76
CP (HL) ______________________________60 POP reg16 _____________________________ 69
CP byte ______________________________51 PUSH reg16 ____________________________ 68
CP reg8 _______________________________51 RES n,(HL) ___________________________ 58
CPL __________________________________53 RET __________________________________ 66
DAA __________________________________51 RET C ________________________________ 67
DB ___________________________________37 RET M ________________________________ 67
DCR reg8 ______________________________49 RET NC _______________________________ 67
DEC (HL) _____________________________58 RET NZ _______________________________ 67
DEC reg16 _____________________________53 RET P ________________________________ 67
DEFSEG _______________________________35 RET PE _______________________________ 67
DS ___________________________________38 RET PO _______________________________ 67
DW ___________________________________38 RET Z ________________________________ 67
END __________________________________35 RL (HL) ______________________________ 74
EQU __________________________________36 RL reg8 ______________________________ 74
EX (SP),reg16 _________________________71 RLA __________________________________ 72
EX AF,AF’ ____________________________46 RLC (HL) _____________________________ 73
EX DE,HL _____________________________45 RLC reg8 _____________________________ 73
EXX __________________________________46 RLCA _________________________________ 72
HALT _________________________________77 RR (HL) ______________________________ 74
IN A,(port) __________________________76 RR reg8 ______________________________ 74
IN reg8,(C) ___________________________76 RRA __________________________________ 73
INC (HL) _____________________________60 RRC (HL) _____________________________ 73
INC reg16 _____________________________53 RRC reg8 _____________________________ 73
INC reg8 ______________________________49 RRCA _________________________________ 72
JP (HL) ______________________________61 SBC A,(HL) ___________________________ 58
JP C,end _____________________________62 SBC A,byte ___________________________ 50
JP end _______________________________61 SBC A,reg8 ___________________________ 50
JP M,end _____________________________62 SBC HL,reg16 __________________________ 53
JP NC,end ____________________________62 SCF __________________________________ 55
JP NZ,end ____________________________62 SEG __________________________________ 36
JP P,end _____________________________61 SET n,(HL) ___________________________ 58
JP PE,end ____________________________62 SLA (HL) _____________________________ 75
JP PO,end ____________________________62 SLA reg8 _____________________________ 75
JP Z,end _____________________________62 SRA (HL) _____________________________ 75
JR C,ee ______________________________63 SRA reg8 _____________________________ 75
JR ee ________________________________63 SUB byte _____________________________ 49
JR NC,end ____________________________63 SUB reg8 _____________________________ 49
JR NZ,ee _____________________________63 XOR (HL) _____________________________ 60
JR Z,ee ______________________________63 XOR byte _____________________________ 54
LD (BC),A ____________________________57 XOR reg8 _____________________________ 54
Índice. III
6.
7. CAPÍTULO 1.
1. INTRODUÇÃO AOS COMPUTADORES.
1.1 O computador. [07] [08]1
Desde os primórdios de nossa era, o homem sempre se preocupou em desenvolver máquinas, fossem
elas automáticas ou manuais. Tal preocupação tinha como objetivo minimizar esforços, o desgaste do agente
humano no trabalho e aumentar a produção. A primeira máquina que auxiliava na execução dos cálculos é o
ábaco e data de 500 a.c., veja a Figura 1-1.
As primeiras máquinas eram formadas por engrenagens e correias e podem ser chamados de computa-
dores mecânicos, veja um exemplo na Figura 1-2. Os computadores, como os conhecemos hoje em dia, são
na sua imensa maioria máquinas digitais que operam com informações binárias.
Do que são capazes os computadores? Os com-
putadores executam na maioria das vezes, as mesmas
tarefas que um humano pode executar, mas os compu-
tadores podem fazê-lo com muito maior velocidade e
precisão. Isto devido ao fato de os computadores reali-
zarem todos os seus cálculos e operações um passo
por vez e de demandar uma pequena fração de tempo
para executar cada passo.
Ao contrário dos humanos, um computador não
pensa! Um computador necessita de um jogo completo
de instruções que lhe informem exatamente o que fazer
a cada passo para desenvolver suas tarefas. Este con-
junto de instruções, chamado de programa, é preparado
por uma ou mais pessoas, e é diferente para cada tare- Figura 1-1: O ábaco, primeira máquina de calcular.
fa a ser executada. Estes programas são colocados na
unidade de memória do computador, em forma de códi-
go binário, sendo que cada instrução possui um código
único. O computador lê estes códigos da memória, um
por vez, interpreta-os e executa a operação correspon-
dente.
Seria impossível listar todas as aplicações dos
computadores. Em vez disso, iremos ver dois exemplos:
Ciência e engenharia: Os cientistas e engenhei-
ros usam a matemática como uma linguagem para defi-
nir a operação dos sistemas físicos. Em muitos casos,
as relações matemáticas são extremamente complexas
e devem ser calculadas para muitos valores diferentes
das variáveis do sistema. Um computador pode calcular
estas complexas expressões matemáticas em altas ve-
locidades. Além disso, ele pode executar cálculos repe-
tidos usando diferentes tipos de dados, tabelar os resul-
tados e determinar que conjuntos de valores produzem Figura 1-2: Máquina diferencial de Babbage (1822).
os melhores resultados. Em muitos casos, um compu-
tador pode poupar ao engenheiro horas, ou até mesmo dias, de cálculos tediosos, deixando, assim, mais tem-
po livre para o trabalho criativo.
Controle de processos: O tempo não é um fator crítico quando o computador é utilizado para processar
dados comerciais ou realizar cálculos de engenharia, no sentido de que os resultados não têm necessidade
imediata (isto é, dentro de alguns milisegundos ou segundos). Os computadores são, muitas vezes, usados em
aplicações onde os resultados de seus cálculos são imediatamente necessários para serem utilizados no con-
trole de um processo. Estas são chamadas de aplicações de tempo real. Um exemplo pode ser encontrado no
controle de processos industriais, que é utilizado em fábricas de papel, refinarias de petróleo, etc.
1
Os números entre colchetes indicam as referências bibliográficas utilizadas para a redação do tópico correspondente. A referência com-
pleta pode ser consultada no final desta apostila.
Introdução aos Computadores. 5
8. Como podemos classificar os computadores? Isto vai depender dos critérios utilizados para tal. Se utili-
zarmos tamanho e capacidade de processamento, teremos:
O microcomputador, é o menor e o mais novo membro da família dos computadores. Ele consiste, ge-
ralmente, em vários CI’s, incluindo um chip microprocessador, CI’s de memória e dispositivos de entrada e saí-
da.
Os minicomputadores são maiores que os microcomputadores e têm preços bem mais elevados. Os mi-
nis são largamente utilizados em sistemas de controle industrial, em aplicações científicas nos laboratórios de
pesquisa, e em aplicações comerciais para pequenos negócios. Seu uso ainda ocorre, mas está recebendo
boa concorrência dos microcomputadores que têm apresentado significativo crescimento na velocidade e ca-
pacidade de processamento.
Os maiores computadores, chamados de mainframes são aqueles encontrados em grandes companhias,
bancos, universidades, etc. Eles podem chegar a custar vários milhares dólares. As aplicações dos mainframes
variam da resolução de problemas científicos de engenharia complexos até aplicações comerciais orientadas
para dados, onde a ênfase está na manutenção e atualização de grande quantidade de dados e informações.
1.2 Organização básica de um computador. [08]
Quais os elementos essenciais para se compor um computador? São quatro os elementos essenciais: a
unidade central de processamento, a unidade de memória e as unidades de entrada e saída. A interligação
destas unidades pode ser vista na Figura 1-3.
Unidade de Unidade de
U. C. P.
Entrada Saída
Do mundo Para o
exterior mundo
exterior
Memória
Figura 1-3: Organização básica de um computador.
A Unidade Central de Processamento (UCP) é a composição da Unidade Lógica-Aritmética (ULA), da u-
nidade de Controle e de um conjunto de registradores que normalmente são implementados em um único chip,
o microprocessador (μP).
A Unidade de Controle dirige a operação de todas as outras unidades, fornecendo sinais de tempori-
zação e de controle. De certa forma, a unidade de controle é como o dirigente de uma orquestra, que é
o responsável por manter cada um dos membros da orquestra na sincronização correta.
A Unidade Lógica-Aritmética (ULA) é a área do computador onde são realizadas as operações, arit-
méticas e lógicas, com os dados. O tipo de operação a ser executada é determinado pela unidade de
controle. Os operandos poderão vir tanto da unidade de memória como da unidade de entrada.
A Unidade de Memória (memória primária ou memória do sistema) armazena grupos de dígitos binários
(palavras) que podem representar ou instruções (programa) que o computador deverá executar, ou dados a se-
rem operados pelo programa. A memória serve também para o armazenamento de resultados intermediários e
finais das várias operações. Dentro desta unidade podemos destacar três subgrupos: memórias da família
RAM, da família ROM, e registradores.
A Unidade de Entrada é composta por todos os dispositivos utilizados para receber informações e dados
que são externos ao computador, e introduzi-los nas unidades de memória ou na ULA. Alguns dispositivos de
entrada básicos são: teclados, botões, leitoras de fita, unidades de disco flexível, conversores analógicos-
digitais (ADC’s), etc.
A Unidade de Saída é composta pelos dispositivos utilizados para transferir dados e informações do
computador para o “mundo exterior”. Exemplos de unidades de saída: displays, indicadores luminosos, im-
pressoras, monitores de vídeo, conversores digitais-analógicos (DAC’s), etc.
6 Capítulo 1.
9. 1.2.1 O microprocessador.
Os vários blocos da Figura 1-4 podem ser classificados da seguinte forma:
Conjunto de registradores de armazenamento e de entrada/saída (E/S);
Unidade Lógico-aritmética;
Unidades de controle e temporização (incluindo o controle de interrupção), Lógica de decodificação e
Barramentos.
Figura 1-4: Diagrama em blocos simplificado do Z80.
Figura 1-5: Foto do chip Z80 CPU e o detalhamento de sua pinagem.
Neste momento, podemos utilizar um diagrama mais simplificado composto apenas do conjunto reduzi-
do2 de registradores, como apresentado na Figura 1-6.
Sua arquitetura de registradores, em uma abordagem simplificada, pode ser apresentada como compos-
ta por 20 registradores:
Um contador de programa (PC) de 16 bits;
2
Há, ainda, os registradores de 8 bits: I(interrupt vector) e R(refresh register) que não serão abordados neste curso.
Introdução aos Computadores. 7
10. Dois registradores para uso como ponteiros para a memória de 16 bits cada - (registradores de índi-
ce IX e IY);
Um registrador de 16 bits para uso como ponteiro de pilha - registrador stack pointer (registrador SP);
Um registrador de 8 bits para execução da maioria das operações aritméticas, lógicas, etc., - o acu-
mulador (registrador A);
Um registrador indicador de estado de 8 bits, dos quais apenas 6 são utilizados - registrador de flags
ou registrador de estado (registrador F);
E mais 6 registradores de 8 bits, chamados registradores de propósito geral - B, C, D, E, H, L. Estes
registradores podem, também, ser utilizados ao pares (BC, DE, HL) transformando-se em 3 registra-
dores de 16 bits;
E, por fim mais 8 registradores denominados conjunto alternativo: A’, F’, B’, C’, D’, E’, H’, L’ que
permutam seus valores com o acumulador, o registrador de flags e os registradores de propósito ge-
ral.
μP Z80
16 bits
PC SP
IX IY
8 bits
A F A’ F’
B C B’ C’
D E D’ E’
H L H’ L’
Figura 1-6: Arquitetura de registradores do μP Z80.
Todos os microcomputadores, apesar de variarem em sua arquitetura, têm um elemento em comum - a
pastilha do microprocessador. Como sabemos, o μP funciona como a unidade central de processamento do
microcomputador. Em essência, o μP é o coração do microcomputador, pois suas características definem as
características do microcomputador. Sua velocidade determina a velocidade máxima do microcomputador, e
seus pinos de controle determinam o tipo de interfaceamento de dispositivos de entrada e saída (E/S ou I/O)
que poderá ser utilizado.
O μP executa grande número de funções incluindo:
Provê os sinais de controle e temporização para todos os elementos do microcomputador;
Busca instruções e dados na memória;
Transfere dados de e para os dispositivos de E/S;
Decodifica instruções;
Executa operações aritméticas e lógicas determinadas por instruções;
Responde a sinais de controle gerados pelos dispositivos de E/S; etc.
O μP contém todos os circuitos lógicos para executar estas funções, mas devemos ter em mente que
uma grande parte da lógica interna do μP não é acessível externamente. Os elementos internos do μP são a-
cessíveis por software, isto significa que podemos trabalhar com os circuitos internos do μP apenas com a exe-
cução do programa colocado na memória. Isto é que torna o μP tão versátil e flexível - quando quisermos modi-
ficar a operação do μP, simplesmente modificamos o programa.
A organização básica de um computador, apresentada anteriormente (Figura 1-3), agora pode ser me-
lhor representada com a presença do μP. Na Figura 1-7 podemos observar a interligação do μP com os demais
componentes.
8 Capítulo 1.
11. Figura 1-7: Estrutura típica de um microcomputador de 8 bits.
Os termos microprocessador (μP) e microcontrolador e (μC) costumam ser objeto de confusão por aque-
les que estão sendo apresentados a esta área do conhecimento. Como pudemos ver acima o microprocessa-
dor cumpre a função da unidade central de processamento (UCP) em microcomputador.
Para o caso do microcontrolador, a definição mais simples é: o computador incluso em um único chip
(single chip computer). Portanto, em um chip microcontrolador teremos não só a UCP, como os dispositivos de
entrada e saída, e as memórias RAM e ROM. Os pinos do chip dão acesso apenas aos dispositivos de E/S e a
alguns pinos de controle, clock e alimentação. Veja a Figura 1-8.
Unidade de U. C. P. Unidade de
Entrada Saída
Do mundo
exterior Para o
mundo
exterior
+V
GND
CLK Memória
RAM + ROM
Microcontrolador
Figura 1-8: Diagrama em blocos de um microcontrolador.
1.2.2 Memórias.
1.2.3 Tipos de memórias
Um sistema microprocessado pode dispor de dois tipos de memória: primária (do sistema ou principal) e
secundária (de massa ou de armazenamento).
A memória primária é constituída por células de armazenamento baseadas em semicondutores3. Há du-
as características importantes que permitem subdividir este grupo: a possibilidade de alterar as informações
armazenadas e a sua volatilidade.
3
No passado utilizou-se memórias primárias baseadas em materiais magnéticos: ferrite ou memória de ferrite, que foi substituída pelas
memórias de semicondutores por apresentarem tamanho bastante reduzido.
Introdução aos Computadores. 9
12. Memória primária
Memórias de leitura e escrita Memórias apenas de leitura
(RWM) (ROM)
RAM estática RAM dinâmica
Memórias permanentes Memórias apagáveis
(SRAM) (DRAM)
RAM não volátil RAM dinâmica integrada ROM Mascarável ROM Programável e Apagável
(NVRAM) (iRAM) (Masked ROM) (EPROM)
ROM Programável ROM Programável e Apagável
(PROM) Eletricamente (EEPROM)
Memória Flash
Figura 1-9: Classificação das memórias primárias.
As memórias que compõem este grupo que permitem a alteração das informações nelas armazenadas
são denominadas memórias de leitura e escrita (RWM), que são mais conhecidas por outra sigla (RAM). As
que não permitem alteração são memórias apenas de leitura (ROM).
As memórias podem ser voláteis, ou seja, após o desligamento da energia a informação é perdida, ou
então, podem ser não voláteis. A maioria das RAMs é volátil enquanto que todas as ROMs são não voláteis.
Estas características nos permitem agrupar os vários tipos de memórias semicondutoras de acordo com
a Figura 1-9.
A memória secundária é constituída por dispositivos de armazenamento magnéticos ou óticos, como dis-
cos flexíveis, discos rígidos (HDs), fitas e CD-ROMs, etc. Estes possuem capacidade de armazenamento mui-
to maior que as memórias semicondutoras e não são voláteis. A maioria permite a leitura e a escrita, enquanto
alguns, apenas a leitura.
Neste curso nos concentraremos nas memórias primárias, que são essenciais em qualquer sistema mi-
croprocessado. Vejamos uma breve descrição das memórias apresentadas na Figura 1-9.
1.2.3.1 RWM - Memórias de leitura e escrita.
As memórias que têm estas características são as RAMs que na sua maioria têm, também, uma outra
característica muito importante: são voláteis. Destacamos alguns tipos dos vários existentes para serem apre-
sentadas neste subgrupo:
SRAM (Static Random Access Memory): Esta memória é constituída por células compostas por flip-flops,
ou biestáveis. Cada flip-flop necessita de 6 transistores na sua construção, o que a faz ter um baixo nível de in-
tegração, mas alta velocidade de acesso (veja a Figura 1-10). Esta memória é mais cara e consome mais e-
nergia do que as RAMs dinâmicas (veja a descrição abaixo).
NVRAM (Non volatile RAM): Encontramos duas possíveis implementações com esta designação:
A primeira é composta de um arranjo com uma RAM estática, com uma EEPROM (veja descrição
abaixo) e circuitos monitores de tensão. Logo após o ligamento os dados são copiados da EEPROM
para a RAM e durante o seu funcionamento são lidos e gravados na RAM. Quando a tensão de ali-
mentação cai abaixo de certo valor os dados são copiados da RAM para a EEPROM, evitando assim
que sejam perdidos.
A segunda é conhecida como ZeroPower NVRAM: É uma memória que, em um mesmo encapsula-
mento, contem uma RAM estática construída com tecnologia CMOS (baixo consumo), uma bateria de
lítio e circuitos monitores de tensão. Quando a alimentação externa cai abaixo de 3 V, o circuito moni-
tor de tensão comuta alimentação da RAM para a bateria, mantendo os dados.
10 Capítulo 1.
13. DRAM (Dynamic RAM): Cada célula desta memória é construída por apenas um transistor MOS e de um
pequeno capacitor, veja a Figura 1-11. O armazenamento dos níveis lógicos de um bit ocorre sob a forma de
níveis diferentes de carga do capacitor intrínseco ao circuito. A vantagem deste tipo de memória reside no fato
de ter o número reduzido de componentes por célula, o que traz um grau de integração bastante elevado, além
de ter um consumo bastante reduzido e preço bem inferior, se comparado com o de uma RAM estática equiva-
lente. Há uma desvantagem: o capacitor se descarrega rapidamente, levando a perda da informação se ele
não for recarregado a tempo. Este processo é chamado de refresh e deve ser executado em intervalos de al-
guns milisegundos. Isto faz com que seja necessário adicionar circuitos ao sistema para desempenhar esta ta-
refa. Em função disto este tipo de memória passa a ser economicamente recomendável em sistemas, acima de
uma certa capacidade de armazenamento. Para sistemas pequenos a RAM estática é a recomendada.
Figura 1-10: Diagrama de uma célula de memória Figura 1-11: Diagrama de uma célula de memória
RAM estática. RAM dinâmica.
iRAM (Integrated RAM): Este é um tipo de memória RAM dinâmica onde o circuito de refresh já está dis-
ponível dentro do mesmo encapsulamento da memória. Para o usuário ela funciona de forma similar à RAM di-
nâmica, sem apresentar o inconveniente de ter que adicionar circuitos para efetuar a tarefa de refresh.
1.2.3.2 ROM - Memórias apenas de leitura.
Este subgrupo das memórias tem outra característica muito importante além da descrita no título. Todas
as ROMs são não voláteis, isto quer dizer que o padrão de bits gravados na memória é permanente, não pode
ser alterado.
ROM de máscara (Masked Read Only Memory): Neste tipo de memória a informação nela contida é gra-
vada durante o processo de fabricação, que tem uma de suas etapas denominada mascaramento. Este tipo de
memória só é adquirido através de encomenda direta ao fabricante e os lotes mínimos são de alguns milhares
de unidades. É utilizada em equipamentos com programa já testado e aprovado e produzidos em larga escala,
pois em grandes quantidades apresenta o custo mais baixo dos vários tipos de ROM.
PROM (Programmable ROM): Este tipo de memória é encontrada no comércio, e vem totalmente apa-
gada. O usuário pode, através de equipamento adequado, efetuar sua programação. Uma vez programada não
pode ser apagada e poder ser considerada como uma ROM. Normalmente é utilizada em equipamentos cujo
programa já foi testado e aprovado, mas que não têm um volume de produção para justificar a encomenda de
ROM de máscara. Outra sigla para este tipo de memória é OTPROM (One time programmable ROM)
EPROM (Erasable PROM): É uma memória que em função de sua tecnologia de construção, diferente
da ROM e da PROM, tem a vantagem de poder ser apagada, se necessário. Isto se faz através da exposição
da pastilha à luz ultravioleta durante um intervalo que pode variar de 15 a 30 minutos4. O processo de apaga-
mento é feito com o componente fora do circuito e todo o chip é apagado. Em função da necessidade de se
expor o chip à luz, o encapsulamento de uma EPROM é construído em cerâmica e dotado de uma janela de
quartzo. Estes dois materiais colaboram para o seu alto custo.
EEPROM (Electrically Erasable PROM): Este tipo de memória foi desenvolvida para suplantar algumas
desvantagens das EPROMs: necessidade da retirada do chip do circuito para o apagamento completo para
permitir a regravação, longo tempo de apagamento. A E2PROM é uma memória que pode ser gravada e regra-
vada eletricamente palavra por palavra. Se necessário, o chip pode ser todo apagado em alguns milisegundos.
É possível reprogramar o chip no próprio circuito, desde que o sistema tenha sido projetado para tal. O seu
custo é superior ao de uma EPROM.
4
É bastante difícil de precisar o tempo, pois ele é função da intensidade luminosa emitida pela lâmpada, da distância do chip à lâmpada e
da tecnologia de fabricação do componente.
Introdução aos Computadores. 11
14. Memória Flash: Ou flash E2PROM, é uma variante da E2PROM, sua principal diferença refere-se ao fato
de que ela não permite o apagamento de uma palavra apenas. Deve-se apagar todo o chip, ou um setor, para
que se possa regrava-lo. Apesar deste inconveniente, as memórias flash que têm a vantagem de possuírem
células com estrutura mais simples que as E2PROMs e permitem um maior nível de integração o que permite a
redução de seu custo.
OBS.: Em tempo: recentemente (janeiro de 2005) já se teve notícia de alguns fabricantes produzindo mi-
crocontroladores com memória flash apagável byte-a-byte. Isto elimina, talvez o grande inconveniente deste ti-
po de memória.
1.2.4 Memórias de programa e de dados.
Observando a Figura 1-5 vemos que o μP Z80 dispõe de um barramento de endereços de 16 bits (A0 até
A15), isto nos permite dizer que ele pode endereçar até 216 posições de memória. Mais especificamente quer
dizer que o microprocessador tem capacidade de acessar até 64 KBytes5 de informação.
Mas que tipo de informação pode ser armazenada na memória? Podemos, inicialmente, classificar a in-
formação em dois grandes grupos: programa e dados. Já vimos que o programa é o conjunto de instruções que
comanda o funcionamento do microprocessador para que ele resolva uma determinada tarefa. Os dados en-
globam um conjunto de informações bastante variado, que podem ser: aquelas que microprocessador leu da
unidade de entrada, os valores intermediários gerados durante o processamento, os valores finais que vão ser
enviados para a unidade de saída, as variáveis, tabelas de constantes, mensagens pré-formatadas, etc. Por-
tanto, as informações contidas na memória do computador devem ser separadas de forma bem organizada pa-
ra que possamos acessá-las com facilidade.
Inicialmente efetuaremos a divisão da memória em dois grandes blocos. A cada parte daremos o nome
de segmento de memória. E a partir deste momento, iremos nos referir à memória de forma mais específica:
memória de dados (ou segmento de dados) e memória de programa (ou segmento de programa). Mais à fren-
te, verá que a memória poderá ser dividida em outros segmentos. No item seguinte, serão apresentados os
meios de que a linguagem assembly dispõe para efetuar divisão organizada da memória.
Uma forma visual de representar a memória de um computador é o mapa de memória, que nada mais é
do que uma tabela onde identificamos o que está armazenado em cada bloco de memória. Em alguns casos,
pode-se chegar ao ponto de identificar individualmente o tipo de informação contido em cada posição de me-
mória. Veja a Figura 1-12
0000h Segmento de programa
vazio
vazio
Segmento de dados
vazio
vazio
Vazio
FFFFh
Figura 1-12: Exemplo de um mapa de memória.
Observando a Figura 1-12, vemos que o mapa de memória não está todo preenchido, há espaços vazi-
os. Na verdade foi dito que o μP Z80 tem capacidade de endereçar até 64 KBytes. Não há a obrigatoriedade de
se preencher todo o mapa de memória. Utiliza-se a quantidade de memória necessária para o funcionamento
adequado do equipamento.
Outro ponto a observar é que não existe a obrigatoriedade do segmento de programa estar posicionado
na memória “antes” do segmento de dados. Estes segmentos podem ser alocados na memória em qualquer
ordem ou seqüência.
5
Convém ressaltar que o prefixo “K”, aqui difere do usado em engenharia “k” por ter valor multiplicador de 1024.
12 CAPÍTULO 1.
15. 1.3 Linguagens de programação.
1.3.1 Linguagens de baixo nível. [10]
Para que possa haver comunicação existem várias maneiras de uma pessoa expressar as idéias que
tem em mente, de forma que possam ser recebidas e entendidas por outra pessoa. A troca de informações de-
ve ser feita através de uma linguagem comum ao emissor e ao receptor.
Da mesma maneira, o microprocessador deve receber informações, interpretá-las e executá-las, porém o
microprocessador e os demais circuitos usam para troca de informações sinais elétricos e, desta forma, a ma-
neira mais prática de codificar as informações é na forma binária.
Um programa a ser executado por um microprocessador (μP) deve estar armazenado na memória de
forma que em cada posição deva existir uma informação codificada em um certo número de dígitos binários:
a instrução. Não são apenas as instruções que devem estar armazenadas na forma binária, temos ainda os
dados e os endereços. Esta maneira de codificar as informações é bastante simples e rápida para a máquina;
difícil e trabalhosa, porém, para nós.
Este conjunto de informações apresentado na forma binária, que é compreendido pelo μP constitui uma
linguagem que chamamos de linguagem de máquina ou código objeto. Na Figura 1-13 podemos observar um
pequeno programa exemplo em linguagem de máquina para o μP Z80.
A linguagem de máquina é própria de cada μP e é definida pelo fabricante, durante a etapa de desen-
volvimento do μP. É muito comum que o código objeto de μP não seja compatível com o de outro. Podemos ci-
tar como uma das exceções a esta regra a compatibilidade de código entre os microprocessadores 8085 e Z80.
Um programa em linguagem de máquina é longo e confuso para o ser humano, porém, pode-se repre-
sentá-lo de uma forma mais simples, utilizando-se, ao contrário da base binária, a base hexadecimal. Pois, co-
mo sabemos, a conversão de binário para hexadecimal é bastante simples. Veja a Figura 1-14.
Endereço na memória Conteúdo Endereço Conteúdo
0000 0000 0000 0000b 0011 1110b 0000h 3Eh
0000 0000 0000 0001b 1000 0000b 0001h 80h
0000 0000 0000 0010b 1101 0011b 0002h D3h
0000 0000 0000 0011b 0001 1111b 0003h 1Fh
0000 0000 0000 0100b 0010 0001b 0004h 21h
0000 0000 0000 0101b 0000 0000b 0005h 00h
0000 0000 0000 0110b 0001 0000b 0006h 10h
0000 0000 0000 0111b 0111 1110b 0007h 7Eh
0000 0000 0000 1000b 0010 0011b 0008h 23h
0000 0000 0000 1001b 1000 0110b 0009h 86h
0000 0000 0000 1010b 0010 0111b 000Ah 27h
0000 0000 0000 1011b 1101 0011b 000Bh D3h
0000 0000 0000 1100b 0001 0111b 000Ch 17h
0000 0000 0000 1101b 0011 1111b 000Dh 3Fh
0000 0000 0000 1110b 0000 0001b 000Eh 01h
0000 0000 0000 1111b 1101 1010b 000Fh DAh
0000 0000 0001 0000b 0001 0011b 0010h 13h
0000 0000 0001 0001b 0000 0000b 0011h 00h
0000 0000 0001 0010b 1010 1111b 0012h AFh
0000 0000 0001 0011b 1101 0011b 0013h D3h
0000 0000 0001 0100b 0000 1111b 0014h 0Fh
0000 0000 0001 0101b 0111 0110b 0015h 76h
Figura 1-13: Programa em linguagem de máquina Figura 1-14: O mesmo programa apresentado em
para o μP Z80, apresentado em binário. hexadecimal.
Como o próprio nome diz, a linguagem de máquina é muito mais voltada para a máquina que para o ser
humano. Evidentemente os primeiros computadores eram programados em linguagem de máquina, entretanto
esta linguagem possui uma série de inconvenientes, tais como: os programas são muitos longos, cansativos de
serem carregados na memória, são difíceis de serem entendidos e não ilustram as operações que o μP irá e-
xecutar. Também são bastante susceptíveis a erros, os quais são difíceis de serem encontrados e corrigidos.
Por apresentar estas características, a linguagem de máquina recebe a designação de linguagem de baixo ní-
vel.
Com a evolução dos computadores rapidamente apareceram linguagens mais apropriadas para o traba-
lho do ser humano, facilitando a tarefa de programação. A linguagem assembly ou linguagem simbólica, é con-
siderada, ainda, como linguagem de baixo nível. Ela foi um primeiro passo na evolução da linguagem de pro-
gramação, pois um programa em linguagem assembly possui a mesma seqüência de instruções do programa
Introdução aos Computadores. 13
16. em linguagem de máquina; certos números, porém, são substituídos por símbolos que são mais ilustrativos pa-
ra o programador. Além disso, cada linha de programa em linguagem assembly digita-se apenas uma instrução
completa. O μP Z80 dispõe de instruções que ocupam 1, 2, 3 e até 4 bytes, portanto, ao se traduzir uma linha
de assembly para linguagem de máquina pode-se implicar na utilização de até 4 bytes no segmento de memó-
ria reservado para o programa.
Uma primeira simbologia utilizada na linguagem assembly é a substituição do código hexadecimal da
instrução pelo mnemônico correspondente ao código da operação. O mesmo acontece com os registradores,
especificados como operandos, que são identificados por uma ou duas letras. No exemplo apresentado na
Figura 1-14 temos como conteúdo da primeira posição de memória o byte 3Eh, o que corresponde a “ld a,“.
O valor em questão corresponde ao mnemônico “ld“, seguido do primeiro operando, o registrador “a,“. Esta
instrução demanda, ainda, um segundo operando (o dado) que está armazenado na posição de memória se-
guinte, ou seja, o byte 80h. Efetuando todas as substituições temos: “ld a,80h”, veja a Figura 1-15.
Com a substituição dos números por símbolos, foi necessário pouco tempo de uso da linguagem assem-
bly para estes tornarem-se familiares. Possibilitou-se uma significativa melhoria para a criação e entendimento
do programa. Porém, além desta existem outras particularidades desta linguagem que facilita a tarefa de pro-
gramação tais como o uso de rótulos (labels) e comentários no programa.
Os labels são nomes simbólicos atribuídos a constantes numéricas, endereços de posições de memó-
rias, endereços de variáveis, etc. Eles têm a função de evitar o uso de valores numéricos no programa, que em
muitas situações, não são tão significativos quanto os símbolos (ou nomes) dos labels.
Voltando à Figura 1-15, podemos observar que a instrução armazenada na posição de memória cujo en-
dereço é 000Fh constitui uma instrução de desvio (condicional) do processamento para o endereço 0013h.
Caso o programa fosse modificado com a inserção ou retirada de instruções, este endereço seria alterado. Se
ao invés de utilizar como operando da instrução de desvio condicional, um número, fosse utilizado um label que
rotulasse a instrução para onde o salto deveria ser executado, alterações no programa não exigiriam alterações
no operando da instrução, evitando assim trabalho adicional para o programador.
Endereço 8085 Z80 Z80
0000h mvi a,80h ld a,80h Inicio: ld a,80h
0002h out 1Fh out (1Fh),a out (1Fh),a
0004h lxi h,1000h ld Hl,1000h ld hl,1000h
0007h mov a,m ld a,(hl) ld a,(hl)
0008h inx h inc Hl inc hl
0009h add M add (hl) add (hl)
000Ah daa daa daa
000Bh out 17h out (17h),a out (17h),a
000Dh mvi a,01h ld a,01h ld a,01h
000Fh jc 0013h jp c,0013h jp c, Saida
0012h xra a xor A xor a
0013h out 0Fh out (0Fh),a Saida: out (0Fh),a
0015h hlt halt halt
Figura 1-15: O programa da Figura 1-13, agora codificado em linguagem assembly para os μPs 8085 e Z80.
1.3.2 Linguagens de alto nível. [01]
A linguagem assembly já facilitou muito o trabalho de programação, porém, com o passar dos tempos,
surgiu a necessidade de linguagens melhores. Essas novas linguagens são mais voltadas para o problema a
ser resolvido, desprendendo dos aspectos inerentes ao equipamento que será utilizado. Apresentam uma es-
trutura técnica, formada por instruções que são decodificadas em diversas instruções de máquina; são, ainda,
linguagens universais, não dependendo do repertório de instruções estabelecido pelos fabricantes dos micro-
processadores.
Com linguagens deste tipo temos a seguintes vantagens:
Os programas podem ser escritos de maneira concisa e mais rápida;
Para programar não há a necessidade de conhecerem-se as características do sistema nem a lin-
guagem de máquina do microprocessador envolvido;
Os programas nestas linguagens podem ser transferidos facilmente de um computador para o outro
(portabilidade);
A linguagem está mais próxima da utilizada para a formulação do problema, sendo assim mais próxi-
ma do homem que da máquina.
14 CAPÍTULO 1.
17. É neste contexto que se inserem as linguagens de alto Início
nível ou linguagens automáticas que foram responsáveis pela
Etapa 1
crescente difusão dos computadores provocando a sua utili-
Programa: editor de texto
zação em massa, pois o usuário passou a não ter mais a ne- Função: edição do arquivo fonte
cessidade de conhecer a fundo a máquina e nem sua lingua- Resultado: programa fonte ".asm"
gem assembly. Bastam conhecimentos matemáticos ou es- Etapa 2
pecíficos de sua área e o conhecimento dos detalhes da lin- Programa: assembler
guagem de alto nível. Outra razão é que o usuário tem a Função: tradução para código objeto
possibilidade de usar programas prontos, desenvolvidos por Resultado: arquivo objeto ".obj"
outros, e que não dependem do equipamento que ele possui, Etapa 3
crescendo rapidamente o número de pacotes de programas Programa: linker
disponíveis. Função: montagem e geração do código executável
Resultado: arquivo executável ".hex"
Etapa 4
Programa: simulador
1.4 Etapas da elaboração de um programa. [07] Função: depuração do programa
Resultado: correção de alguns erros
A programação de um sistema é a construção correta
da seqüência de instruções que este vai realizar para condu-
zir à solução do problema. Esta seqüência de instruções é Pronto para a N
variável, pois a programação possui uma ampla variedade de execução real
alternativas e opções que dependem do programador que, ?
através de várias maneiras, atinge os mesmos resultados. S
Etapa 5
Programas mais elaborados exigem uma metodologia Execução real - Programa executado pelo
de trabalho, sem a qual, torna-se impossível fazer uma pro- microprocessador utilizando E/S real ou simulada
gramação correta. Essencialmente, o projeto de um progra-
ma a ser processado por um computador deve ter os seguin-
tes procedimentos:
O programa N
Análise do problema; está correto
?
Determinação do algoritmo (opcional, mas altamen- S
te recomendável); Fim
Escrever o programa em linguagem simbólica (edi-
ção); Figura 1-16: Fluxo de elaboração e depuração
de um programa.
Traduzir o programa para linguagem de máquina
(compilação e link-edição);
Testar e corrigir o programa (depuração).
Na análise do problema, deve ser determinado de maneira bem clara quais os objetivos que devem ser
alcançados e exatamente que tarefa deve ser realizada. Se este programa for processado em um equipamento
já disponível, verificar sua capacidade de execução do programa, sua capacidade de memória, seus periféricos
e sua unidade central de processamento. Caso este programa seja para um equipamento que está sendo de-
senvolvido, definir primeiro todo o hardware deste equipamento. Também deve ficar bem claro quais as saídas
que devemos dar a cada entrada, e que dispositivos de entrada e saída fornecerão estas informações.
O algoritmo a ser determinado deve estabelecer quais equações ou conjuntos de regras e operações
que devem ser submetidos os dados para que sejam obtidos os resultados esperados. Dependendo da com-
plexidade e finalidade do programa os algoritmos podem ser mais complexos, e sua perfeita determinação é
fundamental para o projeto do programa.
O algoritmo pode ser escrito de forma descritiva ou através de um diagrama de blocos (como o digrama
visto na Figura 1-16). A forma descritiva nos remete basicamente à escrita de um texto. É extremamente indi-
cada quando trabalhamos com linguagens de alto nível.
Já o fluxograma é aplicado quando utilizamos linguagens de baixo nível, como o assembly. Ao escre-
vermos o fluxograma, temos a possibilidade de utilizar o recurso de refinamento sucessivo, que é basicamente,
representar um comando, normalmente complexo, em um único bloco. Posteriormente faz-se um novo fluxo-
grama que detalhe este comando. Portanto, podemos obter um conjunto de fluxogramas: o que podemos cha-
mar de principal, apresenta um número reduzido de blocos e nos permite ter uma visão do conjunto do progra-
ma. Em seguida, podemos ter um ou mais fluxogramas detalhando cada um dos blocos do fluxograma princi-
pal. A elaboração do fluxograma é de grande auxílio na hora de se escrever o programa e quase fundamental
para a sua correção (depuração).
Introdução aos Computadores. 15
18. As três etapas a seguir: edição, compilação e depuração são, normalmente, repetidas várias vezes até
que se obtenha o programa funcionando corretamente. Veja o fluxograma da Figura 1-16.
Para escrever o programa (edição) deve ser primeiramente determinado o tipo de linguagem que será u-
tilizada, se uma linguagem de baixo nível ou alto nível. Isto depende de se ter disponível um sistema de desen-
volvimento ou não e que tipos de linguagem este sistema tem condições de interpretar. Quanto mais complica-
do for o programa, mais interessante será a utilização de linguagem de alto nível. Isto torna o programa mais
fácil de ser entendido por possuir uma sintaxe mais clara.
A tradução do programa fonte (compilação) pode até ser feita manualmente em programas escritos em
linguagens de baixo nível, devido ao fato que cada instrução possui um código de máquina correspondente. No
entanto, este processo é lento, tedioso e suscetível a erros. Na prática, utilizam-se programas para a tradução
do programa fonte em código de máquina.
Para testar e corrigir o programa (depuração) existe uma série de artifícios que auxiliam este procedi-
mento, desde programas de simulação, assim como a partição do programa em pequenos fragmentos para fa-
cilitar sua análise e a descoberta dos erros (bugs).
1.4.1 Compilação e Link-edição. [04]
A conversão manual de um programa fonte em assembly para linguagem de máquina (código objeto) é
possível de ser executada - mesmo que implique em uma tarefa cansativa, tediosa e passível de erros, o que
não ocorre com um programa em linguagem de alto nível. Para este trabalho árduo utiliza-se o próprio compu-
tador com um programa especialmente desenvolvido para a execução desta tarefa.
Os aplicativos que traduzem um programa fonte para a linguagem de máquina são chamados programas
tradutores. Sua função é a de ler cada linha do programa e efetuar a conversão para código de máquina po-
dendo executar estas instruções ou não. Normalmente ainda gera-se uma listagem completa do código objeto.
Os programas tradutores mais comuns são:
O Programa Assembler: É um programa voltado para converter um código fonte, escrito em linguagem
assembly, para um programa objeto em linguagem de máquina. Existem diversos tipos de assemblers, pois
como foi visto, cada microprocessador possui uma linguagem assembly diferente, e também para um mesmo
μP podem existir programas assemblers diferentes, dependendo de quem desenvolveu este programa. Nor-
malmente, o programa assembler:
Traduz o programa fonte;
Armazena o programa objeto em memória ou em disco;
Fornece uma listagem do programa fonte resultante, do código objeto resultante;
Uma tabela de símbolos (labels) e
Uma listagem de erros de sintaxe.
O Programa Compilador: É a designação dada ao aplicativo que traduz programa fonte, escrito em lin-
guagem de médio ou de alto nível, para programa objeto, em linguagem de máquina. Existem diversos tipos de
compiladores, um para cada linguagem: compilador Pascal, compilador C, etc.
O Programa Interpretador: É também voltado para linguagens de alto nível. Este não produz um progra-
ma objeto e, sim, toma uma instrução do programa fonte, traduz e executa imediatamente. Após isto, retira no-
va instrução do programa fonte, traduz e executa, e assim por diante. Desta forma o programa fonte é executa-
do imediatamente, sem que seja necessário esperar pelo programa objeto e depois executá-lo. Porém, o pro-
grama fonte executado linha por linha, tendo antes a tradução de cada linha, tem o tempo de execução aumen-
tado.
Uma vez obtido o código objeto, proveniente de um assembler ou de um compilador, é necessário ainda
convertê-lo em código executável. O processo de montagem (ou tradução) efetuado por um dos dois progra-
mas já citados, gera um código objeto com a característica de poder ser armazenado em qualquer lugar da
memória do computador - código objeto relocável. É necessário, então, submeter este código ao programa lin-
ker (ligador, encadeador) para torná-lo um código objeto absoluto, ou seja, cujos endereços de alocação na
memória do computador já estejam definidos. Esta definição é essencial para que as instruções de desvio te-
nham seus operandos corretamente calculados. Este código de máquina resultante chamamos de código exe-
cutável pois ele está pronto para ser processado pelo microprocessador. O linker pode efetuar o encadeamento
de um ou vários códigos objeto, bastando para tal que a lista dos arquivos que os contêm seja fornecida.
16 CAPÍTULO 1.
19. 1.4.2 Simulação e execução.
A etapa final do processo de elaboração de um programa consiste da verificação de seu funcionamento.
Isto se faz pela execução do código executável que pode ser feita de duas formas: a execução direta na má-
quina ou sua simulação através de programas adequados.
A execução por meio de simulação, ocorrendo antes da execução direta no equipamento microproces-
sado, permite-nos obter maior eficiência no processo de elaboração de um programa. Através da simulação é
possível obter um conjunto muito maior de informações sobre a evolução do programa em desenvolvimento do
que teríamos ao executá-lo diretamente no equipamento real. Informações como conteúdo de registradores e o
estado de outros circuitos internos ao microprocessador nem sempre são facilmente obtidos nos equipamen-
tos. Ao contrário, a simulação do μP nos permite a execução em modo passo-a-passo e até retornar o proces-
samento, “retroceder a simulação”, permitindo que uma mesma seqüência de instruções possa ser executada
mais de uma vez.
Ocorre que, na maioria dos casos, os programas simuladores são para arquiteturas de microprocessado-
res genéricas e, em alguns casos, onde o programa em desenvolvimento depende de uma interação com o
hardware do equipamento, sua simulação deixa a desejar. Este é o caso, por exemplo, da necessidade de ler
dados do teclado do equipamento, ou de apresentar um resultado no display. Ainda assim, para estes casos,
onde um programa simulador genérico não dispõe de funções que simulem o hardware periférico ao micropro-
cessador, é possível, através de pequenos artifícios, contornar a situação e tirar proveito do simulador.
Podemos dizer que a utilização da simulação vai nos auxiliar a resolver a grande maioria dos problemas
de um programa em elaboração. Uma parte muito pequena dos problemas, ou falhas, a qual depende da inte-
ração com o hardware, é que só poderá ser resolvida pela execução direta no equipamento.
Apesar da defesa feita em favor das ferramentas de simulação, em momento nenhum se teve a intenção
de proclamar a infalibilidade desta ferramenta. É interessante salientar que a ferramenta da simulação deve ser
encarada como uma das etapas no processo de elaboração de um programa.
Sendo assim, o passo seguinte à simulação é o da execução real, na máquina, do código desenvolvido,
e já parcialmente depurado. E só após esta etapa, que deve ser constituída de testes que busquem ser os mais
reais possíveis ao contexto em que o equipamento será empregado, é que podemos atestar o bom funciona-
mento ou não de um programa.
1.5 Questões de revisão.
Após a leitura do texto desta prática introdutória, efetue uma revisão respondendo às questões seguintes:
01. Classifique os computadores de acordo com sua capacidade de processamento.
02. Quais são os elementos essenciais de um computador?
03. Que características de um microcomputador são definidas pelo microprocessador que o compõe?
04. Defina programa e dados.
05. Cite um exemplo do uso do computador, diferente daqueles apresentados no texto da Prática 0.
06. Durante o processamento, o microprocessador (μP) provê um grande número de funções, cite-as.
07. O que torna o microprocessador uma máquina extremamente versátil?
08. Caracterize as memória RAM e ROM. Que tipo de informação cada uma pode conter? Cite exemplos.
09. Explique o significado dos termos “leitura” e “escrita”.
10. O que acontece se, em um determinado programa, existir uma instrução para escrever dados na ROM?
11. Do que é formada a linguagem de máquina? Qual é a característica comum entre as linguagens de má-
quina dos microprocessadores dos vários fabricantes?
12. Por que se utiliza a representação na base hexadecimal da linguagem de máquina?
13. Caracterize e descreva brevemente a linguagem assembly.
14. Defina label. Qual a vantagem da sua utilização na elaboração de programas?
15. Defina linguagem de baixo nível.
16. Defina linguagem de alto nível e cite suas vantagens.
17. Cite as etapas componentes da elaboração de um programa de computador.
18. Defina programa tradutor e descreva os tipos existentes.
19. O que se entende por “depuração” de um programa?
20. Qual a validade da simulação no processo de desenvolvimento de um programa?
21. Existe apenas uma linguagem assembly? Explique.
Introdução aos Computadores. 17
20.
21. CAPÍTULO 2.
2. O PRIMEIRO PROGRAMA EM LINGUAGEM ASSEMBLY.
Neste capítulo iremos descrever em detalhes as etapas que compõem o processo de criação de um pro-
grama em linguagem assembly para o μP Z80, como apresentado na Figura 1-16 da página 15.
Mesmo sem ter apresentado formalmente o conjunto de instruções do μP Z80, utilizaremos apenas al-
gumas instruções bastante elementares para compor o nosso primeiro programa. Mais à frente, todas elas se-
rão abordadas em detalhe.
É importante relembrar o que foi exposto no item 1.4 , na página 15: o momento da edição de um pro-
grama constitui a quarta etapa de um “projeto”. Ela é precedida pela análise do problema, pela determinação
do algoritmo e pela elaboração do fluxograma. Saltaremos as duas primeiras etapas e iniciaremos pela elabo-
ração do algoritmo. É bom lembrar que, como foi apresentado anteriormente, utiliza-se o fluxograma como “fer-
ramenta” de descrição do algoritmo em linguagens de baixo nível, como é o caso da linguagem assembly que
utilizaremos.
2.1 Elaboração do fluxograma.
Para efeito de padronização, iniciaremos apresentando o formato de alguns dos blocos mais usados na
elaboração de fluxogramas.
Início Terminador: é utilizado para representar o início e o fim do programa.
y = x +5
2 Processo: neste bloco especificamos as operações, cálculos, tarefas, ou
seja, o processamento que deve ser executado.
sin(x) Subrotina: representa um processamento pré-definido, a solução de uma
função, ou mesmo um sub-programa.
Tomada de decisão: Este bloco representa o momento de um teste boole-
S ano, que se tiver resultado verdadeiro (S = sim = verdadeiro) implicará no
?
desvio do processamento. Caso o teste tenha resultado falso, o processa-
N mento prosseguirá normalmente.
Dados Entrada de dados: Bloco que representa a entrada de dados, ou seja, a co-
leta de informação vinda do ambiente externo ao programa.
Teclado
Entrada manual: Bloco que representa a entrada de informação gerada pe-
lo usuário (ou operador) do equipamento.
Papel
Saída de dados: Bloco que representa a operação saída de dados em pa-
pel, ou seja, impressão.
Display
Saída de dados: Bloco que representa a operação saída de dados em um
dispositivo de exibição que pode ser um display, um monitor de vídeo,
1
Conector: Símbolo que indica a continuidade do processo em outro ponto,
na mesma página.
1 Conector: Símbolo que indica a continuidade do processo em outro ponto,
em outra página.
Setas: Indicam o sentido do fluxo do processamento
Como já devem ter observado, a Figura 1-16 apresenta um fluxograma.
Problemas Propostos:
P1: Criar um programa que busque da memória os valores armazenados nas posições 1000h e 1001h,
some-os e, em seguida, armazene o resultado na posição de memória 1002h.
O primeiro programa em linguagem assembly. 19
22. P2: Criar um programa que busque da memória os valores armazenados nas posições 1000h e 1001h,
some-os e, em seguida, armazene o resultado na posição de memória 1002h. Repetir esta opera-
ção enquanto o resultado da soma não for zero.
P3: Criar um programa que faça piscar indefinidamente, a intervalos de 1 segundo, um led ligado à por-
ta de saída a partir do momento em que a chave ligada à porta de entrada for levada a nível alto.
Vamos aos fluxogramas:
Início Início Início
Ler o valor da Ler o valor da Fazer saída = 0
posição 1000h posição 1000h (led apagado)
Ler o valor da Ler o valor da Ler
posição 1001h posição 1001h chave
Somar os dois Somar os dois
valores valores Chave = 0 S
?
N
Armazenar o Armazenar o
resultado na resultado na
posição 1002h posição 1002h Fazer saída = 1
(led aceso)
Fim
Resultado S
≠0? Subrotina
de tempo =
1segundo
N
Fim
Fazer saída = 0
(led apagado)
Figura 2-1: Fluxogramas para a solução dos problemas propostos P1, P2 e P3, respectivamente.
O programa P1 pode ser traduzido em um fluxograma linear, onde o processamento seguiu contínuo
sem desvios. Já os programas P2 e P3 necessitaram de fluxogramas com desvios de processamento em fun-
ção das suas proposições que apresentavam condições. Outro ponto a salientar é que o programa P3 apre-
senta um início, mas não apresenta término (pois foi proposto desta forma), ou seja, é um programa que entra
em uma condição de repetições infinitas (loop infinito).
Mas, como ou quando termina um programa em loop infinito? Termina quando o processador for desli-
gado.
2.2 A configuração básica do computador.
Na Figura 2-2 apresentamos o diagrama em blocos (simplificado) do hardware que iremos trabalhar. Na
Figura 2-3 apresentamos o diagrama eletrônico com o circuito completo.
Os principais componentes do circuito deste computador são:
Um microprocessador de 8 bits: Z80A-CPU, fabricado pela Zilog;
Lógica de decodificação formada por dois CIs decodificadores 74LS138;
2K bytes de memória EPROM, chip 2716, ocupando a faixa de endereços de 0000h a 07FFh;
2K bytes de memória RAM estática, chip 6116, ocupando a faixa de endereços de 1000h a 17FFh;
2 portas paralelas de entrada, de 8 bits cada, chips 74LS244, ocupando os endereços de E/S 00h e
01h e
20 Capítulo 2.