Denny daniel collina apostila de sitemas microprocessados

93
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 [email protected]

description

 

Transcript of Denny daniel collina apostila de sitemas microprocessados

Page 1: Denny daniel collina   apostila de sitemas microprocessados

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 [email protected]

Page 2: Denny daniel collina   apostila de sitemas microprocessados
Page 3: Denny daniel collina   apostila de sitemas microprocessados

Índice. I

Í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

Page 4: Denny daniel collina   apostila de sitemas microprocessados

Índice II

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

Page 5: Denny daniel collina   apostila de sitemas microprocessados

Índice. III

Índice de Instruções

ADC A,byte ___________________________50 ADC A,reg8____________________________50 ADC HL,reg16 __________________________53 ADD A,(HL) ___________________________60 ADD A,byte ___________________________49 ADD A,reg8____________________________49 ADD HL,reg16 __________________________52 AND (HL) _____________________________58 AND byte _____________________________54 AND reg8______________________________54 BIT n,(HL) ___________________________58 CALL C,end ___________________________66 CALL end _____________________________65 CALL M,end ___________________________66 CALL NC,end __________________________66 CALL NZ,end __________________________66 CALL P,end ___________________________66 CALL PE,end __________________________66 CALL PO,end __________________________66 CALL Z,end ___________________________66 CCF __________________________________54 CP (HL) ______________________________60 CP byte ______________________________51 CP reg8_______________________________51 CPL __________________________________53 DAA __________________________________51 DB ___________________________________37 DCR reg8______________________________49 DEC (HL) _____________________________58 DEC reg16 _____________________________53 DEFSEG _______________________________35 DS ___________________________________38 DW ___________________________________38 END __________________________________35 EQU __________________________________36 EX (SP),reg16 _________________________71 EX AF,AF’ ____________________________46 EX DE,HL _____________________________45 EXX __________________________________46 HALT _________________________________77 IN A,(port) __________________________76 IN reg8,(C)___________________________76 INC (HL) _____________________________60 INC reg16 _____________________________53 INC reg8______________________________49 JP (HL) ______________________________61 JP C,end _____________________________62 JP end _______________________________61 JP M,end _____________________________62 JP NC,end ____________________________62 JP NZ,end ____________________________62 JP P,end _____________________________61 JP PE,end ____________________________62 JP PO,end ____________________________62 JP Z,end _____________________________62 JR C,ee ______________________________63 JR ee ________________________________63 JR NC,end ____________________________63 JR NZ,ee _____________________________63 JR Z,ee ______________________________63 LD (BC),A ____________________________57

LD (DE),A ____________________________57 LD (end),A ___________________________43 LD (end),reg16 ________________________45 LD (HL), reg8 ________________________58 LD A,(BC) ____________________________57 LD A,(DE) ____________________________57 LD A,(end) ___________________________42 LD reg,byte __________________________43 LD reg16,(end)________________________44 LD reg16,dbyte________________________44 LD reg8,(HL) _________________________58 LD reg8,reg8’_________________________42 LD SP,reg16 ___________________________70 NEG __________________________________50 NOP __________________________________77 OR (HL) ______________________________58 OR byte ______________________________54 OR reg8 ______________________________54 ORG __________________________________36 OUT (C),reg8 _________________________76 OUT (port),A _________________________76 POP reg16 _____________________________69 PUSH reg16 ____________________________68 RES n,(HL) ___________________________58 RET __________________________________66 RET C ________________________________67 RET M ________________________________67 RET NC _______________________________67 RET NZ _______________________________67 RET P ________________________________67 RET PE _______________________________67 RET PO _______________________________67 RET Z ________________________________67 RL (HL) ______________________________74 RL reg8 ______________________________74 RLA __________________________________72 RLC (HL) _____________________________73 RLC reg8 _____________________________73 RLCA _________________________________72 RR (HL) ______________________________74 RR reg8 ______________________________74 RRA __________________________________73 RRC (HL) _____________________________73 RRC reg8 _____________________________73 RRCA _________________________________72 SBC A,(HL) ___________________________58 SBC A,byte ___________________________50 SBC A,reg8 ___________________________50 SBC HL,reg16 __________________________53 SCF __________________________________55 SEG __________________________________36 SET n,(HL) ___________________________58 SLA (HL) _____________________________75 SLA reg8 _____________________________75 SRA (HL) _____________________________75 SRA reg8 _____________________________75 SUB byte _____________________________49 SUB reg8 _____________________________49 XOR (HL) _____________________________60 XOR byte _____________________________54 XOR reg8 _____________________________54

Page 6: Denny daniel collina   apostila de sitemas microprocessados
Page 7: Denny daniel collina   apostila de sitemas microprocessados

Introdução aos Computadores. 5

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-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 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.

Figura 1-1: O ábaco, primeira máquina de calcular.

Figura 1-2: Máquina diferencial de Babbage (1822).

Page 8: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 1. 6

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.

U. C. P. Unidade de

Entrada Unidade de

Saída

Memória

Do mundo exterior

Para o mundo exterior

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.

Page 9: Denny daniel collina   apostila de sitemas microprocessados

Introdução aos Computadores. 7

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.

Page 10: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 1. 8

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.

PC

μP Z80

IX IY

SP 16 bits

A F

B C

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

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.

Page 11: Denny daniel collina   apostila de sitemas microprocessados

Introdução aos Computadores. 9

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.

Para o mundo exterior

U. C. P. Unidade de Entrada

Unidade de Saída

Memória

RAM + ROM

Do mundo exterior

Microcontrolador

+V GND CLK

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.

Page 12: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 1. 10

Memória primária

Memórias de leitura e escrita (RWM)

Memórias apenas de leitura (ROM)

RAM estática (SRAM)

RAM não volátil (NVRAM)

Memórias apagáveisRAM dinâmica(DRAM)

RAM dinâmica integrada(iRAM)

ROM Programável e Apagável (EPROM)

ROM Programável e Apagável Eletricamente (EEPROM)

Memória Flash

ROM Mascarável(Masked ROM)

ROM Programável(PROM)

Memórias permanentes

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.

Page 13: Denny daniel collina   apostila de sitemas microprocessados

Introdução aos Computadores. 11

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

RAM estática.

Figura 1-11: Diagrama de uma célula de memória

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.

Page 14: Denny daniel collina   apostila de sitemas microprocessados

CAPÍTULO 1. 12

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

FFFFh Vazio

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.

Page 15: Denny daniel collina   apostila de sitemas microprocessados

Introdução aos Computadores. 13

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 0000 0000 0000 0000b 0011 1110b 0000 0000 0000 0001b 1000 0000b 0000 0000 0000 0010b 1101 0011b 0000 0000 0000 0011b 0001 1111b 0000 0000 0000 0100b 0010 0001b 0000 0000 0000 0101b 0000 0000b 0000 0000 0000 0110b 0001 0000b 0000 0000 0000 0111b 0111 1110b 0000 0000 0000 1000b 0010 0011b 0000 0000 0000 1001b 1000 0110b 0000 0000 0000 1010b 0010 0111b 0000 0000 0000 1011b 1101 0011b 0000 0000 0000 1100b 0001 0111b 0000 0000 0000 1101b 0011 1111b 0000 0000 0000 1110b 0000 0001b 0000 0000 0000 1111b 1101 1010b 0000 0000 0001 0000b 0001 0011b 0000 0000 0001 0001b 0000 0000b 0000 0000 0001 0010b 1010 1111b 0000 0000 0001 0011b 1101 0011b 0000 0000 0001 0100b 0000 1111b 0000 0000 0001 0101b 0111 0110b

Figura 1-13: Programa em linguagem de máquina para o μP Z80, apresentado em binário.

Endereço Conteúdo 0000h 3Eh 0001h 80h 0002h D3h 0003h 1Fh 0004h 21h 0005h 00h 0006h 10h 0007h 7Eh 0008h 23h 0009h 86h 000Ah 27h 000Bh D3h 000Ch 17h 000Dh 3Fh 000Eh 01h 000Fh DAh 0010h 13h 0011h 00h 0012h AFh 0013h D3h 0014h 0Fh 0015h 76h

Figura 1-14: O mesmo programa apresentado em 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

Page 16: Denny daniel collina   apostila de sitemas microprocessados

CAPÍTULO 1. 14

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.

Page 17: Denny daniel collina   apostila de sitemas microprocessados

Introdução aos Computadores. 15

É neste contexto que se inserem as linguagens de alto nível ou linguagens automáticas que foram responsáveis pela crescente difusão dos computadores provocando a sua utili-zação em massa, pois o usuário passou a não ter mais a ne-cessidade de conhecer a fundo a máquina e nem sua lingua-gem assembly. Bastam conhecimentos matemáticos ou es-pecíficos de sua área e o conhecimento dos detalhes da lin-guagem de alto nível. Outra razão é que o usuário tem a possibilidade de usar programas prontos, desenvolvidos por outros, e que não dependem do equipamento que ele possui, crescendo rapidamente o número de pacotes de programas disponíveis.

1.4 Etapas da elaboração de um programa. [07] 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 é variável, pois a programação possui uma ampla variedade de alternativas e opções que dependem do programador que, através de várias maneiras, atinge os mesmos resultados.

Programas mais elaborados exigem uma metodologia de trabalho, sem a qual, torna-se impossível fazer uma pro-gramação correta. Essencialmente, o projeto de um progra-ma a ser processado por um computador deve ter os seguin-tes procedimentos:

Análise do problema;

Determinação do algoritmo (opcional, mas altamen-te recomendável);

Escrever o programa em linguagem simbólica (edi-ção);

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).

Programa: editor de texto Função: edição do arquivo fonte Resultado: programa fonte ".asm"

Programa: assembler Função: tradução para código objeto Resultado: arquivo objeto ".obj"

Programa: linkerFunção: montagem e geração do código executávelResultado: arquivo executável ".hex"

Programa: simulador Função: depuração do programa Resultado: correção de alguns erros

Execução real - Programa executado pelo microprocessador utilizando E/S real ou simulada

Pronto para a execução real

?

O programa está correto

?

Fim

Início

Etapa 1

Etapa 2

Etapa 3

Etapa 4

Etapa 5

N

S

S

N

Figura 1-16: Fluxo de elaboração e depuração

de um programa.

Page 18: Denny daniel collina   apostila de sitemas microprocessados

CAPÍTULO 1. 16

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.

Page 19: Denny daniel collina   apostila de sitemas microprocessados

Introdução aos Computadores. 17

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.

Page 20: Denny daniel collina   apostila de sitemas microprocessados
Page 21: Denny daniel collina   apostila de sitemas microprocessados

O primeiro programa em linguagem assembly. 19

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 = x2+5

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.

N

S ?

Tomada de decisão: Este bloco representa o momento de um teste boole-ano, que se tiver resultado verdadeiro (S = sim = verdadeiro) implicará no desvio do processamento. Caso o teste tenha resultado falso, o processa-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.

Page 22: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 2. 20

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

Ler o valor da posição 1000h

Ler o valor da posição 1001h

Somar os dois valores

Armazenar o resultado na

posição 1002h

Fim

Resultado ≠ 0 ?

Início

Ler o valor da posição 1000h

Ler o valor da posição 1001h

Somar os dois valores

Armazenar o resultado na

posição 1002h

Fim

Início

Fazer saída = 0 (led apagado)

Chave = 0 ?

Ler chave

Fazer saída = 1 (led aceso)

Subrotina de tempo = 1segundo

Fazer saída = 0 (led apagado)

S

N

S

N

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

Page 23: Denny daniel collina   apostila de sitemas microprocessados

O primeiro programa em linguagem assembly. 21

2 portas paralelas de saída, de 8 bits cada, chips 74LS374, ocupando os endereços de E/S 02h e 03h.

IOREQ\

RD\

WR\

MREQ\

A15

A0

Z80ACPU

D7

D0

A10...A0 CE\

EPROM2716

D7...D0

A10...A0 CS\

RAM6116

D7...D0

G\

Buffer 74LS244

D7...D0

D0

D7

PA - Porta deentrada A

8 bits

G\

Buffer 74LS244

D7...D0

D0

D7

PB - Porta deentrada B

8 bits

CLK

8x FFD74LS374

D7...D0

Q0

Q7

PC - Porta desaída C8 bits

CLK

8x FFD74LS374

D7...D0

Q0

Q7

PD - Porta desaída D8 bits

Lógica de Seleção - 74LS138 A13...A11 Y0 Y2

Lógica de Seleção - 74LS138 A2...A0 Y0 Y1 Y2 Y3

Figura 2-2: Diagrama simplificado do hardware básico.

C10100nF

D7

A4

CI9

74LS374

3478

13141718

111

256912151619

D0D1D2D3D4D5D6D7

OCCLK

Q0Q1Q2Q3Q4Q5Q6Q7

D1

CI10A

74LS32

1

23

D0

D5

A15

A14

A2

D7

D21N4148

C9100nF

D1

CI10B

74LS32

4

56

D6 C7100nF

IO-2\

WR\

D4

D6

A5

A12

D3

CI11B 74LS02

5

64

CI7

74LS244

246811131517

119

18161412

9753

1A11A21A31A42A12A22A32A4

1G2G

1Y11Y21Y31Y42Y12Y22Y32Y4

D0

D6

D5CI8

74LS374

3478

13141718

111

256912151619

D0D1D2D3D4D5D6D7

OCCLK

Q0Q1Q2Q3Q4Q5Q6Q7

HMZ80 1

Hardware básico para o microprocessador Z80

CEFET MG - DEII - Coordenação de Eletrônica

Disciplina: Sistemas Microprocessados I Prof. Denny D. Collina

A4

1 1Friday, September 29, 2006

Title

Size Document Number Rev

Date: Sheet of

MREQ\

A13

A0

+5V

IO-2\

D7

D5

RD\

CLK

Reset\

A6

A9

A7

IO-1\

A1

IOREQ\

R3330R

D1

D4

A0

CN4

Port 02h

12345678

A8

R1 220R

8x buffer tri-state

WR\

CI5

74LS138

123

645

15141312111097

ABC

G1G2AG2B

Y0Y1Y2Y3Y4Y5Y6Y7

D6

CH1Reset

21

D3

CI6

74LS244

246811131517

119

18161412

9753

1A11A21A31A42A12A22A32A4

1G2G

1Y11Y21Y31Y42Y12Y22Y32Y4

C2100nF

A5

A9

RD\

D0

A3

D6

D3

IO-1\

C1100nF

D0

IO-0\

D3

D3

WR\

D5

D5

+5V

A8

A0

IO-3\

D0

A11

A11

D2

A3

CI1

Z80-CPU

303132333435363738394012345

1415128791013

27

19202221

28

18

24

1617

26

2523

6

A0A1A2A3A4A5A6A7A8A9

A10A11A12A13A14A15

D0D1D2D3D4D5D6D7

M1

MREQIORQWRRD

REFSH

HALT

WAIT

INTNMI

RESET

BUSRQBUSAK

CLK

IOREQ\

+5V

CI2

HM6116 - RAM 2Kx8

87654321

232219

182021

910111314151617

A0A1A2A3A4A5A6A7A8A9A10

CSOEWE

D0D1D2D3D4D5D6D7

8x F.F.D.

D1

D3

A4

A6

C4100nF

A0

D7

D0

D2

R22,2k

+5V

CS0\

A10

D1LED

C3100nF

+5V

RD\

D7A6

RD\

XT1 1,0 MHz

D4

A5

MREQ\

CN5

Port 03h

12345678

IO-3\

D2

D4

CI11D74LS02

11

1213

8x buffer tri-state

A2

A3

IO-0\

D5

CI4

74LS138

123

645

15141312111097

ABC

G1G2AG2B

Y0Y1Y2Y3Y4Y5Y6Y7

CI3

2716 - EPROM 2Kx8

87654321

232219

182021

910111314151617

A0A1A2A3A4A5A6A7A8A9A10

CEOEVPP

O0O1O2O3O4O5O6O7

A1

A1

RD\CS0\

8x F.F.D.

D2

+5V

D2

A7

A10

D7

A2

CI11A 74LS02

2

31

CN2

Port 00h

12345678

CN1Alimentação1 2

CS1\

D1

C11100nF

A7

A1

D6

A12

A10

C6100nF

A2

D5

CI11C74LS02

8

910

D0

A9

WR\

A4 D4

C8100nF

CS1\

D4

D6

D4

C5100nF

A14

D2

A13

D7

D1

D1

A8

D3D2

CN3

Port 01h

12345678

+C1310uF

Figura 2-3: Diagrama de um sistema básico utilizando o microprocessador Z80.

Qual foi o critério de escolha para a alocação de endereços para os blocos de memória RAM e ROM?

O primeiro critério é que não pode haver interseção nas faixas de endereços alocadas para a RAM e pa-ra a ROM. Portanto, se a faixa de endereços de 0000h a 03FFh foi escolhida para a ROM, nenhum destes en-dereços pode pertencer a faixa selecionada para a RAM.

O segundo critério diz respeito à escolha para os endereços alocados especificamente para a ROM. É essencial que o processador, após o seu ligamento (reset) já tenha à sua disposição o programa gravado, para que possa ser lido e executado. Portanto, isto justifica o uso da memória ROM.

Page 24: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 2. 22

Mas em qual a faixa de endereços foi mapeada a memória ROM? Para evitar este tipo de pergunta, todo microprocessador é projetado para buscar a primeira instrução a ser executada em um endereço pré-definido (endereço de reset). O endereço pode variar entre os vários μPs disponíveis comercialmente, mas é sempre in-formado na folha de dados do chip. Uma boa parte dos μPs utiliza o endereço 0000h (início do mapa de me-mória). Outros utilizam o endereço FFF0h (final do mapa de memória).

Há algum critério definir a alocação da memória RAM? Já para a memória RAM, vale apenas o primeiro critério apresentado acima: o da não superposição. Portanto, uma vez escolhida a alocação da memória ROM, a memória RAM poder ser alocada em qualquer faixa dos endereços restantes.

2.3 Editando o código fonte. Como estamos acompanhando o fluxograma da Figura 1-16,

agora iremos trabalhar na Etapa 1.

A edição do programa (que também é chamado de código fonte ou arquivo fonte) deve ser feita em editores de texto do tipo “ASCII puro”, ou seja, são aqueles editores que geram arquivos com apenas o código ASCII e, portanto, não oferecem nenhum tipo de formatação de caracteres: tamanho, ne-grito, itálico, etc. Isto se faz necessário, pois o arquivo do código fonte será “trabalhado” pelo programa tradu-tor: o assembler. Este, normalmente, não está preparado para processar arquivos mistos: código ASCII e códi-gos binários. São exemplos de editores ASCII: o bloco de notas (do Windows) e todos os editores “para pro-gramação”.

Nas nossas atividades iremos utilizar o editor TextPad, que é um aplicativo shareware, e foi desenvolvido “para programadores”, que tem as seguintes características a destacar:

Permite a edição de vários arquivos simultaneamente; Permite sua personalização para trabalhar com várias linguagens de programação; Apresente a função realce de palavras chaves (syntax highlighting), que permite que instruções, ope-

randos, constantes numéricas, comentários, etc., sejam apresentados com cores diferentes, facilitan-do a edição;

Permite ser configurado para executar outros aplicativos, como assembler, linker, simulador, etc., e pode efetuar a captura do conteúdo exibido na tela por estes aplicativos. Isto é muito útil ao se traba-lhar com o assembler que, na ocorrência de erros durante o processo de tradução do código fonte, apresenta a lista de todos;

Pode ser “baixado” gratuitamente na internet (www.textpad.com), e como pode ser observado na figu-ra abaixo, possui versão em português brasileiro.

2.3.1 Formatação. A edição do código fonte em assembly deve obedecer a algumas regras básicas. Vejamos:

Digita-se apenas uma instrução em cada linha; A estrutura básica de uma linha de assembly é constituída por quatro campos distintos: Labels, Mne-

mônicos, Operandos e Comentários. Veja a Figura 2-4. A separação dos campos é feita por pelo me-nos um caractere de espaço ou de tabulação (TAB).

Labels Mnemônicos Operandos Comentários 1 11 12 18 35

Inicio: ld A,80h ;inicializa o acumulador

Figura 2-4: Estrutura básica de uma linha da linguagem assembly.

O caractere pono-e-vírgula (;) tem a função de marcador de comentário.

Vamos, então, digitar o programa P1 em linguagem assembly para o microprocessador Z80 e salvar o arquivo.

Programa: editor de texto Função: edição do arquivo fonte Resultado: programa fonte ".asm"

Etapa 1

Page 25: Denny daniel collina   apostila de sitemas microprocessados

O primeiro programa em linguagem assembly. 23

Programa: assembler Função: tradução para código objetoResultado: arquivo objeto ".obj"

Etapa 2

Figura 2-5: Primeira versão do código fonte do programa P1 digitado.

ATENÇÃO:

Lembre-se que este arquivo será lido pelo assembler que é um aplicativo MS-DOS. Portanto, ao dar nome ao arquivo que será salvo lembre-se de utilizar a formatação “8.3”.Oito caracteres para o nome do arquivo e três caracteres para a extensão que deverá ser, “asm”. Não utilize espaços ou caracteres acentuados.

Após salvar o arquivo, podemos prosseguir para a Etapa 2.

2.4 Executando o assembler. Nesta etapa utilizaremos o aplicativo assembler, que efetuará

a tradução linha-a-linha do código fonte, escrito em linguagem as-sembly, para a linguagem de máquina (códigos binários, que por fa-cilidade são escritos em hexadecimal).

Nesta etapa e nas seguintes, estaremos utilizando o pacote: assembler, linker e simulador da Avocet Systems Inc (AVSZ80). Este pacote foi desenvolvido para ser execu-tado no sistema operacional MS-DOS. Em função disto, a execução dos aplicativos deve ser feita em ambien-te adequado, que pode ser através da digitação da linha de comando diretamente no “Prompt do DOS” ou atra-vés de um aplicativo Windows que permita “chamar” um aplicativo DOS. Neste texto, daremos enfoque ao se-gundo método.

Para se executar o aplicativo assembler: deve-se utilizar uma linha de comando com o seguinte formato:

avmacz80 <nome_arquivo>.asm ap pw=200.

Isto pode ser feito através da “ferramenta” (Assembla z80) do editor. Observe, na Figura 2-6, o resultado obtido. O editor apresenta uma nova janela de chamada “Resultados de Comando” que exibe o conteúdo enviado pelo assembler para a tela.

O erro encontrado pelo assembler (veja a seta em destaque na Figura 2-6) foi intencional, pois todo có-digo fonte em assembly deve ter como última linha a declaração (ou diretiva) end, que não foi digitada na pri-meira versão de programa. Observe na Figura 2-7 após a digitação da diretiva, que sua cor6 é diferente da cor de uma instrução, pois apesar de escrita no mesmo alinhamento das instruções, a diretiva tem função distinta, que será apresentada mais à frente.

6 Caso esteja lendo este texto em versão preto e branco, poderá ser observada a variação nos tons de cinza.

Page 26: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 2. 24

Figura 2-6: Resultado da execução do assembler para a primeira versão do programa P1.

Figura 2-7: Versão corrigida do programa P1.

Obtemos um programa que não apresenta erros de sintaxe. O assembler apenas efetua a verificação da

escrita das instruções, não há como efetuar a verificação da estrutura lógica de um programa, ou seja, em uma situação limite, o programa pode estar “todo errado”, mas estar sintaticamente correto.

Ao analisar em mais detalhes a Figura 2-8, devemos destacar os dois arquivos gerados pelo assembler:

Figura 2-8: Resultado da execução do assembler para a versão corrigida do programa P1.

Page 27: Denny daniel collina   apostila de sitemas microprocessados

O primeiro programa em linguagem assembly. 25

P1CAP1.obj: É o arquivo contendo o código objeto, ou seja, as instruções já traduzidas para linguagem de máquina (códigos hexadecimais). Caso tentemos abrir este arquivo, o editor fará a apresentação de seu conteúdo em um formato típico para arquivos binários: conteúdo em hexadecimal na parte esquerda da janela e o correspondente em código ASCII na parte direita (veja a Figura 2-10). Caso insista em abrir o arquivo como um arquivo texto, não conseguiremos visualizar quase nada (veja a Figura 2-9). O programador poderá visuali-zar adequadamente o resultado da tradução executada pelo assembler através do arquivo “.prn”. O arquivo objeto será utilizado pelo programa linker, em seguida. Apresentaremos mais detalhes em breve.

Figura 2-9: Visualização do arquivo objeto P1CAP1.obj em formato texto.

Figura 2-10: Visualização do arquivo objeto P1CAP1.obj em formato binário.

P1CAP.prn: É a versão em formato texto, e portanto legível, do código objeto. É chamado de arquivo

de listagem. Neste arquivo podemos observar o resultado, linha-a-linha da tradução executada pelo assembler. Como este é um arquivo que normalmente é consultado pelo programador, adicionamos mais uma personali-zação ao editor, que é a ferramenta (Abre PRN).

Figura 2-11: Visualização do arquivo de listagem P1CAP1.prn.

Page 28: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 2. 26

2.5 Executando o linker. Dando prosseguimento à criação do nosso primeiro progra-

ma em assembly, agora utilizaremos o aplicativo linker. Este apli-cativo tem a função de efetuar a conversão de um ou mais arqui-vos objeto em um arquivo executável, cuja extensão é “.hex”. Este último é o arquivo que está pronto para ser gravado em um chip de memória e em seguida utilizado no processo de simulação ou mesmo para a execução “real” pelo micropro-cessador.

Para se executar o aplicativo linker deve-se enviar uma linha de comando com o seguinte formato:

avlink <nome_arquivo>.hex=<nome_arquivo>.obj -sy sy=<nome_arquivo>.sym -sp

A execução do linker é obtida pela mesma ferramenta do editor que utilizamos para executar o assem-

bler (Assembla z80). O que acontece é que se a execução do assembler não detectar nenhum erro, auto-maticamente faz-se a chamada para a execução do linker. O linker só exibe alguma mensagem se ocorrer erro, em caso contrário, o resultado é similar ao observado na Figura 2-12. Assumindo, então, o sucesso na execu-ção do linker, teremos como resultado os seguintes arquivos:

Figura 2-12: Resultado da execução do linker.

P1CAP1.hex: É o arquivo contendo o código executável. A extensão “.hex” é indicadora de que este arquivo apresenta formato padronizado (conhecido como Hex-Intel). Outra curiosidade, é que apesar de conter o código executável, é um arquivo texto e, portanto, pode ser facilmente aberto e lido.

Figura 2-13: Visualização do conteúdo do arquivo P1CAP1.hex.

OBS.: A descrição que é apresentada a seguir só será compreendida mais à frente. Portanto se esta é a

sua primeira leitura do texto, sugerimos que a salte.

Programa: linkerFunção: montagem e geração do código executávelResultado: arquivo executável ".hex"

Etapa 3

Page 29: Denny daniel collina   apostila de sitemas microprocessados

O primeiro programa em linguagem assembly. 27

P1CAP1.sym: É o arquivo de símbolos, ele contém todos a relação de todos os labels (ou símbolos) e o valor numérico correspondente de cada. Este arquivo é utilizado no simulador para permitir a exibição dos la-bels na área de código.

2.6 Executando o simulador. Nesta etapa poderemos, finalmente, efetuar a verificação do

programa (depuração). A etapa de simulação não é obrigatória, mas é uma “ferramenta” extremamente útil no processo de depura-ção. Enquanto na execução real as instruções são processadas ra-pidamente, na simulação há a opção de execução passo-a-passo, que permite fazer uma análise detalhada da influência de cada instrução no contexto do processador.

Para se executar o aplicativo simulador deve-se enviar uma linha de comando com o seguinte formato:

avsimz80 -c1 a sma0 ffffh la<nome_arquivo>.hex ls<nome_arquivo>.sym

Para executar o simulador “de dentro do editor” basta utilizar a ferramenta (Simula z80), mas aten-

ção:

ATENÇÃO:

Para a correta execução do simulador, é necessário que a janela corrente do editor seja a do arquivo fonte (.asm). Se a janela corrente for “Resul-tados de Comando”, a execução do simulador não será bem sucedida.

Figura 2-14: A janela corrente é a do arquivo fonte.

Antes de partir para a simulação do programa que criamos, é essencial descrevermos brevemente a á-

rea de trabalho do simulador e algumas de suas principais funções. Maiores detalhes podem ser obtidos no manual do software.

A tela do simulador pode ser vista na Figura 2-15. Ela é divida em duas áreas principais: screen e me-nu.

Só é possível atuar em uma área de cada vez. Através da tecla D pode-se alternar entre as duas á-reas.

Screen: Código, Registradores, Status do simulador,

Pinos de interrupção, Portas paralelas Dados.

Nesta área pode-se observar um fragmento com várias linhas de programa e o estado dos principais re-gistradores do processador, assim como duas áreas de dados. Enquanto a área de programa não pode ser al-terada, as áreas de registradores e de dados podem ser alteradas pelo usuário.

Menu: Menu de comandos.

Atuando nesta área, o usuário terá a disposição um conjunto bem variado de comandos que atende dos usuários iniciantes aos mais avançados.

Programa: simulador Função: depuração do programa Resultado: correção de alguns erros

Etapa 4

Page 30: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 2. 28

A seguir descreveremos cada uma delas.

LABEL OPERATION Z80 AVSIM Z80 Simulator/Debugger V1.6 0000H LD A,(1000H) CPU REGISTERS FLAGS SCL SPD DSP SKP CURSOR 0003H LD B,A C Accumulator Z PV S N H OFF HI ON OFF MENU 0004H LD A,(1001H) 0 00000000:00:_ 0 0 0 0 0 Cycles: 0 0007H ADD A,B addr data ALT REGISTERS 0008H LD (1002H),A PC:0000 » 3A 00 10 47 3A 01 10 80 AF:0000 DE:0000 000BH HALT SP:0000 » 3A 00 10 47 3A 01 10 80 BC:0000 HL:0000 000CH NOP 32 02 10 76 00 00 00 00 IV:0000 000DH NOP BC:0000 » 3A 00 10 47 3A 01 10 80 :_�G:��Ç 000EH NOP DE:0000 » 3A 00 10 47 3A 01 10 80 :_�G:��Ç PINS 000FH NOP HL:0000 » 3A 00 10 47 3A 01 10 80 :_�G:��Ç Int 1 0010H NOP IX:0000 » 3A 00 10 47 3A 01 10 80 :_�G:��Ç NMI 1 0011H NOP IY:0000 » 3A 00 10 47 3A 01 10 80 :_�G:��Ç IFF1 0 0012H NOP Memory Space 0013H NOP 0000 3A 00 10 47 3A 01 10 80 :_�G:��Ç I/O Address 0014H NOP 0008 32 02 10 76 00 00 00 00 2��v____ 0015H NOP 0010 00 00 00 00 00 00 00 00 ________ FF:_:11111111 0016H NOP 0018 00 00 00 00 00 00 00 00 ________ 0017H NOP Memory Space FF:_:11111111 0018H NOP 0020 00 00 00 00 00 00 00 00 ________ 0019H NOP 0028 00 00 00 00 00 00 00 00 ________ FF:_:11111111 001AH NOP 0030 00 00 00 00 00 00 00 00 ________ 001BH NOP 0038 00 00 00 00 00 00 00 00 ________ FF:_:11111111 >Select Command - or use arrow keys Dump Expression commandFile Help IO Load --space-- ESC to screen

Figura 2-15: Tela do simulador7.

2.6.1 Área de Código. Nela são listadas um fragmento de 22 linhas de programa (veja a Figura 2-16.). A linha que é apre-

sentada em destaque corresponde à instrução apontada pelo registrador contador de programa (PC) e que a-inda vai ser executada. Na figura, o endereço 0000h corresponde à posição de memória a partir do qual esta instrução foi armazenada. Observe que a instrução seguinte foi armazenada a partir do endereço 0003h, pois a instrução anterior “LD A,(1000h)” ocupou as posições de memória 0000h, 0001h e 0002h.

LABEL OPERATION 0000H LD A,(1000H) 0003H LD B,A 0004H LD A,(1001H) 0007H ADD A,B 0008H LD (1002H),A 000BH HALT

Figura 2-16: Fragmento da tela do simulador destacando a área de código.

2.6.2 Área dos Registradores. Nela são apresentados os dois conjuntos de registradores do microprocessador z80 (veja a Figura

2-17). Vale a pena rever a seção 1.2.1 - O microprocessador. na página 7.

O conjunto principal: formado pelos registradores: acumulador (A), flags (F), PC, SP, B, C, D, E, H, L, IX e IY;

O conjunto alternativo: formado pelos registradores A’, F’, B’, C’, D’, E’, H’ e L’ e pelo registrador IV (interrupt vector).

7 A tela real do simulador apresenta um arranjo de cores, que quando impressas em tons de cinza, resultariam em uma figura com fundo

preto e letras brancas. Geramos, então uma versão inversa, de fundo branco e letras pretas.

Page 31: Denny daniel collina   apostila de sitemas microprocessados

O primeiro programa em linguagem assembly. 29

CPU REGISTERS FLAGS C Accumulator Z PV S N H 0 00000000:00:_ 0 0 0 0 0 addr data ALT REGISTERS PC:0000 » 3A 00 10 47 3A 01 10 80 AF:0000 DE:0000 SP:0006 » 3A 00 10 47 3A 01 10 80 BC:0000 HL:0000 32 02 10 76 00 00 00 00 IV:0000 BC:0000 » 3A 00 10 47 3A 01 10 80 :_�G:��Ç DE:0000 » 3A 00 10 47 3A 01 10 80 :_�G:��Ç HL:0000 » 3A 00 10 47 3A 01 10 80 :_�G:��Ç IX:0000 » 3A 00 10 47 3A 01 10 80 :_�G:��Ç IY:0002 » 3A 00 10 47 3A 01 10 80 : �G:��Ç

Figura 2-17: Fragmento da tela do simulador destacando a área dos registradores.

ATENÇÃO:

O simulador inicializa todos os registradores com o conteúdo 00h. Entre-tanto, em um microprocessador real apenas o registrador PC tem conte-údo conhecido após a ocorrência da inicialização (ou reset).

- O registrador acumulador (ou registrador A) é apresentado em três formatos diferentes: binário, he-

xadecimal e ASCII, separados por dois pontos “:”.

- O registrador de flags (ou registrador F) é apresentado de forma diferente dos demais, pois cada um de seus bits tem uma designação em particular: Z, PV, S, etc.

- Os demais registradores do conjunto principal: PC, SP, etc. recebem um “tratamento” especial, além da apresentação de seus conteúdos, pode-se observar uma lista com o conteúdo de 8 posições consecutivas de memória logo após as setas duplas “»” (Para o registrador SP são listados 16 valores). O valor que aparece em destaque corresponde ao conteúdo da posição de memória apontada pelo registrador em questão. Em ou-tras palavras, estes registradores podem ser utilizados como apontadores para memória.

- Os caracteres apresentados neste campo são os correspondentes em código ASCII dos valores a-presentados à sua esquerda (campo ). Observando a Figura 2-17, podemos notar que a letra “G” tem como código ASCII correspondente o valor 47h.

- Os conteúdos do conjunto alternativo de registradores podem ser observados neste campo.

2.6.3 Área de Status do simulador. Nesta área são apresentadas as configurações atuais para alguns ajustes que podem ser feitos no

simulador:

SCL SPD DSP SKP CURSOR OFF HI ON OFF MENU Cycles: 0

Figura 2-18: Fragmento da área de status do simulador.

Scroll Mode - SCL: Modo de rolagem de janela. Quando ativo (on) faz com que a movimentação do cur-

sor (através das teclas R T U Y) esteja limitada a apenas uma das áreas (registradores, dados, etc.). Quan-do inativo (off), o cursor pode ser deslocado para qualquer área da tela (exceto a área de código). Alteração desta configuração pode ser feita através da teclado digitando E O.

Simulation Speed - SPD: Velocidade da simulação. Utilizando a tecla %, pode alterar a velocidade da simulação entre HI, MID E LOW. Para a opção LOW, o simulador, na verdade executa rapidamente uma se-qüência de 64 instruções, e então faz uma pausa. Esta situação se repete até que a tecla pressionada seja D.

Page 32: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 2. 30

Display Update - DSP: Atualização da tela durante a simulação. Utilizando a tecla ^, pode-se alternar entre exibir na tela a atualização das alterações resultantes da execução de cada instrução, o que deixa a exe-cução da simulação mais lenta, ou não.

Subroutine Skip - SKP: Exibir a execução de um subrotina. Quanto ativo (on) faz com que o simulador execute o processamento de uma subrotina, mas não o exiba na tela. Quanto inativo (off) o processamento da subrotina é apresentado. Alteração desta configuração pode ser feita através da teclado digitando *.

Cursor Mode - CURSOR: Modo de deslocamento do cursor. Em alguns campos, o mesmo valor é exibi-do em mais de um formato, como é o caso da exibição do conteúdo do acumulador: binário, hexadecimal e ASCII. Nestes campos é possível fazer o cursor saltar diretamente para um dos modos de exibição pressio-nando a tecla &.

Cycles: Exibição do número de estados executados pelo processador (Z80, simulado). A contagem é feita em decimal e ao ultrapassar 65535 o contador é zerado, reiniciando a contagem. A qualquer momento o usuário pode zerar ou até mesmo alterar o valor de contagem. Vale lembrar que para o microprocessador z80, cada estado corresponde a um pulso de clock.

2.6.4 Pinos de interrupção.

Nesta área pode-se efetuar as solicitações de interrupção INT e NMI . Ainda é exibido o estado do bit sinalizador de interrupção “FF1”.

2.6.5 Portas Paralelas. Nesta área são apresentadas quatro portas genéricas. Cada uma delas pode ser configurada para

funcionar como porta de entrada ou porta de saída. Esta configuração não pode ser feita no simulador, ela de-ve ser feita pelo programa a ser simulado (consulte a diretivas de definição de segmentos, mais à frente).

PINS Int 1 NMI 1 IFF1 0

Figura 2-19: Fragmento da área dos pinos de inter-

rupção do simulador.

I/O Address FF:_:11111111 FF:_:11111111 FF:_:11111111 FF:_:11111111

Figura 2-20: Fragmento da área das portas parale-

las do simulador.

2.6.6 Área de Dados. Esta área é dividida em duas janelas “Memory Space”, que são independentes uma da outra. Em ca-

da uma delas pode-se observar 32 bytes consecutivos de qualquer área do mapa de memória (memory dump). Seja o segmento de dados ou o segmento de programa. Contudo, são mais utilizadas para monitorar dados, uma vez que no campo dos registradores, já são exibidos 8 bytes consecutivos do segmento de programa a-pontados pelo registrador PC (program counter), veja a Figura 2-17. Para selecionar qual a região de memória que deseja observar nestas janelas “Memory Space”, consulte a descrição do comando “DUMP”, mais à fren-te.

Memory Space 0000 3A 00 10 47 3A 01 10 80 :_�G:��Ç 0008 32 02 10 76 00 00 00 00 2��v____ 0010 00 00 00 00 00 00 00 00 ________ 0018 00 00 00 00 00 00 00 00 ________ Memory Space 0020 00 00 00 00 00 00 00 00 ________ 0028 00 00 00 00 00 00 00 00 ________ 0030 00 00 00 00 00 00 00 00 ________ 0038 00 00 00 00 00 00 00 00 ________

Figura 2-21: Fragmento da área de dados do simulador.

Page 33: Denny daniel collina   apostila de sitemas microprocessados

O primeiro programa em linguagem assembly. 31

2.6.7 Menu de Comandos. Ocupa apenas duas últimas linhas na parte inferior da tela. Na última linha são apresentados os co-

mandos que podem ser selecionados através das teclas R T U Y. O simulador dispõe de 14 comandos que são exibidos em dois grupos devido à falta de espaço na linha:

>Select Command - or use arrow keys Dump Expression commandFile Help IO Load --space-- ESC to screen

>Clear, Fill, Move, Search Memory Memory Patch Quit Reset Set setUp View eXecute --space-- ESC to screen

Figura 2-22: Comandos disponíveis no simulador.

DICAS:

Pode-se utilizar a letra maiúscula de cada comando (que em alguns ca-sos não é a primeira) como atalho para o mesmo.

Quando selecionar um comando e desistir de executá-lo ou caso tenha selecionado um comando por engano, basta digitar E c para retornar para o menu principal.

Apresentaremos aqui, a descrição de apenas alguns comandos, para os demais sugerimos consultar o

manual do software.

2.6.7.1 Dump.

Atalho d.

Comando que permite ajustar o endereço inicial de exibição das duas janelas “Memory Space”: superior (1 ou Upper) e inferior (2 ou Lower). Após a seleção do comando e da janela, são apresentadas duas opções:

Absolute: permite ajustar o endereço inicial a partir de um valor numérico. Exemplo 1000h. Na grande maioria das situações utilizaremos esta opção.

Indirect: vincula endereço inicial ao conteúdo de um dos registradores ponteiros, ou seja, utiliza ende-reçamento indireto.

DICA:

Um atalho para ajustar, por exemplo, a janela superior (ou janela 1) para exibir os conteúdos a partir do endereço 1000h, pode-se digitar a seguin-te seqüência de teclas: d 1 a 1 0 0 0 h Q.

2.6.7.2 Help Simulation.

Atalho h s.

Comando que apresenta telas com a descrição breve das teclas de atalho e de algumas configurações que podem ser feitas no simulador. Uma das telas é a que apresenta a ajuda para a simulação, nela são apre-sentadas as teclas de função que são utilizadas para controlar a simulação:

Page 34: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 2. 32

Figura 2-23: Tela obtida com o comando “Help Simulation”.

! : Execução contínua do programa. A execução só é cancelada se a tecla for pressionada novamente,

ou antes de executar uma instrução marcada como ponto de parada (break point).

) : Execução passo a passo. Quando a tecla é pressionada a simulação executa a instrução apontada pelo registrador PC a qual é apresentada em destaque na área de código.

( : Desfazer. Permite que a simulação retorne o estado do processador para antes da execução da úl-tima instrução. A configuração inicial do simulador permite que se retorne até 20 instruções. Este valor pode ser alterado através do comando “setUp Undo” (atalho u u) para algo próximo de 1000 instruções, se neces-sário.

@ $ # : Ativação de break points. Utilizando as teclas @ $ move-se um cursor em formato triangu-lar “ ” para cima e para baixo, na área de código. Quando ele estiver posicionado em frente à instrução que se deseja marcar como “ponto de parada” basta pressionar a tecla $, que a instrução será marcada e apre-sentará uma pequena seta “ ”.

% : Velocidade da simulação. Utilizando a tecla %, pode alterar a velocidade da simulação entre HI, MID E LOW. Para a opção LOW, o simulador, na verdade executa rapidamente uma seqüência de 64 instru-ções, e então faz uma pausa. Esta situação se repete até que a tecla pressionada seja D.

2.6.7.3 Patch Code.

Atalho p p.

Este comando permite efetuar “remendos” (patch code) na área de código, ou seja, é possível trocar a instrução que está sendo apontada pelo registrador PC. Após a digitação da instrução desejada, o registrador PC é incrementado e pode-se alterar a instrução seguinte. Quando o usuário já não desejar efetuar mais alte-rações deve pressionar E c.

>Peephole Cross-Assembler PATCH: Patch code Open output file Close file ESC to screen

>Enter mnemonic: ld a,(1500h) PATCH Code at PC

Figura 2-24: Comando “Patch Code”.

As opções “Open output file” e “Close file” permitem ao simulador abrir e fechar um arquivo (cujo nome

também deve ser especificado pelo usuário) que conterá a anotação de todas as instruções que foram altera-das.

Page 35: Denny daniel collina   apostila de sitemas microprocessados

O primeiro programa em linguagem assembly. 33

2.6.7.4 Quit Exit.

Atalho q e.

Este é o comando para efetuar o término da execução do simulador.

>Exit/Shell to DOS QUIT: Exit Shell ESC to screen

Figura 2-25: Comando “Quit Exit”.

A opção “Shell” permite suspender temporariamente a execução do simulador para abrir o “Prompt do

DOS”. Depois de terminado o trabalho no “Prompt do DOS” deve-se digitar o comando “exit” para permitir o re-torno ao simulador.

2.6.7.5 Reset.

Reset CPU - atalho r c.

Reset cYcles - atalho r y.

>Perform CPU Reset Operation RESET: Cpu Disptrace cYcles --space-- ESC to screen

Figura 2-26: Comando “Reset”.

O comando “Reset CPU” ajusta o conteúdo registrador PC para 0000h e além de suspender a condição

de congelamento do processador gerada pela execução da instrução “HALT”.

O comando “Reset cYcles” zera o contador de estados da área de Status do simulador. O comando “Re-set Disptrace” não será abordado.

2.7 Simulando o programa. Agora que já conhecemos os principais recursos do simulador podemos, então, simular o programa que

criamos. Como estamos trabalhando em um ambiente integrado de desenvolvimento (IDE - integrated deve-lopment environment), ao clicar na ferramenta (Simula z80) o simulador é executado e as suas configura-ções básicas já são definidas. Portanto teremos um “computador simulado” pronto para ser operado assim que a tela do simulador for apresentada, como pode ser visto na Figura 2-15.

Como estamos aprendendo a programar em assembly, na grande maioria das vezes, utilizaremos o si-mulador no modo passo-a-passo, a execução corrente ficará restrita a poucas situações.

Apesar de, no item anterior, já termos apresentado a descrição das teclas de função e dos comandos, vejamos um resumo dos mais utilizados:

) Single step - simulação de uma única instrução.

( Undo - desfaz a simulação de uma instrução.

d 1 a ou d 2 aDump absolute - ajusta o endereço inicial de memória para a visualização de uma das janelas da área de dados (memory space).

r c Reset CPU - reinicializa o processador.

h s Help Simulation - tela de ajuda das funções de simulação.

q e Quit exit - termina a execução do simulador.

Page 36: Denny daniel collina   apostila de sitemas microprocessados
Page 37: Denny daniel collina   apostila de sitemas microprocessados

A linguagem assembly para o Z80. 35

CAPÍTULO 3.

3. A LINGUAGEM ASSEMBLY PARA O Z80. [10] Os microprocessadores possuem características próprias a cada um deles, com diferente estrutura ex-

terna, diferente conjunto de registradores e também, conjunto de instruções diferente de um para o outro. Des-ta forma, a linguagem assembly é uma linguagem característica de cada microprocessador, não sendo possí-vel, na maioria dos casos, um programa que foi originalmente escrito em linguagem assembly para o µP Z80, ser processado por um µP 6800 (Motorola), por exemplo. Portanto, a linguagem assembly é uma linguagem específica e diferente para cada microprocessador. Para um mesmo microprocessador pode, também, existir variações das características da linguagem assembly, podendo ser estabelecidos pontos diferentes, em função de quem criou os pacotes assemblers. Assim não há uma linguagem universal, nem para um mesmo µP. En-tretanto a estrutura básica do assembly é a mesma. Quer dizer que, apesar de todas estas diferenças, quando se aprende o assembly do μP Z80, se aprende a essência da linguagem para qualquer outro microprocessa-dor.

A linguagem assembly, de um modo geral, não apresenta muitas regras para a elaboração de um pro-grama. O programador tem mais liberdade para utilizar a sua capacidade criativa, podemos destacar isto como ponto positivo, por outro lado, esta mesma liberdade pode levá-lo a situações de difícil solução se o mesmo não tiver um mínimo de organização na tarefa de construção de seu programa. O conjunto de procedimentos que não são exigências da linguagem, mas que buscam organizar e facilitar a criação de código, chamamos de estilo de programação. Cada programador adota um estilo diferente e, portanto, o que apresentaremos a seguir é um dentre muitos. A intenção é utilizar um conjunto básico de ferramentas da linguagem que nos levará a uma programação organizada, de fácil leitura e que auxilie, também, na “manutenção do código”, caso seja ne-cessário, no futuro.

A estrutura básica de uma linha de assembly é constituída por quatro campos distintos: Labels, Mnemô-

nicos, Operandos e Comentários. Veja a Figura 3-1.

Labels Mnemônicos Operandos Comentários 1 11 12 18 35

Inicio: ld A,80h ;inicializa o acumulador

Figura 3-1: Estrutura básica de uma linha da linguagem assembly.

ATENÇÃO:

Em todos os campos acima não há a distinção entre letras maiúsculas ou minúsculas para o pacote assembler que utilizamos.

3.1 Labels. O label é um rótulo que se dá a uma constante ou a um endereço. O primeiro caractere do label deve ser

um caractere alfabético ou o travessão “C”. Os demais caracteres podem ser letras, números ou o travessão. O comprimento dos labels pode variar em função de cada pacote assembler. Em geral de 6 a 8 caracteres é recomendável.

São exemplos de labels válidos:

_ABC __XYZ A123 _456_ AB1CD_

São exemplos de labels inválidos:

123 1+2 _(ABC) 1A*2

Os labels que indicam endereço devem ser seguidos do caractere sufixo dois pontos “:”. Eles podem ser utilizados para se referir a um endereço sem o seu prévio conhecimento.

Já os rótulos que indicam constantes não devem ter caractere de sufixo e o seu valor é o valor da cons-tante que ele representa. Para maiores detalhes veja o item 3.5 – pseudo-instrução EQU.

Page 38: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 3. 36

3.2 Mnemônicos ou códigos de operação. O código de operação é o campo da linha que especifica qual é a tarefa que deve ser realizada pela

CPU. Sua apresentação é feita através de 2 a 4 caracteres que lembram a ação a ser executada (mnemôni-cos). Por exemplo:

jmp (jump) = saltar

mov (move) = mover

hlt (halt) = parar

3.3 Operandos. É o campo onde se apresentam as informações necessárias para que a instrução possa ser executada.

As instruções podem demandar um, dois, ou mesmo nenhum operando. Os operandos podem conter:

Um endereço de uma posição de memória. Ex.: LD A,(2000h)

A especificação de registradores do µP. Ex.: LD A,B

A especificação de um par de registradores do µP. Ex.: LD A,(BC)

Uma constante numérica (dado imediato) de 8 ou 16 bits. Ex.: LD A,00h LD HL,1234h

Um label. Ex.: JP INICIO

3.3.1 Constantes numéricas. As constantes podem ser apresentadas em várias bases numéricas, e como regra básica nenhuma cons-

tante pode ter seu dígito mais significativo com dígitos diferentes da faixa de “0” a “9”. Isto nos leva a acrescen-tar mais um zero para os valores hexadecimais que se iniciam com letras. Veja como apresentar valores em várias bases numéricas.

Decimal - sem sufixos: Ex.: LD B,100 LD C,255

Binária - sufixos “B” ou “b”: Ex.: LD A,11010011b LD B,10000110B

Octal - sufixos “Q” ou “q”: Ex.: LD D,377q LD E,123Q

Hexadecimal8 - sufixos “h” ou “H”: Ex.: LD A,12h LD DE,1FFFh LD BC,0CDEFH

3.3.2 Constantes de Caracteres. É possível, também, apresentar valores constantes baseados no código ASCII (consulte a tabela ASCII no

Apêndice A. ), bastando para tal apresentar o caractere correspondente entre aspas simples ( ‘ ). Caso queira apresentar uma constante correspondente a mais de letra, como uma palavra ou mesmo uma frase, basta co-locá-la entre aspas ( “ ).

Ex.: LD L,’@’ é equivalente a LD L,40h

LD HL,“KY” é equivalente a LD HL,4B59h

DB "Jose Silva" é equivalente a DB 4Ah,6Fh,73h,65h,20h,53h,69h,6Ch,76h,61h

3.3.3 Operações com Constantes. Temos a possibilidade, ainda, de efetuar operações aritméticas ou lógicas entre constantes, como apresen-

tado a seguir:

8 Sugere-se utilizar preferencialmente o sufixo “h” minúsculo, para evitar confusões com o registrador H do μP.

Page 39: Denny daniel collina   apostila de sitemas microprocessados

A linguagem assembly para o Z80. 37

Operações algébricas: + - / * Ex.: LD A,125+4 LD A,0FFh/1Bh Operações lógicas: and, or, xor, not. Ex.: LD A,81h and 08h LD A,not 0FFh

3.4 Comentários. O campo dos comentários possui formato livre e as únicas restrições são que: o início do campo deve ter

como primeiro caractere o ponto-e-vírgula (;) e que o seu conteúdo deve ser de caracteres ASCII apenas. O campo dos comentários termina com o final da linha. Caso queira apresentar duas linhas seguidas de comentá-rio, será necessário utilizar o ponto-e-vírgula novamente.

IMPORTANTE:

O programa assembler que utilizamos, não aceita caracteres acentuados ou caracteres de controle em qualquer campo de uma linha, incluindo-se aí o campo dos comentários. Esta ressalva inclui também a cedilha (ç). Portanto, o arquivo fonte em linguagem assembly deverá ser criado em editores ASCII, tais como o EDIT ou Bloco de Notas.

3.5 Pseudo-instruções. Além das instruções, que serão convertidas para código de máquina, um programa fonte em assembly

possui instruções especiais que chamaremos de pseudo-instruções ou diretivas que são usadas para a estrutu-ração do programa. Estas instruções não são traduzidas para código de máquina, por não pertencerem ao con-junto de instruções do microprocessador. Elas têm funções especiais no programa como definir símbolos, es-tabelecer endereço inicial do programa na memória, etc., não sendo, portanto, processadas.

Apesar das pseudo-instruções não serem convertidas em código de máquina o seu posicionamento em uma linha de assembly deve ser o mesmo que os mnemônicos.

As pseudo-instruções que mais utilizaremos são: END, DEFSEG, SEG, ORG, EQU, DB, DW e DS. Caso dese-je conhecer mais pseudo-instruções consulte o manual do pacote assembler.

Vejamos cada uma delas, apresentando sua sintaxe e descrição:

[Label:]9 END

• Pseudo-instrução que indica o final da listagem do código fonte. O assembler desconhecerá quaisquer outras linhas após esta. Dentre as pseudo-instruções listadas, esta é a única que não deve faltar em qualquer arquivo fonte de assembly. Em caso contrário, o montador não terá como identificar com se-gurança o término da listagem e poderá apresentar dois tipos de mensagens de erro, como os exem-plos apresentados abaixo:

“List file write error.”

“teste.asm Line nn - ERROR 20: END statement missing - one has been assumed”

DEFSEG nome,atributo

• Mnemônico para as palavras define segment;

• Esta pseudo-instrução cria um novo segmento de memória cujo nome pode ser livremente especificado pelo programador. O novo segmento pode, também, receber atributos como “absolute”. Veja um exemplo:

Labels Mnemônicos Operandos Comentários 1 11 12 18 35

DEFSEG codigo,absolute ;cria novo seg. de memória

9 A colocação dos colchetes indica que a presença do Label é facultativa.

Page 40: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 3. 38

Figura 3-2: Exemplo para a pseudo-instrução DEFSEG.

SEG nome

• Mnemônico para a palavra segment ;

• A diretiva informa ao programa montador que as linhas que a sucederão irão ser traduzidas dentro do segmento especificado pelo nome. Veja um exemplo:

Labels Mnemônicos Operandos Comentários 1 11 12 18 35

Seg código

Figura 3-3: Exemplo para a pseudo-instrução SEG.

[Label:] ORG endereço

• Mnemônico para a palavra origin ;

• esta pseudo-instrução indica o endereço da posição de memória em que o assembler vai iniciar ou então, reiniciar a tradução do código fonte. Veja um exemplo:

Labels Mnemônicos Operandos Comentários 1 11 12 18 35

ORG 2000h ;endereço de inicio do seg.

Figura 3-4: Exemplo para a pseudo-instrução ORG.

Nos programas que desenvolveremos, o conjunto das três últimas diretivas será normalmente utilizado

em conjunto para a definição completa de um novo segmento de memória.

Labels Mnemônicos Operandos Comentários 1 11 12 18 35

DEFSEG codigo,absolute ;cria novo seg. de memória SEG Codigo ORG 2000h ;endereço de inicio do seg.

Figura 3-5: Cabeçalho completo para a definição de um novo segmento de memória.

Estes segmentos serão utilizados para conter tipos de informações distintas que sempre estão presentes

em quase todos os programas: instruções e dados (ou variáveis), ou seja, segmentos de dados e de programa.

Label10 EQU const

• Mnemônico para a palavra equate: equiparar;

• Esta pseudo-instrução tem a função de associar ao nome do label um valor constante especificado por “const“ que pode ser de um byte (00h a 0FFh) ou dois bytes (0000h a 0FFFFh), ou seja, permite criar constantes numéricas. Os labels (ou símbolos) podem então ser utilizados em qualquer ponto do arquivo no lugar dos valores numéricos que, no momento da montagem, o programa montador (as-sembler) irá convenientemente trocá-los pelo seu valor numérico correspondente para que então possa ser feita a geração do código objeto. Veja a Figura 3-6;

• As constantes numéricas criadas por esta pseudo-instrução não implicam na reserva de posições de memória, elas só têm função para o momento da edição do programa, seus valores são armazenados na tabela de símbolos criada pelo assembler e depois de terminada a montagem do código fonte, estes símbolos são descartados;

• A inclusão das pseudo-instruções EQU pode ser feita em qualquer ponto do arquivo fonte, no entanto, recomenda-se que elas sejam inseridas junto com a definição do segmento de dados;

10 Para esta pseudo-instrução a presença do label é obrigatória.

Page 41: Denny daniel collina   apostila de sitemas microprocessados

A linguagem assembly para o Z80. 39

• A utilização de um labels, ao contrário de um valor numérico, permite que se possa efetuar a troca de um valor constante presente em vários pontos do programa apenas trocando o valor const na linha em que foi feita a sua definição;

• Este tipo de pseudo-instrução nos permite elevar um pouco o nível da linguagem assembly, pois assim podemos trabalhar com nomes ao contrário de números, o que é bem mais interessante.

IMPORTANTE:

O label associado à pseudo-instrução EQU não deve ser seguido de dois pontos (:), pois ele representa uma constante numérica.

Labels Mnemônicos Operandos Comentários 1 11 12 18 35

Const1 EQU 05h ;cria constante numerica Const1 = 05h Const2 EQU 01101101b ;cria constante numerica Const2 = 6Dh Const3 EQU 255 ;cria constante numerica Const3 = FFh PortaA EQU 80h ;cria constante numerica PortaA = 80h Xyz EQU 1234h ;cria constante numerica Xyz = 1234h LetraA EQU ‘A’ ;cria constante ASCII LetraA = 41h WWW EQU 13/3 ;cria constante numerica WWW = 4 Digitos EQU “12” ;cria constante ASCII Digitos = 3132h

Figura 3-6: Exemplos para a pseudo-instrução EQU.

[Label:]11 DB byte

• Mnemônico de define byte;

• Esta pseudo-instrução tem a função de reservar uma posição de memória e de inicializá-la com o valor do operando byte especificado. Em uma mesma linha podem ser reservadas mais de uma posição de memória pela adição de mais de um operando byte separados por vírgulas. Veja a Figura 3-7;

• Em termos práticos a pseudo-instrução DB nos propicia definir e inicializar variáveis e vetores;

• A diretiva DB que ocorre em uma linha dotada de label, além da inicialização de uma posição memória, efetua também, a atribuição do endereço desta posição ao label. No exemplo da Figura 3-7 o label Var1 receberá a atribuição do endereço 2500h e o Vet1 o endereço 2501h. Em uma linha onde há inicialização múltipla, como é o caso do Vet1, o endereço atribuído ao label é o da primeira posição de memória inicializada. Estes labels podem, então, ser utilizados em qualquer ponto do arquivo que, no momento da montagem, o programa montador (assembler) irá convenientemente trocá-los pelo valor do endereço que eles representam. Instruções que utilizam labels são mais interessantes pois o seu entendimento torna-se mais intuitivo, observe:

LD A,(2500h) pode ser escrita como LD A,( Var1) LD H,2501h pode ser escrita como LD H,Vet1

Labels Mnemônicos Operandos Comentários 1 11 12 18 35

ORG 1200h Var1: DB 05h ;define posicao inicializada Vet1: DB 03h, 09h, 15h, 0FFh ;define vetor inicializado de 4 bytes Name: DB “Joao e Maria”, 00h ;define string ASCII de 13 bytes Vet2: DB 253, 0FFh, 12q, 111b ;define vetor inicializado de 4 bytes Conta: DB 12*3 ;define posicao inicializado de Var4 = 24h Valor: DB Const1 + Const2 ;define posicao inicializada Var5 = 72h Parte: DB 33h and 0Feh ;define posicao inicializada Var3 = 32h

Figura 3-7: Exemplos para a pseudo-instrução DB.

11 A inclusão dos colchetes é para indicar que a presença do label é facultativa.

Page 42: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 3. 40

[Label:] DW dbyte

• Mnemônico de define word;

• Esta pseudo-instrução tem a função de reservar duas posições consecutivas de memória e de atribuir a elas o valor do operando especificado (dbyte = dois bytes). O armazenamento dos bytes na memó-ria ocorre de forma invertida: o byte mais significativo é armazenado na segunda posição de memória reservada e o byte menos significativo na primeira. Em uma mesma linha podem ser reservados outros pares de posições de memória pela adição de mais de um operando “dbyte” separados por vírgulas. Veja a Figura 3-8;

• Como visto, esta diretiva permite criar variáveis de 16 bits inicializadas, assim como vetores inicializa-dos;

• Nesta pseudo-instrução ocorre o mesmo que nas duas anteriores, ou seja, o label associado à instru-ção recebe a atribuição do endereço do primeiro byte reservado.

Labels Mnemônicos Operandos Comentários 1 11 12 18 35

ORG 1000h DVar1: DW 1234h ;define um par de posicoes inicializadas QVar1: DW 5678h, 9ABCh ;define um par de posicoes inicializadas C123: DW 1295+12-35 ;define pos. inicializada C123 com 04F8h Letras: DW “Aa” ;define pos. inicializada Letras com 6141h

Figura 3-8: Exemplos para a pseudo-instrução DW.

[Label:] DS num

• Mnemônico de define space.

• Esta pseudo-instrução tem a função de reservar “num” posições de memória consecutivas. As posições de memória não são inicializadas, ou seja, mantêm o seu conteúdo original, ao contrário da diretiva DB. Portanto os valores presentes nestas posições de memória são desconhecidos. O valor “num” pode variar de 00h até 0FFFFh. Ou seja, com esta diretiva podemos definir variáveis (sem inicializa-ção) cujo comprimento varia de um byte até vetores de “num” bytes. Veja a Figura 3-9;

• Nesta pseudo-instrução ocorre o mesmo que nas anteriores, ou seja, o label associado à instrução re-cebe a atribuição do endereço do primeiro byte reservado.

Labels Mnemônicos Operandos Comentários 1 11 12 18 35

ORG 1100h Var2: DS 01h ;define uma posicao sem inicialização Var3: DS Const1 ;define vetor sem inicializacao de 5 bytes Vetx: DS 04h ;define vetor sem inicializacao de 4 bytes

Figura 3-9: Exemplos para a pseudo-instrução DS.

Na Figura 3-10 apresentamos o resultado gerado pelo assembler (o arquivo de listagem, “.prn” ) quando

reunimos todos os exemplos vistos acima.

3.6 Cuidados ao se definir variáveis e constantes. Devemos estar atentos à tarefa de definir variáveis e constantes, pois há várias armadilhas neste tipo de

operação:

A primeira armadilha está exatamente em utilizarmos o ambiente do simulador para a depuração de nos-sos programas. Ao se definir variáveis inicializadas no segmento de dados, utilizando as diretivas BD e DW, tu-do funcionará perfeitamente. Entretanto, quando formos executar o mesmo programa no sistema real (chip mi-croprocessador + chips de memória + chips de E/S) teremos problemas. Como?

Ocorre que o segmento de dados está alocado na memória RAM, que é uma memória volátil. Quando estamos trabalhando com o ambiente do simulador, ocorre a carga de valores em todas as posições de memó-ria que foram inicializadas, seja no segmento de dados ou no segmento de programa.

Page 43: Denny daniel collina   apostila de sitemas microprocessados

A linguagem assembly para o Z80. 41

Mas o mesmo não acontece quando estamos trabalhando com o sistema real. Neste caso, levamos o chip ROM a um equipamento de gravação e gravamos apenas o segmento de programa. O segmento de da-dos não é gravado porque a memória RAM é volátil. Portanto, em um sistema real o segmento de dados per-manecerá sem inicialização. Como solucionar este problema?

Basta efetuar a definição destes valores em uma região da memória ROM (que chamaremos de seg-mento de constantes). Em seguida, deve-se adicionar ao início do seu programa uma pequena rotina que copie estes valores da ROM para as posições da memória RAM que necessitam de inicialização.

A segunda armadilha: a definição de variáveis inicializadas no segmento de programa. Para quem aca-bou de ler o texto anterior parece uma boa solução para a “primeira armadilha”. Definindo as variáveis na me-mória ROM não teremos o inconveniente da perda de dados, pois a memória ROM não é volátil. Certo? Errado. Então qual é o problema?

A memória ROM, como a própria sigla apresenta, é apenas de leitura (read only memory). Portanto, va-lores definidos na ROM, utilizando-se as diretivas DB ou DW não serão perdidos, mas também não poderão ser alterados. Obviamente, estas posições de memória não poderão ser utilizadas como variáveis. Mais uma vez, todos os valores definidos não memória ROM têm a característica de serem constantes e compõem o que po-demos chamar de segmento de constantes.

1 $pw 130 2 defseg var, absolute ;definicao do segmento das variaveis 3 seg var =1000 4 org 1000h =0005 5 Const1 equ 05h ;cria constante numerica Const1 = 05h =006D 6 Const2 equ 01101101b ;cria constante numerica Const2 = 6Dh =00FF 7 Const3 equ 255 ;cria constante numerica Const3 = FFh =0080 8 PortaA equ 80h ;cria constante numerica PortaA = 80h =1234 9 Xyz equ 1234h ;cria constante numerica Xyz = 1234h =0041 10 LetraA equ 'A' ;cria constante ASCII LetraA = 41h =0004 11 WWW equ 13/3 ;cria constante numerica WWW = 4 =3132 12 Digitos equ '12' ;cria constante ASCII Digitos = 3132h 1000 05 13 Var1: db 05h ;inicializa a posicao Var1 com valor 05h 1001 03 09 15 14 Vet1: db 03h, 09h, 15h, 0FFh ;incializa um vetor de 4 bytes 1004 FF 1005 4A 6F 61 15 Name: db "Joao e Maria", 00h ;inicializa unma string ASCII de 13 bytes 1008 6F 20 65 100B 20 4D 61 100E 72 69 61 1011 00 1012 FD FF 0A 16 Vet2: db 253, 0FFh, 12q, 111b ;incializa um vetor de 4 bytes 1015 07 1016 24 17 Var4: db 12*3 ;incializa a posicao Var4 com 24h 1017 72 18 Var5: db Const1 + Const2 ;incializa a posicao Var5 com 72h 1018 32 19 Var6: db 33h and 0FEh ;incializa a posicao Var3 com 32h 1019 1234 20 DVar1: dw 1234h ;inicializa uma word DVar1 com 1234h 101B 5678 9ABC 21 QVar1: dw 5678h, 9ABCh ;incializa duas words 101F 04F8 22 C123: dw 1295+12-35 ;inicializa uma word C123 com 04F8h 1021 4161 23 Letras: dw "Aa" ;inicializa uma word Letras com 6141h 1023 (0001) 24 Var2: ds 01h ;reserva o espaco de 01h byte sem inicializacao 1024 (0005) 25 Var3: ds Const1 ;reserva o espaco de 05h bytes sem inicializacao 1029 (0004) 26 Vetx: ds 04h ;reserva o espaco de 04h bytes sem inicializacao

Figura 3-10: Resultado da montagem de um segmento de dados, com definição de constantes, strings e veto-res (arquivo “.prn”).

Page 44: Denny daniel collina   apostila de sitemas microprocessados
Page 45: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 43

CAPÍTULO 4.

4. AS INSTRUÇÕES DO μPZ80 O microprocessador (μP) que será enfocado em nossas aulas de laboratório o Z80. Ele dispõe de um

conjunto de 158 tipos de instruções diferentes que estão ligadas a funções de controle, a operações aritméticas e lógicas, a entrada e saída de dados e à movimentação de dados. Este conjunto de instruções pode ser divi-dido em 5 grupos:

Instruções de transferência de dados;

Instruções de aritméticas e lógicas;

Instruções de desvio ou instruções de alteração do fluxo do processamento;

Instruções de entrada e saída de dados e

Instruções de controle do processador.

Neste curso não abordaremos todo o conjunto de instruções, trabalharemos com um subconjunto que

constará para instruções mais utilizadas e que têm suas correspondentes em outros sistemas microprocessa-dos ou microcontrolados. O conjunto completo de instruções pode ser consultado no Apêndice B.

A arquitetura de registradores, do μP Z80 já foi apresentada no Capítulo 1, mas é interessante repeti-la aqui. Em uma abordagem simplificada, a arquitetura pode ser apresentada como composta por 20 registrado-res:

Um contador de programa (PC) de 16 bits;

Dois registradores para uso como ponteiros para a memória de 16 bits cada - (registradores de índice IX e IY);

Um registrador de 16 bits para uso como ponteiro de pilha - re-gistrador stack pointer (registrador SP);

Um registrador de 8 bits para execução da maioria das opera-ções aritméticas, lógicas, etc., - o acumulador (registrador A);

Um registrador indicador de estado de 8 bits, dos quais apenas 6 são utilizados - registrador de flags ou registrador de estado (re-gistrador F);

E mais 6 registradores de 8 bits, chamados registradores de pro-pósito geral - B, C, D, E, H, L. Este registradores podem, também, ser utilizados ao pares (BC, DE, HL) transformando-se em 3 regis-tradores de 16 bits;

E, por fim mais um grupo de 8 registradores denominado conjunto alternativo, composto por: A’, F’, B’, C’, D’, E’, H’, L’ que permutam seus valores com o acumulador, o registrador de flags e os re-gistradores de propósito geral.

IMPORTANTE:

A utilização dos registradores de propósito geral ao pares (16 bits), não implica que no momento seguinte não possam ser utilizados como regis-tradores isolados, ou seja, o agrupamento de dois registradores de 8 bits só tem validade durante a execução da instrução e não tem caráter defi-nitivo.

PC

μP Z80

IX IY

SP16 bits

A F

B C

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

Figura 4-1: Arquitetura de regis-

tradores do μP Z80.

Page 46: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 44

4.1 Instruções de transferência de 8 bits. O conjunto de instruções que veremos a seguir permite efetuar a copia de informação entre o micropro-

cessador e a memória. Sendo mais específico, a cópia é feita entre os registradores do μP e a memória e vice-versa. O tamanho da informação copiada é de 8 bits, ou seja, um byte.

Descrição simbólica Descrição

reg8 reg8’ Copia o conteúdo armazenado em um registrador de 8 bits “reg8” para outro registrador de 8 bits “reg8”.

A (end) Copia o conteúdo armazenado na posição de memória especificada “(end)” para o registrador acumulador.

(end) A Copia o conteúdo armazenado no registrador acumulador para a posição de memória especificada por “(end)”.

reg8 byte Copia o conteúdo armazenado na posição de memória consecutiva da instrução para um registrador de 8 bits “reg8”.

Onde: reg8 = A,B,C,D,E,H ou L end = 0000h a FFFFh byte = 00h a FFh

A apresentação das instruções será feita da seguinte forma: primeiro a sintaxe da mesma, em seguida

da o “efeito principal” causado pela instrução, apresentado de forma simbólica e por último alguns comentários. Vejamos, então, cada uma destas instruções:

LD reg8,reg8’ ;reg8 reg8’

• Copia o conteúdo do registrador fonte (reg8) para o registrador de destino (reg8’).

• Os operandos podem ser qualquer um dos registradores: A, B, C, D, E, H, L;

• A instrução ocupa apenas um byte na memória;

• Durante a execução desta instrução nenhum acesso externo (à memória) é feito;

• Ex.: LD A,B LD C,E LD E,E (veja Figura 4-2).

Memória

??

??

??

78h

200Fh:

2010h:

2011h:

200Eh:

Segmento de Programa

B=23h

PC=200Fh

μP Z80

IX IY

SP16 bits

F

C

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A=23h

Figura 4-2: Ilustração para a instrução LD A,B 12.

LD A,(end) ;A (end)

• Copia para o acumulador o conteúdo da posição de memória, cujo endereço é especificado pelo ope-rando end.

• A Instrução ocupa 3 bytes na memória: um para o código de operação e dois para o operando;

• Ex.: LD A,(1900h) LD A,(0022h) LD A,(2500h)13 (veja a Figura 4-3).

12 A situação apresentada nas figuras supõe que a instrução acabou de ser executada e, portanto, o PC aponta para a instrução seguinte. 13 É interessante utilizar o sufixo minúsculo “h” como indicador da base hexadecimal, para não ser confundido com o registrador H do μP.

Page 47: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 45

Memória

02h

??

??

??

2500h:

2501h:

2502h:

24FFh:

Segmento de Dados Memória

00h

25h

??

3Ah

2001h:

2002h:

2003h:

2000h:

Segmento de Programa Código hexa de “STA”

Operando “2500h”

armazenado com os bytes

trocados

B

PC=2003h

μP Z80

IX IY

SP16 bits

F

C

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A=02h

Figura 4-3: Ilustração para a instrução LD A,(2500h).

LD (end),A ;(end) A

• Tem função oposta à instrução anterior, ou seja, copia o conteúdo atual do acumulador para a posição de memória cujo endereço é especificado pelo operando end;

• A Instrução ocupa 3 bytes na memória: um para o código de operação e dois para o operando;

• Ex.: LD (2507h),A LD (1800h),A LD (3A0Ch),A (veja a Figura 4-4).

Memória

??

??

02h

??

2505h:

2506h:

2507h:

2504h:

Segmento de Dados Memória

07h

25h

??

32h

07F6h:

07F7h:

07F8h:

07F5h:

Segmento de Programa

B

PC=07F8h

μP Z80

IX IY

SP16 bits

F

C

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A=02h

Figura 4-4: Ilustração para a instrução LD (2507h),A.

LD reg,byte ;reg byte

• Copia para o registrador especificado o valor constante numérica byte.

• Esta instrução necessita de dois operandos: um registrador e um valor constante numérica.

• A Instrução ocupa 2 bytes na memória: a primeira posição de memória contém o código de operação e o operando reg e a posição de memória seguinte contem o operando byte;

• Ex.: LD A,00h LD B,255 LD C,0AAh LD D,‘w’ LD E,23*6

OBS.: A denominação “imediato” vem do fato de que o valor byte é armazenado na memória de pro-grama “imediatamente” após ao código de operação da instrução. Se, por exemplo, a instrução LD C,0AAh estiver armazenada nas posições de memória 200Eh e 200Fh teremos (veja a Figura 4-5):

Memória

AAh

??

??

0Eh

200Fh:

2010h:

2011h:

200Eh:

Segmento de Programa

B

PC=2010h

μP Z80

IX IY

SP16 bits

F

C=AAh

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Figura 4-5: Ilustração para a instrução LD C,0AAh.

Page 48: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 46

4.2 Instruções de transferência de 16 bits. Neste grupo de instruções ocorre a cópia de informações de 2 bytes de comprimento entre o micropro-

cessador e a memória. Como o μP tem capacidade de manipular informações de um byte de cada vez, a ope-ração ocorrerá em duas etapas. Portanto, são operações que demandarão um número mais de estados (pulsos de clock) para serem completadas.

Uma vez que estamos abordando transferência de 2 bytes de informação, tanto a fonte quanto o destino devem ter esta capacidade de armazenamento. Na memória estaremos utilizando duas posições consecutivas. Internamente ao processador, estaremos trabalhando com registradores de 16 bits. A análise inicial da arquite-tura de registradores do μP Z80 nos apresenta apenas os registradores SP, IX e IY com esta capacidade. Mas devemos nos lembrar que os registradores de propósito geral podem ser utilizados aos pares, ou seja, forman-do três arranjos de 16 bits: par BC, par DE e par HL.

Descrição simbólica Descrição

reg16 dbyte Copia o conteúdo armazenado nas duas posições de memória consecuti-vas da instrução para um registrador (ou par) de 16 bits “reg16”.

reg16 (end) Copia o conteúdo armazenado em duas posições de memória consecuti-vas, cujo endereço inicial é especificado por “(end)” para um regis-trador (ou par) de 16 bits “reg16”.

(end) reg16 Copia o conteúdo armazenado em um registrador (ou par) de 16 bits “reg16” para as duas posições de memória consecutivas, cujo endereço inicial é especificado por “(end)”.

reg16 reg16’ Efetua a permuta do conteúdo do par de registradores especificado. Onde: reg16 = BC,DE,HL,SP,IX ou IY end = 0000h a FFFFh dbyte = 0000h a FFFFh

Vejamos as instruções:

LD reg16,dbyte ;reg16 dbyte

• Copia para os registradores especificados, o valor constante numérica de 16 bits, especificado por dbyte.

• Pode-se especificar qualquer um dos pares de registradores: BC, DE, HL e também os registradores de 16 bits: SP, IX e IY.

• A instrução ocupa 3 bytes na memória: a primeira posição de memória contém o código de operação e o primeiro operando e as duas posições seguintes contêm o valor constante dbyte.

• Ex.: LD HL,1A02h LXI SP,1F00h (veja a Figura 4-6).

OBS.: Supondo que a instrução LD HL,1A02h esteja armazenada a partir da posição de memória 1850h poderemos observar que o código da instrução é armazenado nesta posição, o valor 02h na segunda posição, e o valor 1Ah na terceira e última posição. Esta inversão é característica em vários microprocessadores.

Memória

02h

1Ah

??

21h

1851h:

1852h:

1853h:

1850h:

Segmento de Programa

B

PC=1853h

μP Z80

IX IY

SP16 bits

F

C

D E

H=1Ah L=02h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Figura 4-6: Ilustração para a instrução LD HL,1A02h.

LD reg16,(end) ;reg16 Low (end) reg16 High (end+1)

• Copia o conteúdo da posição de memória end para os 8 bits inferiores do registrador e o conteúdo da posição de memória end+1 para os 8 bits superiores do registrador.

Page 49: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 47

• Pode-se especificar qualquer um dos pares de registradores: BC, DE, HL e também os registradores de 16 bits: SP, IX e IY.

• Ex.: LD HL,1900h (veja a Figura 4-7).

Memória

12h

34h

??

??

1900h:

1901h:

1902h:

18FFh:

Segmento de Dados

Memória

00h

19h

??

2Ah

2504h:

2505h:

2506h:

2503h:

Segmento de Programa

B

PC=2506h

μP Z80

IX IY

SP16 bits

F

C

D E

H=34h L=12h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Figura 4-7: Ilustração para a instrução LD HL,1900h.

LD (end),reg16 ;(end) reg16 Low (end+1) reg16 High

• Copia o conteúdo dos 8 bits inferiores do registrador para a posição de memória end e o conteúdo dos 8 bits superiores do registrador para a posição de memória end+1.

• Pode-se especificar qualquer um dos pares de registradores: BC, DE, HL e também os registradores de 16 bits: SP, IX e IY.

• Ex.: LD (1902h),BC (veja a Figura 4-8).

Memória

??

12h

34h

??

1901h:

1902h:

1903h:

1900h:

Segmento de Dados

Memória

4Bh

02h

19h

EDh

26FFh:

2700h:

2701h:

26FEh:

Segmento de Programa

B=34h

PC=2702h

μP Z80

IX IY

SP16 bits

F

C=12h

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

?? 2702h:

Figura 4-8: Ilustração para a instrução LD (1902h),BC.

EX DE,HL ;DE HL

• O conteúdo do registrador H é trocado com o do registrador D e o mesmo acontece com L e E;

• Durante a execução desta instrução nenhum acesso externo (à memória) é feito;

• Ex.: EX DE,HL (veja a Figura 4-9 e a Figura 4-10).

Memória

??

??

??

EBh

1A07h:

1A08h:

1A09h:

1A06h:

Segmento de Programa

B

PC=1A06h

μP Z80

IX IY

SP16 bits

F

C

D=01h E=00h

H=27h L=65h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Figura 4-9: Ilustração para a instrução EX DE,HL. Situação inicial, a instrução vai ser executada.

Page 50: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 48

Memória

??

??

??

EBh

1A07h:

1A08h:

1A09h:

1A06h:

Segmento de Programa

B

PC=1A07h

μP Z80

IX IY

SP16 bits

F

C

D=27h E=65h

H=01h L=00h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Figura 4-10: Ilustração para a instrução EX DE,HL. Situação final, a instrução foi executada.

EX AF,AF’ ;AF AF’

• O conteúdo do registrador A é trocado com o conteúdo do registrador A’ e o mesmo acontece com F e F’.

• Esta é a única instrução que permite alterar o conteúdo dos registradores alternativos A’ e F’. Não se pode ler ou escrever diretamente em nenhum dos registradores alternativos.

• Ex.: EX AF,AF’ (veja a Figura 4-11 e a Figura 4-12).

Memória

??

??

??

08h

0400h:

0401h:

0402h:

03FFh:

Segmento de Programa

B

PC=03FFh

μP Z80

IX IY

SP16 bits

F=34h

C

D E

H L

A’=56h F’=78h

B’ C’

D’ E’

H’ L’

8 bits

A=12h

Figura 4-11: Ilustração para a instrução EX AF,AF’. Situação inicial, a instrução vai ser executada.

Memória

??

??

??

08h

0400h:

0401h:

0402h:

03FFh:

Segmento de Programa

B

PC=03FFh

μP Z80

IX IY

SP16 bits

F=78h

C

D E

H L

A’=12h F’=34h

B’ C’

D’ E’

H’ L’

8 bits

A=56h

Figura 4-12: Ilustração para a instrução EX AF,AF’. Situação final, a instrução foi executada.

EXX ;BC BC’ DE DE’ HL HL’

• Ocorre a permuta entre os conteúdos dos registradores de propósito geral: B,C,D,E,H e L com os seus correspondentes no banco de registradores alternativos.

• Esta instrução não possui operando.

• Esta é a única instrução que permite alterar o conteúdo destes registradores alternativos. Não se pode ler ou escrever diretamente em nenhum dos registradores alternativos.

• Ex.: EXX (veja a Figura 4-13 e a Figura 4-14).

Page 51: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 49

Memória

D9h

??

??

??

0400h:

0401h:

0402h:

03FFh:

Segmento de Programa

B=22h

PC=0400h

μP Z80

IX IY

SP16 bits

F

C=66h

D=33h E=77h

H=44h L=88h

A’ F’

B’=AAh C’=EEh

D’=BBh E’=FFh

H’=CCh L’=00h

8 bits

A

Figura 4-13: Ilustração para a instrução EXX. Situação inicial, a instrução vai ser executada.

Memória

D9h

??

??

??

0400h:

0401h:

0402h:

03FFh:

Segmento de Programa

B’=22h

PC=0401h

μP Z80

IX IY

SP16 bits

F’

C’=66h

D’=33h E’=77h

H’=44h L’=88h

A F

B=AAh C=EEh

D=BBh E=FFh

H=CCh L=00h

8 bits

A’

Figura 4-14: Ilustração para a instrução EXX. Situação final, a instrução foi executada.

Há, ainda, algumas instruções de transferência de 16 bits que operam valores de e para a pilha (stack),

que serão vistas mais à frente, junto com o grupo de Instruções de alteração de fluxo do processamento (mais especificamente: instruções de subrotina).

4.3 Instruções aritméticas e lógicas. Veremos neste item o subgrupo de instruções aritméticas e lógicas disponíveis no μP Z80. Ele realiza,

através de sua ULA (Unidade Lógica e Aritmética): instruções de adição, subtração, bem como algumas instru-ções lógicas e instruções de comparação, utilizando operandos de 8 bits. O μP dispõe, ainda, de algumas ins-truções que efetuam operações aritméticas com operandos de 16 bits.

4.3.1 Registrador de flags. Até o momento não havíamos tratado do registrador de flags (F). Sua função é armazenar informações

sobre o resultado da última operação executada pela ULA, ou seja, operações aritméticas e lógicas. Portanto, em instruções de transferência, onde não se utiliza a ULA, os flags permanecem inalterados.

Cada bit do registrador “sinaliza” uma característica do resultado obtido, tal como: o resultado da opera-ção é zero, o resultado é positivo, etc. Dos oito bits do registrador, apenas 6 têm função definida e 2 não são u-tilizados. Vejamos:

Page 52: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 50

bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0

S Z --- H --- P/V N CY

Flag S: sign flag

Indica que o resultado da operação é positivo (S=0) ou negativo (S=1). Na verdade este flag é um espelho do bit mais significa-tivo do resultado da operação (bit a7);

Flag Z: zero flag

Indica se o resultado da operação é zero (Z=1) ou diferente de zero (Z=0). É obtido através da função nor de todos os bits do valor resultado;

Flag H: Half carry flag

Indica se ocorreu um “vai-um” do primeiro para o segundo nibble do acumulador, quando da soma de dois valores. É utilizado so-mente com a instrução DAA;

Flag P/V: Parity/overflow

flag

Informa se a paridade do resultado é par (P=1) ou ímpar (P=0) após operações lógicas e indica a ocorrência de overflow após operações aritméticas

Flag N: Add/Subtract flag

Indica que a operação aritmética anterior foi uma soma (N=0) ou foi uma subtração (N=1). É utilizado somente com a instrução DAA.

Flag CY: Carry flag

Indica se ocorreu um “vai-um” do bit mais significativo em uma operação de soma ou se ocorreu um “empréstimo” em uma operação de subtração.

IMPORTANTE:

A operação de subtração é, na verdade, uma operação de soma onde o segundo operando sofreu uma transformação (complemento de dois) pa-ra ter seu sinal algébrico invertido: A-B = A+(-B). Nesta operação o bit Co do último bloco somador completo é (veja a Figura 4-15):

Igual a "1" quando A>B, ou seja, não houve "pede-emprestado" Igual a "0" quando A≤B, ou seja, houve "pede-emprestado"

Este comportamento é exatamente o oposto para a operação de soma (A+B). Por isso podemos observar, a porta xor ligada como inversor con-trolado à saída do referido bit para permitir que o flag CY indique correta-mente o "vai-um" e o "pede-emprestado" para as operações de soma e subtração respectivamente.

OutCarry

S4..S7 S0..S3

74LS83A A4A3A2A1B4B3B2B1

Cin

s4s3s2s1

Cout U1

74LS83A A4A3A2A1B4B3B2B1

Cin

s4s3s2s1

Cout U2

5V

A0A1A2A3

B0B1B2B3

A4A5A6A7

B4B5B6B7

S1

Figura 4-15: Circuito somador/subtrator de 8 bits, da ULA (versão simplificada).

Page 53: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 51

Estes flags em conjunto com as instruções desvio condicional (Prática 3) nos permitirão criar estruturas de programação do tipo “if - then - else” , “switch - case” , etc.

4.3.2 Operações aritméticas com operandos em 8 bits. A grande maioria das operações aritméticas utiliza obrigatoriamente o acumulador como um dos operan-

dos e, também, como destino para o resultado. Isto faz o valor original do acumulador ser perdido. As opera-ções de soma e subtração alteram o estado de todos os flags, já as instruções de incremento e decremento só não alteram o estado do flag CY.

Descrição simbólica Descrição

A A + reg8 A A - reg8

Efetua a operação entre o conteúdo do acumulador e o conteúdo do re-gistrador especificado por “reg8“.

A A + byte A A – byte

Efetua a operação entre o conteúdo do acumulador e o valor constante numérica especificado por “byte“.

A A + reg8 + CY A A - reg8 – CY

Efetua a operação entre o conteúdo do acumulador, o conteúdo do regis-trador especificado por “reg8“ e o conteúdo do flag CY.

A A + byte + CY A A – byte – CY

Efetua a operação entre o conteúdo do acumulador, o valor constante numérica especificado por “byte“ e o conteúdo do flag CY.

reg8 reg8 + 1 reg8 reg8 - 1

Incrementa/decrementa o registrador especificado por “reg8“.

A -A Efetua o complemento de 2 do conteúdo do acumulador. Onde: reg8 = A,B,C,D,E,H ou L byte = 00h a FFh

Anteriormente apresentamos as instruções de forma detalhada e ilustrada para permitir uma melhor as-

similação no primeiro contato com as instruções. Daqui em diante as instruções serão apresentadas de forma mais concisa.

• O conteúdo do acumulador é somado com o operando especificado. O resultado é copiado para acu-mulador;

• Ex.: ADD A,A ;A ← A + A ADD A,3Fh ;A ← A + 3Fh

• O conteúdo do acumulador é subtraído do operando especificado. O resultado é copiado para acumu-lador;

• Ex.: SUB A,C ;A ← A - C SUB A,33h ;A ← A - 33h

• O conteúdo do registrador é incrementado (ou decrementado) de uma unidade;

• O único flag que não é afetado é o CY.

• Ex.: INR E ;E ← E + 1 DCR B ;B ← B - 1

ADD A,reg8 ;A A + reg8 ADD A,byte ;A A + byte

0

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

SUB reg8 ;A A - reg8 SUB byte ;A A – byte

1

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

INC reg8 ;reg8 reg8 + 1 DCR reg8 ;reg8 reg8 - 1

0 1

-

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

Page 54: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 52

• O valor zero é subtraído do conteúdo do acumulador, ou seja, obtém-se a inversão de sinal do conteú-do do acumulador, ou ainda, obtém-se o complemento de 2 do conteúdo do acumulador;

• Ex.: LD A,01h ;A ← 01h NEG ;A ← FFh

As instruções aritméticas apresentadas a seguir efetuam as operações de soma e subtração levando em

consideração o estado do "vai-um" (ou pede-emprestado) da operação executada anteriormente.

Estas instruções são as responsáveis por permitir a execução de operações aritméticas com valores cujo número de bits é superior ao da palavra do microprocessador. A solução é implementada utilizando as instru-ções ADD ou SUB para operar o primeiro byte e em seguida utiliza-se ADC ou SBC para as operações seguin-tes, sejam elas quantas forem. Veja o exemplo abaixo:

0 1 0 1 22 19 2A 3F 75 + 1C + 99 + F3 + 45 + 91

0 3D 0 B3 1 5D 0 85 1 06 CY CY CY CY CY

Figura 4-16: Soma de vários bytes.

• O conteúdo do acumulador é somado com o operando especificado e com o flag CY. O resultado é co-piado para acumulador;

• Ex.: ADC A,B ;A ← A + B + CY ADC A,1Ah ;A ← A + 1Ah + CY

• O conteúdo do acumulador é subtraído do operando especificado e do flag CY. O resultado é copiado para acumulador;

• Ex.: SBC A,C ;A ← A - C - CY SBC A,05h ;A ← A - 05h - CY

4.3.3 Instruções de comparação. Estas instruções, na verdade, compõem um subgrupo das Operações aritméticas com operandos de 8

bits, e estão sendo apresentadas separadamente devido à sua importância.

A comparação entre dois valores sempre toma o acumulador como um dos operandos. O segundo ope-rando pode ser qualquer um dos registradores de propósito geral ou um valor constante.

A comparação propriamente dita é feita através da operação aritmética de subtração. Ao contrário da operação de subtração vista anteriormente, aqui, o conteúdo do acumulador é preservado, ou seja, o resultado da operação não é carregado no acumulador, alterando-o. Como uma operação foi efetuada pela ULA, os bits do registrador de flags são alterados. Portanto as instruções de comparação afetam apenas os flags.

Vejamos quais são:

NEG ;A 0 - A 1 Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

ADC A,reg8 ;A A + reg8 + CY ADC A,byte ;A A + byte + CY

0

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

SBC A,reg8 ;A A – reg8 SBC A,byte ;A A - byte

1

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

Page 55: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 53

• O conteúdo do acumulador é comparado com o segundo operando através de uma operação de sub-tração não destrutiva;

• Todos os flags são afetados.

• Ex.: Suponha A = 01h, B = 10h e C = 01h CMP B ;S ← 1 Z ← 0 H ← 0 P ← 0 CY ← 1 CMP C ;S ← 0 Z ← 1 H ← 0 P ← 1 CY ← 0 CPI 0FFh ;S ← 0 Z ← 0 H ← 0 P ← 0 CY ← 1

Pergunta: Por que a operação de comparação CPI 0FFh gerou como resultado o flag S = 0 ? Resposta: Lembre-se que esta operação baseia-se na subtração dos valores para a atualização dos flags, e

deve-se lembrar, ainda, que a subtração ocorre através da soma do primeiro operando com o complemento de 2 do segundo operando. O valor 0FFh, quando submetido ao complemento de 2 torna-se 01h que, então soma do com 01h gera o valor resultado 02h, positivo, justificando o re-sultado S = 0.

Pergunta: Mas 01h é menor que 0FFh. O flag S não deveria indicar que a comparação (subtração) destes

dois valores é negativa ? Resposta: Não. Pois quando se trabalha com subtração o bit 7 de cada operando é sempre interpretado co-

mo bit de sinal, e portanto o valor 0FFh é um valor negativo, ou seja, 0FFh = -01h. A subtração de 01h - (-01h) = +02h.

Pergunta: Mas no meu programa 0FFh equivale a 255. Como eu faço para ter uma indicação que 01h é

menor que 0FFh ? Resposta: Toda vez que for comparar valores absolutos utilize o flag CY. Observe que na comparação feita

CY = 1. Isto indica que o valor absoluto do primeiro operando é menor que o segundo operando e houve a geração de um "pede-emprestado" (borrow). Se a situação fosse ao contrário o flag CY também indicaria corretamente.

IMPORTANTE:

O flag S só deve ser utilizado em programas que operem valores "com si-nal" em caso contrário deve-se utilizar o flag CY para efetuar a compara-ção entre dois valores.

4.3.4 Operações com valores codificados em BCD. O circuito somador/subtrator dos microprocessadores (veja Figura 4-15) executa apenas operações com

valores binários puros. Contudo, a entrada de valores via teclado, não gera números binários puros, mas valo-res decimais codificados em binário (BCD). Isto nos leva a pensar que, então, teremos que efetuar a conversão destes valores para binário para que possam ser operados. Deve-se lembrar, ainda, que depois de operados, é possível que o resultado seja apresentado em um display. O que nos levaria a executar uma nova conversão, só que agora de binário para BCD.

Seria muito interessante se o μP pudesse operar diretamente com valores em BCD, pois isto implicaria em um processamento um pouco mais rápido, uma vez que não seriam necessárias as conversões BCD → BIN e BIN → BCD. Na verdade não se opera diretamente em BCD, o que se faz é efetuar as opera-ções dos valores em BCD utilizando as instruções normais do μP e logo em seguida procede-se a um ajuste da operação utilizando instruções do tipo DAA.

• Decimal adjust accumulator;

CP reg8 ;A - reg8 CP byte ;A - byte

1

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

DAA ;ajuste decimal do acumulador - Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

Page 56: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 54

• O conteúdo é ajustado para um valor BCD, levando-se em conta o estado dos flags CY, H, e N. O ajus-te é feito somando 6 a cada digito que tiver valor superior a 9 ou que apresentar um dos flags acima a-tivo;

• O único flag que não é afetado é o N.

Exemplo 1: O usuário deseja somar os valores 3510 e 2910 cujo resultado será apresentado no display.

Não entrando no mérito das rotinas de acesso ao teclado e ao display, vamos supor que no momento da ope-ração os valores acima estejam carregados respectivamente nos registradores A e B. Vale observar que os va-lores lidos do teclado 35BCD (0011 01012) e 29BCD (0010 10012), serão armazenados como 35h e 29h e serão operados inicialmente como valores hexadecimais (ou binários, como queira). Vejamos a operação entre eles:

ADD B ;A ← 35h + 29h A ← 5Eh CY=0 H=0

O valor obtido não está correto, pois deveria ser 64BCD. Agora o que se deve fazer é promover o ajuste desta soma, utilizando a instrução DAA

DAA ;A ← 5Eh + 06h A ← 64h

O resultado da execução da instrução DAA se baseia na análise do valor de cada um dos dígitos do valor resultado gerado pela soma. Caso algum deles tenha valor superior a 9, faz-se a soma do fator de correção 6, para que o resultado passe a conter apenas dígitos decimais.

Exemplo 2: Suponha, agora, que os valores a serem somados sejam 98BCD e 29BCD. Teremos:

ADD B ;A ← 98h + 29h A ← C1h CY=0 H=1

Novamente, o valor obtido não está correto, pois deveria ser 127BCD. Mais uma vez promoveremos o a-juste desta soma, utilizando a instrução DAA.

Deve-se observar que a soma dos dígitos menos significativos dos valores gerou um estouro no primeiro dígito: 8h + 9h = 11h, que é armazenado fazendo o flag H=1. Portanto, apesar do dígito menos significativo de C1h ser menor que 9, a soma do fator de correção deve ser feita.

DAA ;A ← C1h + 66h A ← 27h CY=1 H=1

4.3.5 Operações aritméticas com operandos em 16 bits. Neste grupo temos poucas instruções se comparado com o grupo de 8 bits. Há uma observação impor-

tante a se destacar: o par de registradores HL é utilizado de forma especial. Ele funciona como um “acumula-dor” de 16 bits, ou seja, nas operações de soma e subtração o operando implícito (obrigatório) é o par HL.

Descrição simbólica Descrição

HL HL + reg16 Efetua a soma entre o conteúdo do par HL e o conteúdo do par espe-cificado por “reg16“.

HL HL + reg16 + CY HL HL - reg16 – CY

Efetua a operação entre o conteúdo do par HL, o conteúdo do par especificado por “reg16“ e o conteúdo do flag CY.

reg16 reg16 + 1 reg16 reg16 - 1

Incrementa/decrementa o par especificado por “reg16“.

Onde: reg8 = BC,DE,HL ou SP

Vamos às instruções:

• O conteúdo do par de registradores HL é somado ao conteúdo do par especificado e o resultado é co-piado para o par HL. Isto faz com que o conteúdo original do par HL seja perdido;

• Ex.: ADD HL,BC ;HL ← HL + BC ADD HL,SP ;HL ← HL + SP

Suponha como situação inicial, HL = 1234h e SP = 5678h, teremos: HL ← 1234h + 5678h, HL ← 68ACh

ADD HL,reg16 ;HL HL + reg16 - - ? - 0 Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

Page 57: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 55

• O conteúdo do par de registradores HL é somado ao conteúdo do par especificado e ainda soma-se o flag CY. O resultado é copiado para o par HL. Isto faz com que o conteúdo original do par HL seja per-dido;

• Ex.: ADC HL,DE ;HL ← HL + DE + CY ADC HL,SP ;HL ← HL + SP + CY

Suponha como situação inicial, HL = 1234h, SP = 5678h e CY = 1, teremos: HL ← 1234h + 5678h + 1, HL ← 68ADh

• O conteúdo do par de registradores é incrementado (ou decrementado) de uma unidade;

• Nenhum flag é afetado.

• Ex.: INC H ;HL ← HL + 1 Suponha como situação inicial, HL = 12FFh, teremos: HL ← 12FF + 1h, HL ← 1300h

DEC B ;BC ← BC - 1 Suponha como situação inicial, BC = 0000h, teremos: BC ← 0000h - 1h, BC ← FFFFh

4.3.6 Operações lógicas. Este conjunto de operações nos permite atuar no registrador acumulador de maneira bem diferente que

o conjunto de operações aritméticas. Aqui podemos enfocar o registrador como um “pacote de bits” e alterar o estado de um ou mais destes. O μP Z80 possui quatro instruções lógicas: as três elementares - AND, OR e NOT, e uma composta XOR. Com estas instruções é possível efetuar as três operações básicas com bits e uma com o byte.

Operação Função Lógica Descrição

Clear bit AND Ajustar o nível lógico de um ou mais bits para "0"

Set bit OR Ajustar o nível lógico de um ou mais bits para "1"

Complement bit XOR Alternar o nível lógico de um ou mais bits

Complement byte NOT Alternar o nível lógico de todo o byte

Assim como para as instruções aritméticas, neste grupo o acumulador participa como um dos operandos

e, também, como o destino do resultado da operação.

• Todos os bits do acumulador são complementados (negação lógica);

• Esta instrução não possui operando, portanto somente o acumulador pode ser complementado;

• Esta instrução pode ser utilizada para efetuar a operação de complement byte;

• Ex.: CPL ;A ← not (A ) Suponha como situação inicial, A = 3Ah, teremos:

ADC HL,reg16 ;HL HL + reg16 + CY SBC HL,reg16 ;HL HL - reg16 – CY

? 0 1

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

INC reg16 ;reg16 reg16 + 1 DEC reg16 ;reg16 reg16 - 1

- - - - - -

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

CPL ;A not (A) 1 1 Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

Not 0011 1010 1100 0101

Page 58: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 56

• A operação lógica é executa bit a bit entre os operandos, ou seja, a função AND é aplicada entre os “bits 0” dos operandos gerando o “bit 0” do resultado, e assim acontece para os demais bits;

• Todos os flags são afetados, sendo que três flags sempre apresentarão o mesmo estado: CY e N = 0 H = 1;

• Esta instrução pode ser utilizada para efetuar a operação de clear bit;

• Ex.: ANI 00h ;A ← A and 00h ANA C ;A ← A and C

Suponha como situação inicial, A = 3Ah e C = 9Fh, teremos:

• A operação lógica é executa bit a bit entre os operandos, ou seja, a função OR é aplica entre os “bits 0” dos operandos gerando o “bit 0” do resultado, e assim acontece para os demais bits;

• Todos os flags são afetados, sendo que três flags sempre apresentarão o mesmo estado: CY, N e H = 0;

• Esta instrução pode ser utilizada para efetuar a operação de set bit;

• Ex.: OR L ;A ← A or L OR 9Fh ;A ← A or 00h

Suponha como situação inicial, A = 3Ah, teremos:

• A operação lógica é executa bit a bit entre os operandos, ou seja, a função XOR é aplica entre os “bits 0” dos operandos gerando o “bit 0” do resultado, e assim acontece para os demais bits;

• Todos os flags são afetados, sendo que três flags sempre apresentarão o mesmo estado: CY, N e H = 0;

• Esta instrução pode ser utilizada para efetuar a operação de complement bit;

• Ex.: XRA H ;A ← A xor H XRI 9Fh ;A ← A xor 00h

Suponha como situação inicial, A = 3Ah, teremos:

Ha duas instruções que também efetuam operações lógicas que, ao contrário das anteriores, não tomam

o acumulador como operando. Ao contrário, elas operam apenas um bit do registrador de flags: o bit carry (CY). Vejamos:

• Complement carry flag;

• A operação lógica not é executada apenas no flag carry. Entretanto, o flag N apresentará sempre o mesmo estado: N = 0. Nenhum outro registrador será afetado;

• Esta instrução não possui operando, portanto é aplicável apenas ao flag carry. Não há instruções simi-lares para os outros flags.

AND reg8 ;A A and reg8 AND byte ;A A and byte

1 0 0

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

0011 1010 and 1001 1111

0001 1010

OR reg8 ;A A or reg8 OR byte ;A A or byte

0 0 0

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

0011 1010 or 1001 1111

1011 1111

XOR reg8 ;A A xor reg8 XOR byte ;A A xor byte

0 0 0

Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

0011 1010 xor 1001 1111

1010 0101

CCF ;CY not (CY) - - ? - 0 Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

Page 59: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 57

• Set carry flag;

• O flag Carry é carregado com “1” independente do seu conteúdo anterior. Os flags H e N sempre apre-sentarão o mesmo estado H,N = 0;

• Esta instrução não possui operando, portanto é aplicável apenas ao flag carry. Não há instruções simi-lares para os outros flags.

4.4 Modos de endereçamento. Em boa parte das várias instruções que já apresentamos, é possível efetuar a seleção de operandos,

como por exemplo:

1. LD A,(end) podemos selecionar o conteúdo de uma das 65.536 posições de memória;

2. LD reg8,reg8‘ podemos selecionar o conteúdo de um dos registradores de 8 bits;

3. LD reg8,byte podemos selecionar o conteúdo de um dos registradores e um valor constante, ambos de 8 bits.

4. LD reg16,dbyte podemos selecionar o conteúdo de um dos registradores e um valor constante, ambos de 16 bits.

A esta possibilidade de seleção de informação proveniente de vários locais de armazenamento chama-mos de modos de endereçamento. Os exemplos apresentados acima ilustram as 3 possibilidades de seleção que conhecemos até o momento que são: endereçamento direto, de registrador e imediato. Vamos destacar, ainda, um quarto modo de endereçamento: relativo.

4.4.1.1 Endereçamento direto ou estendido.

Permite a seleção do conteúdo de uma posição de memória utilizando como operando uma constante numérica de 16 bits.

As instruções que utilizam este modo de endereçamento ocupam 3 bytes: um para o código de operação de mais dois para o operando.

Exemplo: LD A,(1500h) JP 2200h ;a instrução jump será apresentada no item 4.5 .

4.4.1.2 Endereçamento de registrador.

Permite a seleção de um dos registradores do μP.

As instruções que utilizam este modo de endereçamento, normalmente, ocupam apenas 1 byte, que contem tanto o código de operação quanto o operando.

Exemplo: LD D,H EX DE,HL

4.4.1.3 Endereçamento imediato e imediato estendido.

Permite a seleção de um valor constante numérica de 8 ou 16 bits.

As instruções que utilizam este modo de endereçamento podem ocupar de 2 a 4 bytes.

Exemplo: LD D,15h LH DE,1122h

SCF ;CY 1 - - 0 - 0 1 Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ã o a f e t a d o Flags S Z H P/V N CY

Page 60: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 58

4.4.1.4 Endereçamento relativo.

Permite fazer referência a uma posição de memória cujo endereço pode estar até +129 bytes (posterio-res ao endereço de armazenamento da instrução em questão), ou ainda até -126 bytes (anteriores).

Enquanto o endereçamento absoluto utiliza um operando de 2 bytes, o endereçamento relativo conta com um operando de apenas 1 byte. Este byte é interpretado como um valor com sinal (em complemento de 2). Portanto poderemos ter valores que variam entre –128 a +127.

O endereçamento relativo ocorre pela soma deste valor com o conteúdo atual do registrado PC. É bom ressaltar que no momento em que ocorreu a busca do operando (o segundo byte da instrução), o conteúdo do PC será PC+2 se comparado com o endereço inicial (antes da busca da instrução acontecer). Ao conteúdo de PC+2 é que será somado o valor relativo e, portanto, teremos um desvio que pode atingir 126 posições de memória anteriores (–126) ou 129 posições de memória posteriores (+129).

Este modo de endereçamento é utilizando nas instruções de desvio relativo (relative jump = JR) que en-focaremos no item seguinte. Este modo apresenta duas vantagens:

A instrução utiliza apenas 2 bytes , contra 3 bytes se fosse utilizado o endereçamento direto. Isto im-plica em um programa mais compacto, permitindo economizar memória;

Facilita a criação de programas relocáveis, pois um programa implementado apenas endereçamento relativo não tem vínculo com um endereço fixo.

Exemplo: JR 120 JR –90 JR NC,–126

4.4.1.5 Endereçamento indireto.

Destes quatro modos de endereçamento vistos, os modos direto e imediato sempre selecionam um mesmo valor, seja ele de uma posição de memória diretamente especificada ou uma constante numérica ime-diata, respectivamente.

No entanto, há casos onde é necessário efetuar a leitura (ou escrita) em várias posições de memória, consecutivas ou não, como por exemplo, a análise de um vetor de valores. Para implementar um programa que efetuasse a análise deste vetor, com o conjunto de instruções que conhecemos até o momento, seria necessá-rio utilizar-se de tantas instruções LD quantos forem os valores a serem analisados. Mas surge uma outra questão: se o número de elementos do vetor não for previamente conhecido, ou ainda, se o vetor tiver número de elemento variável?

Nestes dois últimos casos não seria possível a implementação de um programa utilizando-se das instru-ções que conhecemos até o momento. É necessário, portanto, que o μP disponha de instruções que permitam a solucionar estas proposições.

A solução para o problema apresentado acima, passa pela necessidade de o μP dispor de um grupo de instruções de movimentação que não tenham operandos constantes.

O μP Z80 dispõe de instruções de transferência cujos operandos estão armazenados em registradores de 16 bits ou em pares de registradores (IX, IY, BC, DE ou HL), e como vimos, o conteúdo dos registradores pode ser facilmente incrementado, decrementado, somado, etc. A estes registradores damos o nome de apon-tadores para a memória ou simplesmente ponteiros.

O endereçamento indireto é, portanto, uma forma de transferência de dados onde o operando da instru-ção, ou seja, o endereço da posição de memória que vai ser acessada, não é especificado diretamente na linha da instrução. Ele deve ser definido, previamente, através da carga adequada (inicialização) do registrador pon-teiro que será utilizado.

Dividiremos a apresentação das instruções de endereçamento indireto em dois grupos: as que utilizam como ponteiro os pares de registradores BC e DE, que veremos a seguir, e as que utilizam o par de registrado-res HL. O Z80 dispõe, ainda, de instruções que utilizam os registradores de indexação IX e IY, que não apre-sentaremos.

Vale lembrar que o registrador SP também é um registrador ponteiro, basta lembrar que SP é sigla para stack pointer. Entretanto, sua utilização está vinculada à operação de valores de uma estrutura de memória que, novamente é indicada pelo seu nome: a pilha.

Page 61: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 59

4.4.2 Endereçamento indireto utilizando os pares BC e DE. Este subgrupo de instruções é bem limitado e tem como característica principal a utilização exclusiva do

registrador acumulador como elemento de ligação entre o μP e a memória.

LD A,(BC) ;A (BC) LD A,(DE) ;A (DE)

• Esta instrução é semelhante à LD A,(end) no fato de que ambas copiam o conteúdo de uma deter-minada posição de memória para o acumulador. A diferença ocorre que para LD A,(end) o endereço da posição de memória é um valor numérico constante (fixo, invariável) definido pelo operando. Já pa-ra esta instrução, o endereço da posição de memória é obtido através do conteúdo do par de registra-dores especificado;

• Os pares BC e DE só podem ser especificados como ponteiros para transferência de dados envolvendo o acumulador. Os demais registradores não podem ser especificados como operandos;

• A instrução ocupa apenas um byte na memória;

• Ex.: LD BC,23AAh (veja a Figura 4-17). LD A,(BC)

Lembre-se: A inicialização do conteúdo do registrador ponteiro deve preceder, em algum momento, a utilização do mesmo.

Memória

82h

??

??

??

23AAh:

23ABh:

23ACh:

23A9h:

Segmento de Dados Memória

0Ah

??

??

??

2001h:

2002h:

2003h:

2000h:

Segmento de Programa

B=23h

PC=2002h

μP Z80

IX IY

SP16 bits

F

C=AAh

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A=82h

Figura 4-17: Ilustração para a instrução LD A,(BC).

LD (BC),A ;(BC) A LD (DE),A ;(DE) A

• Esta instrução é semelhante à LD (end),A no fato de que ambas copiam o conteúdo do acumulador para uma determinada posição de memória. A diferença ocorre que para LD (end),A o endereço da posição de memória é um valor numérico constante (fixo, invariável) definido pelo operando. Já para esta instrução, o endereço da posição de memória é obtido através do conteúdo do par de registrado-res especificado;

• Os pares BC e DE só podem ser especificados como ponteiros para transferência de dados envolvendo o acumulador. Os demais registradores não podem ser especificados como operandos;

• A instrução ocupa apenas um byte na memória;

• Ex.: LD DE,2765h (veja a Figura 4-18). LD (DE),A

Lembre-se: A inicialização do conteúdo do registrador ponteiro deve preceder, em algum momento, a utilização do mesmo.

Page 62: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 60

Memória

??

??

82h

??

2763h:

2764h:

2765h:

2762h:

Segmento de Dados Memória

??

12h

??

??

1B01h:

1B02h:

1B03h:

1B00h:

Segmento de Programa

B=23h

PC=1B02h

μP Z80

IX IY

SP16 bits

F

C=AAh

D=27h E=65h

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A=82h

Figura 4-18: Ilustração para a instrução LD (DE),A.

4.4.3 Endereçamento indireto utilizando o par HL. Em oposição ao subgrupo de instruções que utiliza os pares BC e DE, a utilização do par de registradores

HL permite:

A transferência de informação entre o μP e a memória utilizando qualquer um dos registradores de 8 bits,

A cópia de um valor constante (imediato de 8 bits) diretamente para uma posição de memória;

A realização de operações aritméticas e lógicas entre o conteúdo do acumulador e a memória;

A realização de operações de comparação entre o conteúdo do acumulador e a memória.

Há, ainda, subgrupos de instruções que não foram apresentadas, mas que também trabalham com o

ponteiro HL. Elas logo serão abordadas.

IMPORTANTE:

Uma regra prática que apresenta poucas exceções: Pode-se especificar como operando o ponteiro HL em substituição a qualquer um dos regis-tradores de 8 bits: A, B, C, D, E, H ou L.

Na bibliografia do μP 8085 [04], o concorrente do Z80, o conteúdo apontado pelo par HL recebe a deno-minação de “pseudo-registrado M”.

A lista completa das instruções que utilizam o ponteiro HL é apresentada abaixo. Devido à grande quan-tidade de instruções, e de algumas já terem sido apresentadas anteriormente, selecionamos apenas alguns exemplos. Para o detalhamento das demais instruções, consulte a tabela do conjunto de instruções do proces-sador.

ADC A,(HL) INC (HL) RL (HL) SLA (HL) ADD A,(HL) JP (HL) RLC (HL) SRA (HL) AND (HL) LD (HL),reg8 RR (HL) SRL (HL) BIT n,(HL) LD reg8,(HL) RRC (HL) SUB (HL) CP (HL) OR (HL) SBC A,(HL) XOR (HL) DEC (HL) RES n,(HL) SET n,(HL)

Figura 4-19: Lista das instruções de endereçamento indireto que utilizam o ponteiro HL.

LD reg8,(HL) ;reg8 (HL) LD (HL), reg8 ;(HL) reg8

• A transferência de informação é feita entre o registrador de 8 bits especificado e o conteúdo da posição de memória apontada pelo para de registradores HL;

• Podem ser especificados como registrador de 8 bits: A, B, C, D, E, H ou L;

Page 63: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 61

• Deve-se ter cuidado ao transferir qualquer conteúdo da memória para os registradores H ou L, pois isto implica na possível alteração de seus conteúdos, e conseqüentemente do endereço para o qual apon-tam;

• A instrução ocupa apenas um byte na memória;

• Ex.: Analise o seguinte fragmento de programa abaixo e acompanhe os resultados nas figuras a se-guir:

LD HL,2200h LD D,(HL) (veja a Figura 4-20) INC HL LD (HL),E (veja a Figura 4-21) INC HL LD (HL),0FFh (veja a Figura 4-20).

Lembre-se: A inicialização do conteúdo do registrador ponteiro deve preceder, em algum momento, a utilização do mesmo.

Memória

23h

??

??

56h

1B56h:

1B57h:

1B58h:

1B55h:

Segmento de Programa Memória

05h

1Bh

CAh

??

2200h:

2201h:

2202h:

21FFh:

Segmento de Dados

B

PC=1B56h

μP Z80

IX IY

SP16 bits

F

C

D=05h E=55h

H=22h L=00h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Figura 4-20: Ilustração para a instrução LD D,(HL).

Memória

23h

73h

23h

56h

1B56h:

1B57h:

1B58h:

1B55h:

Segmento de Programa Memória

05h

55h

CAh

??

2200h:

2201h:

2202h:

21FFh:

Segmento de Dados

B

PC=1B58h

μP Z80

IX IY

SP16 bits

F

C

D=05h E=55h

H=22h L=01h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Figura 4-21: Ilustração para a instrução LD (HL),E.

Memória

FFh

??

??

36h

1B5Ah:

1B5Bh:

1B5Ch:

1B59h:

Segmento de Programa Memória

05h

55h

CAh

??

2200h:

2201h:

2202h:

21FFh:

Segmento de Dados

B

PC=1B5Bh

μP Z80

IX IY

SP16 bits

F

C

D E

H=22h L=02h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Figura 4-22: Ilustração para a instrução LD (HL),0FFh.

Page 64: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 62

• O conteúdo do acumulador é somado com o conteúdo da posição de memória apontada pelo par HL. O resultado é copiado para acumulador;

• Ex.: LD HL,1500h ADD A,(HL) ;A ← A + (1500h)

• O conteúdo da posição de memória apontada pelo para HL é incrementado de uma unidade;

• O único flag que não é afetado é o CY.

• Ex.: LD HL, 1000h INR (HL) ;(1000h) ← (1000h) + 1

• A operação lógica é executa bit a bit entre os operandos, ou seja, a função XOR é aplica entre os “bits 0” dos operandos gerando o “bit 0” do resultado, e assim acontece para os demais bits;

• Todos os flags são afetados, sendo que três flags sempre apresentarão o mesmo estado: CY, N e H = 0;

• Esta instrução pode ser utilizada para efetuar a operação de complement bit;

• Ex.: LD HL, 1200h XRA H ;A ← A xor (1200h)

• O conteúdo do acumulador é comparado com o segundo operando através de uma operação de sub-tração não destrutiva;

• Todos os flags são afetados.

4.5 Instruções de desvio. As instruções de desvio, de uma forma geral, podem ser divididas em dois grupos: instruções do tipo

jump e instruções do tipo call/return. Neste item veremos as do tipo jump. O outro grupo será visto posterior-mente.

O registrador F (flags) foi implementado no microprocessador para fornecer informações a respeito do resultado da última operação executada pela ULA, como vimos no item 4.3.1 . O μP dispõe de um conjunto de instruções que, em função destas condições, rompe ou não a seqüência natural de execução das instruções. A este tipo instruções damos o nome de instruções de desvio condicional. Com elas poderemos criar as estrutu-ras de programação do tipo “if - then - else” e outras. o μP possui, ainda, instruções que efetuam o desvio de processamento independente de qualquer condição, são as instruções de desvio incondicional.

As instruções de desvio do tipo jump, sejam condicionais ou incondicionais podem, ainda, ser subdividi-das em desvio absoluto e desvio relativo, veja a Figura 4-23.

As instruções de desvio absoluto utilizam o modo de endereçamento direto (também chamado de esten-dido, consulte o item 4.4.1.1 ), que tem como característica fazer referência a uma posição de memória especí-fica, através da utilização de um operando constante numérica de 16 bits.

As instruções de desvio relativo utilizam o modo de endereçamento relativo (consulte o item 4.4.1.4 ) e, portanto, o endereço apontado constitui uma referência a uma posição de memória anterior ou posterior a posi-ção da instrução atual.

ADD A,(HL) ;A A + (HL) 0 Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ão a f e t a do Flags S Z H P/V N CY

INC (HL) ;(HL) (HL) + 1 0 - Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ão a f e t a do Flags S Z H P/V N CY

XOR (HL) ;A A xor (HL) 0 0 0 Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ão a f e t a do Flags S Z H P/V N CY

CP (HL) ;A – (HL) 1 Legenda: r e f l e t e r esu l t ad o d a op e r açã o ; ? i n d e t e r m i na do ; – n ão a f e t a do Flags S Z H P/V N CY

Page 65: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 63

Instruções de Desvio

Jump Call Return

Absoluto Relativo

Incondicional Condicional Incondicional Condicional Incondicional Condicional

Absoluto

Figura 4-23: Tipos de instrução de desvio.

4.5.1 Instruções de desvio absoluto incondicional. JP end ;PC end

• O endereço especificado como operando da instrução é carregado no registrador PC, fazendo com que o processamento prossiga a partir da posição de memória especificada por end. Nenhum flag é testa-do para se efetuar o desvio, assim como nenhum flag é afetado pela execução da instrução.

• Ex.: JP 2200h ;PC ← 2200h

JP (HL) ;PC HL

• O conteúdo do par de registradores HL é copiado para o registrador PC, fazendo com que o pro-cessamento prossiga a partir da posição de memória especificada pelo conteúdo de HL. Nenhum flag é testado para se efetuar o desvio;

• Deve-se o tomar cuidado de inicializar corretamente o par de registradores HL, pois seu conteúdo de-terminará o endereço de prosseguimento da execução do programa. Caso seja feita de forma inade-quada, pode resultar em perda do processamento;

• Esta instrução não possui operando.

• Ex.: JP (HL) ;Suponha como situação inicial, HL = 0600h, teremos: ;PC ← 0600h

4.5.2 Instruções de desvio absoluto condicional. Para cada bit do registrador de flags podemos ter duas condições, como por exemplo: o resultado é ze-

ro (flag Z = 1) ou o resultado não é zero (flag Z = 0). O μP utiliza 4 bits do registrador F para implementar as instruções de desvio teremos, portanto, oito instruções de desvio condicional. Vejamos:

JP P,end ;PC end se flag S = 0

• Jump if positive;

• O desvio do processamento é cumprido se o resultado da última operação foi positivo (flag S = 0), em caso contrário o processamento continua na instrução seguinte;

14 Indicador para instruções “perigosas”. São instruções que podem causar efeitos imprevisíveis no processamento se utilizadas de forma

inadequada.

14

Page 66: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 64

• Ex.: JP P,2100h ;PC ← 2100h se S = 0

JP M,end ;PC end se flag S = 1

• Jump if minus;

• O desvio do processamento é cumprido se o resultado da última operação foi negativo (flag S = 1), em caso contrário o processamento continua na instrução seguinte;

• Ex.: JP M,2200h ;PC ← 2200h se S = 1 (para as demais instruções os exemplos são semelhantes).

JP NZ,end ;PC end se flag Z = 0

• Jump if not zero;

• O desvio do processamento é cumprido se o resultado da última operação foi diferente de zero (flag Z = 0), em caso contrário o processamento continua na instrução seguinte;

JP Z,end ;PC end se flag Z = 1

• Jump if zero;

• O desvio do processamento é cumprido se o resultado da última operação foi igual a zero (flag Z = 1), em caso contrário o processamento continua na instrução seguinte;

JP PO,end ;PC end se flag P = 0

• Jump if parity odd;

• O desvio do processamento é cumprido se o resultado da última operação implicou no flag P = 0. Caso tenha sido uma operação lógica, o flag está sinalizando paridade par. Caso tenha sido operação aritmética o flag está sinalizando que não ocorreu overflow;

JP PE,end ;PC end se flag P = 1

• Jump if parity even;

• O desvio do processamento é cumprido se o resultado da última operação implicou no flag P = 1. Caso tenha sido uma operação lógica, o flag está sinalizando paridade ímpar. Caso tenha sido opera-ção aritmética o flag está sinalizando que ocorreu overflow;

JP NC,end ;PC end se flag CY = 0

• Jump if no carry;

• O desvio do processamento é cumprido se o resultado da última operação não implicou em “vai-um” ou “empréstimo” (flag CY = 0). Tendo ocorrido “empréstimo” ou “vai-um” (flag CY = 1) o processamento continua na instrução seguinte;

JP C,end ;PC end se flag CY = 1

• Jump if carry;

• O desvio do processamento é cumprido se o resultado da última operação implicou em “vai-um” ou “empréstimo” (flag CY = 1). Se não ocorreu “empréstimo” ou “vai-um” (flag CY = 0) o processamento continua na instrução seguinte;

4.5.3 Instruções de desvio relativo incondicional. O desvio é calculado pela soma do conteúdo atual do registrador PC com o operando ee. O valor de ee

deve estar na faixa de –128 a +127. Portanto, esta instrução permite desvios “curtos”, ou seja, para posições de memória distante pouco mais de uma centena de bytes anteriores ou posteriores.

Page 67: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 65

O endereçamento relativo conta com um operando de apenas 1 byte. Este byte é interpretado como um valor com sinal (em complemento de 2). Portanto poderemos ter valores que variam entre –128 a +127. O en-dereçamento relativo ocorre pela soma deste valor com o conteúdo atual do registrado PC. É bom ressaltar que no momento em que ocorreu a busca do operando (o segundo byte da instrução), o conteúdo do PC será PC+2 se comparado com o endereço inicial (antes da busca da instrução acontecer). Ao conteúdo de PC+2 é que será somado o valor relativo e, portanto, teremos um desvio que pode atingir 126 posições de memória an-teriores (–126) ou 129 posições de memória posteriores (+129). Veja mais detalhes no item 4.4.1.4 .

JR ee ;PC PC + ee

• Jump relative;

• Ex.: Assumindo que a instrução esteja armazenada nas posições de memória 1300h e 1301h, tere-mos: 1300h: JR 25h ;PC ← PC+25h PC ← 1300h+2+25h

4.5.4 Instruções de desvio relativo condicional. Veja mais detalhes no item anterior.

JR NC,end ;PC end se flag CY = 0

• Jump relative if no carry;

• O endereçamento relativo conta com um operando de apenas 1 byte. Este byte é interpretado como um valor com sinal (em complemento de 2). Portanto poderemos ter valores que variam entre –128 a +127. O endereçamento relativo ocorre pela soma deste valor com o conteúdo atual do registrado PC. É bom ressaltar que no momento em que ocorreu a busca do operando (o segundo byte da instrução), o conteúdo do PC será PC+2 se comparado com o endereço inicial (antes da busca da instrução acon-tecer). Ao conteúdo de PC+2 é que será somado o valor relativo e, portanto, teremos um desvio que pode atingir 126 posições de memória anteriores (–126) ou 129 posições de memória posteriores (+129). Veja mais detalhes no item 4.4.1.4 .

• O desvio do processamento é cumprido se o resultado da última operação não implicou em “vai-um” ou “empréstimo” (flag CY = 0). Tendo ocorrido “empréstimo” ou “vai-um” (flag CY = 1) o processamento continua na instrução seguinte;

• Ex.: Assumindo que a instrução esteja armazenada nas posições de memória 1300h e 1301h e flag CY=1, teremos 1300h: JR C,25h ;PC ← PC+25h PC ← 1300h+2+25h

JR C,ee ;PC PC + ee se flag CY = 1

• Jump relative if carry;

• O desvio do processamento é cumprido se o resultado da última operação implicou em “vai-um” ou “empréstimo” (flag CY = 1). Se não ocorreu “empréstimo” ou “vai-um” (flag CY = 0) o processamento continua na instrução seguinte;

JR NZ,ee ;PC PC + ee se flag Z = 0

• Jump relative if not zero;

• O desvio do processamento é cumprido se o resultado da última operação foi diferente de zero (flag Z = 0), em caso contrário o processamento continua na instrução seguinte;

JR Z,ee ;PC PC + ee se flag Z = 1

• Jump relative if zero;

• O desvio do processamento é cumprido se o resultado da última operação foi igual a zero (flag Z = 1), em caso contrário o processamento continua na instrução seguinte;

Page 68: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 66

4.6 Instruções de subrotina e de pilha. Na execução de um programa, muitas vezes é necessário efetuar o mesmo procedimento (cálculo ou

operação) em momentos distintos do processamento. Uma solução simplista para tal fato seria, ao elaborar o programa, repetir a mesma porção de código quantas vezes fosse necessário. No entanto, isto implica em um aumento do tamanho do programa e conseqüentemente da memória despendida. Uma solução mais interes-sante seria alocar esta porção de código em uma região de memória, à parte do programa principal, de forma que quando necessário, pudesse ser utilizada em qualquer momento da execução. A esta porção de código chamamos de subrotina.

Para a implementação de programas que utilizem subrotinas, o microprocessador deve dispor de instru-ções apropriadas para gerar desvios de processamento com possibilidade de retorno, pois o processamento da subrotina não deve implicar em alteração do fluxo principal da execução. É importante, ainda, que a execução de subrotinas possa acontecer de forma aninhada, ou seja, que a execução de uma subrotina possa ser com-posta, também, pela execução de outras subrotinas. Veja a Figura 4-24.

As instruções que promovem a chamada e o retorno de subrotinas são do tipo: CALL, RET.

Se a execução de uma subrotina é um tipo de desvio com retorno garantido, o μP deve, de alguma for-ma, guardar o endereço do ponto de onde estava na execução do programa, antes de gerar o desvio, é o que chamamos de endereço de retorno. Em seguida, deve executar a subrotina (ou subrotinas se ocorrer aninha-mento) e então retomar o processamento de onde havia deixado. A execução de subrotinas aninhadas pode demandar o armazenamento de vários endereços de retorno. Portanto, o μP deve dispor de recursos para permitir tal ocorrência. Isto nos leva a apresentar a pilha (stack) que é uma região da memória RAM, reservada pelo programador, utilizada para armazenamento vários tipos de dados, entre eles, os endereços de retorno das subrotinas.

Sendo a subrotina um módulo de programa à parte do processamento principal, podem ser passados a ela os valores com base nos quais o seu processamento será efetuado. A estes valores chamamos de parâme-tros de entrada da subrotina. A subrotina, por sua vez, depois de terminado o seu processamento, deve forne-cer ao programa principal o(s) valor(es) resultante(s) de seu processamento, que chamamos de parâmetros de saída da subrotina. Há, ainda, situações em que dispomos de subrotinas que não demandam parâmetros.

A passagem de parâmetros (valores), normalmente, é feita através do armazenamento destes valores nos registradores do μP. Isto se faz em situações onde a quantidade destes valores é compatível com a quantidade de registradores do μP. Caso o número de parâmetros seja superior, deve-se lançar mão da memória RAM, uma boa sugestão é utilizar-se da pilha, que permite a ampliação do número dos parâmetros de entrada e saída, sendo limi-tados apenas pela quantidade de memória do equipamento. Utilizando a pilha, é possível implementar subrotinas que podem chamar a si próprias, ou seja subrotinas recursivas.

Como acabamos de descrever, durante a execução de uma su-brotina, fatalmente será necessário utilizar os registradores do micro-processador para armazenar operandos e resultados. No entanto, fa-talmente, nos depararemos com a seguinte situação: estes mesmos registradores já estavam sendo utilizados pelo processamento do pro-grama principal, ou para a passagem de parâmetros, ou armazenam valores outros que não podem ser perdidos. Teremos, então, um pro-blema. A solução para este conflito é utilizar um grupo de instruções que é capaz de salvar uma cópia do conteúdo dos registradores na memória e depois recuperá-la. A região de memória utilizada para este salvamento é, novamente, a pilha. Este grupo é composto das instru-ções: PUSH e POP. Há, ainda, duas outras instruções que se referem à pilha: “LD SP,reg16” e “EX SP,reg16” que também serão vistas nes-ta seção.

Os dois grupos de instruções que apresentamos acima utilizam a pilha, uma região reservada da RAM, para guardar seus dados. Mas, especificamente, em que posição da memória RAM está a pilha? A in-dicação da região da memória que será utilizada para conter este novo segmento é função do registrador ponteiro de pilha SP (stack pointer). Daí, é imprescindível que, antes da utilização de qualquer uma destas instruções, o registrador SP seja inicializado adequadamente.

Até o momento, estávamos trabalhando com apenas 2 tipos di-ferentes de informação armazenada na memória: programa (ou códi-

Início

Fim

subrot1:

ret subrot2:

ret

call subrot2

call subrot1

Figura 4-24: Fluxo de execução de um

programa com subrotinas.

Page 69: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 67

go) e dados, ou seja, a memória estava dividida em dois segmentos. Agora vemos há mais um: o segmento de pilha. Portanto, um programa possui normalmente três segmentos de memória: código e dados e pilha.

4.6.1 Instruções de subrotina. Para efetuar a chamada de uma subrotina temos o grupo de instruções do tipo call que podem ser con-

dicionais ou incondicionais. O mesmo acontece para o retorno da subrotina com o grupo return.

E, mais uma vez, deve-se ressaltar que é imprescindível a inicialização adequada do registrador SP, an-tes da utilização de qualquer uma das instruções de subrotina ou de pilha. Devido à importância desta iniciali-zação, um bom estilo de programação é colocar a linha de inicialização do SP sempre como a primeira do pro-grama. Veja a Figura 4-25

defseg codigo, absolute seg codigo org 0100h Inicio: lxi SP,1400h .....

Figura 4-25: Exemplo de inicialização do registrador SP.

LEMBRETE:

O endereço de retorno de uma chamada de subrotina é sempre o ende-reço da instrução seguinte. Se considerarmos que a instrução do tipo call está armazenada a partir do endereço “end” o valor do endereço de retorno será “end+3”.

4.6.1.1 Chamada de subrotina incondicional.

CALL end ;(SP-1) PCHigh (SP-2) PCLow PC end

• Call subroutine;

• A seqüência de eventos que ocorre para a chamada incondicional de uma subrotina é a seguinte:

• O registrador SP é decrementado;

• O conteúdo do byte superior do registrador contador de programa (PCH) é copiado para a posi-ção de memória apontada por SP;

• O registrador SP é decrementado novamente;

• O conteúdo do byte inferior do registrador contador de programa (PCL) é copiado para a nova posição de memória apontada por SP. Enquanto nenhuma outra instrução alterar o conteúdo do registrador SP, ele apontará para este último byte empilhado, que chamamos de topo da pi-lha;

• O operando end é copiado para o registrador PC;

• O processamento é desviado para o endereço correspondente ao operando end.

• Esta instrução não afeta flags;

• Ex.: Assumindo que PC = 1910h e SP = 1F00h, teremos

1910h: CALL 0600h ;(1EFFh) ← 13h (1EFEh) ← 19h PC ← 0600h

Page 70: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 68

Memória

00h

06h

??

CDh

1911h:

1912h:

1913h:

1910h:

Segmento de Programa Memória RAM

??

??

??

??

1EFEh:

1EFFh:

1F00h:

1EFDh:

Segmento de Pilha

B

PC=1910h

μP Z80

IX IY

SP=1F00h16 bits

F

C

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Figura 4-26: Ilustração para a instrução CALL 0600h - O processador vai iniciar a execução da instrução.

Memória RAM

13h

19h

??

??

1EFEh:

1EFFh:

1F00h:

1EFDh:

Segmento de Pilha

B

PC=0600h

μP Z80

IX IY

SP=1EFEh16 bits

F

C

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

MemóriaSegmento de Programa

??

??

??

??

0601h:

0602h:

0603h:

0600h:

Figura 4-27: Ilustração para a instrução CALL 0600h - O processador terminou de executar a instrução.

4.6.1.2 Chamada de subrotina condicional.

A seqüência de eventos que ocorre para a chamada condicional de uma subrotina difere-se da chamada incondicional apenas pelo fato de que primeiramente é feito o teste do flag em questão, para verificar se a chamada deve ocorrer ou não. Se a condição do flag foi satisfeita, a seqüência de eventos é a mesma de apre-sentada para a instrução “CALL end”. Como as condições são as mesmas apresentadas nas instruções de desvio condicional, apresentaremos abaixo apenas a sintaxe das instruções. Em caso de dúvidas consulte o i-tem 4.5 na página 62.

CALL P,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag S = 0 CALL M,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag S = 1 CALL NZ,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag Z = 0 CALL Z,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag Z = 1 CALL PO,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag P = 0 CALL PE,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag P = 1 CALL NC,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag CY = 0 CALL C,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag CY = 1

4.6.1.3 Retorno de subrotina incondicional.

RET ;PCLow (SP) PCHigh (SP+1)

• Return from subroutine;

• A seqüência de eventos que ocorre para o retorno incondicional de uma subrotina é a seguinte:

• O conteúdo da posição de memória apontada por SP é carregado no byte inferior do registra-dor contador de programa (PCL);

• O registrador SP é incrementado;

• O conteúdo da nova posição de memória apontada por SP é carregado no byte superior do re-gistrador contador de programa (PCH);

Page 71: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 69

• O registrador SP é incrementado mais uma vez; O SP passa, agora, a apontar para um byte que é o novo topo da pilha;

• O processamento prossegue a partir do endereço correspondente ao conteúdo dos bytes que estavam copiados da pilha.

• Ex.: RET

Obs.: Suponha que está ocorrendo o retorno da chamada de subrotina ilustrada na Figura 4-26.

B

PC=1913h

μP Z80

IX IY

SP=1F00h16 bits

F

C

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Memória Segmento de Programa

00h

06h

??

CDh

1911h:

1912h:

1913h:

1910h:

Memória RAM

13h

19h

??

??

1EFEh:

1EFFh:

1F00h:

1EFDh:

Segmento de Pilha

Figura 4-28: Ilustração para a instrução RET, supondo que havia ocorrido um CALL 0600h anteriormente - O

processador terminou de executar a instrução

LEMBRETE:

Um cuidado especial deve ser tomado quando da utilização das instru-ções do tipo CALL e RET. Uma regra básica deve ser seguida:

“A todo CALL deve corresponder um RET”.

Mais especificamente, quer dizer que em um procedimento, toda vez que se empilhar um par de bytes eles devem ser desempilhados antes do término do procedimento.

4.6.1.4 Retorno de subrotina condicional.

O grupo de instruções de retorno de subrotina também podem ser divido em condicionais e incondicio-nais, como vimos acima para as chamadas de subrotina. De mesma forma, a diferença na seqüência de even-tos ocorridos entre um retorno incondicional e um retorno condicional, é que neste último é feito o teste do flag em questão para verificar se o retorno deve ser executado ou não.

RET P ;PCLow (SP) PCHigh (SP+1) se flag S = 0 RET M ;PCLow (SP) PCHigh (SP+1) se flag S = 1 RET NZ ;PCLow (SP) PCHigh (SP+1) se flag Z = 0 RET Z ;PCLow (SP) PCHigh (SP+1) se flag Z = 1 RET PO ;PCLow (SP) PCHigh (SP+1) se flag P = 0 RET PE ;PCLow (SP) PCHigh (SP+1) se flag P = 1 RET NC ;PCLow (SP) PCHigh (SP+1) se flag CY = 0 RET C ;PCLow (SP) PCHigh (SP+1) se flag CY = 1

4.6.2 Instruções de pilha. Como já foi apresentado, a pilha (stack) é uma região da memória RAM reservada, inicialmente, para o

armazenamento de endereços de retorno das subrotinas. Mas existem outras atribuições para a pilha, como a de armazenar cópias do conteúdo dos registradores de uso geral do μP, ou seja, um tipo de memória “rascu-nho”. A pilha pode, ainda, ser utilizada para a passagem de parâmetros para as subrotinas.

Page 72: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 70

O nome pilha vem, exatamente, da sua estrutura de funcionamento, os valores vão sendo armazenados na memória RAM, um após o outro, sem que um novo sobrescreva aquele que já havia sido empilhado anteri-ormente. O ponteiro da pilha, registrador SP, sempre aponta para o último valor empilhado. A este valor cha-mamos de topo da pilha.

No momento em que é necessário recuperar os valores empilhados, o desempilhamento é feito na or-dem inversa do empilhamento, como em uma “pilha de pratos”. Isto caracteriza a pilha como uma estrutura do tipo LIFO (last in first out).

Outro ponto a destacar sobre a pilha é que o empilhamento ocorre no sentido decrescente dos endere-ços de memória, ou seja, à medida que os valores vão sendo empilhados, o ponteiro SP vai sendo decremen-tado. Uma forma de procurar garantir que sempre haja espaço para a pilha é inicializar o SP nos endereços mais elevados da memória RAM.

As instruções de pilha PUSH e POP, têm a função de permitir “salvar” uma cópia do conteúdo de um par de registradores na pilha e a de recuperá-los, respectivamente. Com estas instruções é possível, de certa for-ma, “aumentar” a quantidade de registradores da CPU. Não existe restrição para o uso destas instruções, e é quase impossível não usá-las na elaboração de subrotinas bem projetadas, pois com o pequeno número de re-gistradores disponíveis, em uma mudança de contexto, que é o caso de uma subrotina, a necessidade de libe-rar alguns registradores para a execução do procedimento é quase inevitável.

Veremos mais duas instruções de pilha que podemos classificar como instruções perigosas, pois elas al-teram o conteúdo do registrador SP. Para utilizá-las, o programador deve certificar-se que esta alteração do SP não implique em uma relocação da pilha para posições de memória que já estejam ocupadas ou que não te-nham capacidade de reter corretamente os dados, tais como regiões de memória ROM ou regiões vazias do mapa de memória.

Vejamos a sintaxe das instruções:

PUSH reg16 ;(SP-1) reg16 High (SP-2) reg16 Low

• Push register pair;

• Tem a função de salvar uma cópia do conteúdo do par de registradores especificado, na memória;

• A seqüência de eventos que ocorre para o empilhamento de um par de registradores é a seguinte:

• O registrador SP é decrementado;

• A cópia do conteúdo do registrador mais significativo (regH) é armazenada na posição de me-mória apontada por SP;

• O registrador SP é decrementado mais uma vez;

• A cópia do conteúdo do registrador menos significativo (regL) é armazenada na nova posição de memória apontada por SP; Enquanto nenhuma instrução alterar o SP esta posição de me-mória será o topo da pilha.

• Pode-se especificar como operando qualquer um dos pares registradores: AF, BC, DE, HL, IX ou IY.

• Ex.: PUSH HL PUSH DE PUSH AF.

B

PC=1CF3h

μP Z80

IX IY

SP=1F33h16 bits

F

C

D E

H=1Ah L=02h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Memória Segmento de Programa

E5h

??

??

??

1CF3h:

1CF4h:

1CF5h:

1CF3h:

Memória RAM

??

??

??

??

1E31h:

1E32h:

1F33h:

1E30h:

Segmento de Pilha

Figura 4-29: Ilustração para a instrução PUSH HL - O processado vai executar a instrução.

Page 73: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 71

Figura 4-30: Ilustração para a instrução PUSH HL - O processador terminou de executar a instrução.

POP reg16 ;reg16 Low (SP) reg16 High (SP+1)

• Pop register pair;

• Tem a função de recuperar a cópia do conteúdo de um par de registradores que foi anteriormente sal-vo na memória;

• A seqüência de eventos que ocorre para o desempilhamento de um par de registradores é a seguinte:

• O conteúdo da posição de memória apontada por SP é copiado para o registrador menos signi-ficativo (regL);

• O registrador SP é incrementado;

• O conteúdo da nova posição de memória apontada por SP é copiado para o registrador mais significativo (regH);

• O registrador SP é incrementado mais uma vez; O SP passa, agora, a apontar para um byte que é o novo topo da pilha;

• Os valores armazenados na pilha não são alterados, apenas o ponteiro SP que sofre altera-ção.

• Pode-se especificar como operando qualquer um dos pares registradores: AF, BC, DE, HL, IX ou IY.

• Ex.: POP HL POP BC POP AF.

B

PC=2221h

μP Z80

IX IY

SP=1E31h16 bits

F

C

D E

H L

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Memória Segmento de Programa

F1h

??

??

??

2221h:

2222h:

2223h:

2220h:

Memória RAM

02h

1Ah

??

??

1E31h:

1E32h:

1F33h:

1E30h:

Segmento de Pilha

Figura 4-31: Ilustração para a instrução POP HL - O processador vai executar a instrução.

B

PC=2222h

μP Z80

IX IY

SP=1E33h16 bits

F

C

D E

H=1Ah L=02h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Memória Segmento de Programa

F1h

??

??

??

2221h:

2222h:

2223h:

2220h:

Memória RAM

02h

1Ah

??

??

1E31h:

1E32h:

1F33h:

1E30h:

Segmento de Pilha

Figura 4-32: Ilustração para a instrução POP HL - O processador terminou de executar a instrução.

B

PC=1CF4h

μP Z80

IX IY

SP=1F31h16 bits

F

C

D E

H=1Ah L=02h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Memória Segmento de Programa

E5h

??

??

??

1CF3h:

1CF4h:

1CF5h:

1CF3h:

Memória RAM

02h

1Ah

??

??

1E31h:

1E32h:

1F33h:

1E30h:

Segmento de Pilha

Page 74: Denny daniel collina   apostila de sitemas microprocessados

Capítulo 4. 72

IMPORTANTE:

Um cuidado especial deve ser tomado quando da utilização das instruções PUSH e POP. Uma regra básica deve ser seguida:

“A todo PUSH deve corresponder um POP”.

Mais especificamente, quer dizer que no fim de um procedimento o tama-nho da pilha deve ser o mesmo que o do início.

EX. Este é um exemplo para ilustrar o que não deve ser feito, de acordo com o quadro acima.

Veja que no fragmento de código abaixo a falta da instrução POP BC fará com que o processamento se perca. 2010: ... 2011: ... 2012: call 2100h 2015: ... 2016: ...

2100: push BC 2101: push DE 2102: ... ... ... ... ... 2120: pop DE 2121: ret

LD SP,reg16 ;SP ← reg16

• Esta é uma instrução de transferência de 16 bits, mas foi incluída neste subgrupo devido ao seu efeito sobre a pilha;

• Efetua a copia do conteúdo do de registrador reg16 para o registrador SP;

• Deve-se tomar o cuidado de inicializar adequadamente o registrador fonte, com endereços relativos que apontem para a área de memória RAM adequada;

• Podem ser especificados como operando reg16 os registradores: HL, IX e IY.

• Ex.: LD SP,HL (veja a Figura 4-33 e a Figura 4-34).

.

B

PC=2222h

μP Z80

IX IY

SP=1F33h16 bits

F

C

D E

H=11h L=22h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Memória Segmento de Programa

??h

F9h

??

??

2221h:

2222h:

2223h:

2220h:

Memória RAM

??

??

??

??

1E31h:

1E32h:

1F33h:

1E30h:

Segmento de Pilha

Figura 4-33: Ilustração para a instrução LD SP,HL - O processador vai executar a instrução.

.

B

PC=2223h

μP Z80

IX IY

SP=1122h16 bits

F

C

D E

H=11h L=22h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Memória Segmento de Programa

??h

F9h

??

??

2221h:

2222h:

2223h:

2220h:

Memória RAM

??

??

??

??

1120h:

1121h:

1122h:

111Fh:

Segmento de Pilha

Figura 4-34: Ilustração para a instrução LD SP,HL - O processador terminou de executar a instrução.

Page 75: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 73

EX (SP),reg16 ;(SP) reg16 Low (SP-1) reg16 High

• Exchange reg16 with top of stack;

• Esta é uma instrução de transferência de 16 bits, mas foi incluída neste subgrupo devido ao seu efeito sobre a pilha;

• Efetua a permuta entre o conteúdo do par de registradores reg16 e as posições de memória apontadas por SP e SP+1 (TOS - topo da pilha);

• Deve-se tomar cuidado na utilização desta instrução, pois o topo da pilha pode conter o endereço de retorno de alguma subrotina, e a alteração deste valor constitui um procedimento perigoso, pois pode implicar na perda da seqüência de processamento.

• A alteração causada por esta instrução ocorre apenas no conteúdo apontado por SP. O registrador SP propriamente, não é alterado;

• Podem ser especificados como operando reg16 os registradores: HL, IX e IY.

• Ex.: EX (SP),HL (veja a Figura 4-35 e a Figura 4-36).

.

B

PC=22AAh

μP Z80

IX IY

SP=1121h16 bits

F

C

D E

H=55h L=66h

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Memória Segmento de Programa

??h

E3h

??

??

22A9h:

22AAh:

22ABh:

22A8h:

Memória RAM

??

BBh

AAh

??

1120h:

1121h:

1122h:

111Fh:

Segmento de Pilha

Figura 4-35: Ilustração para a instrução EX (SP),HL - O processador vai executar a instrução.

.

B

PC=22AAh

μP Z80

IX IY

SP=1121h16 bits

F

C

D E

H=AAh L=BBh

A’ F’

B’ C’

D’ E’

H’ L’

8 bits

A

Memória Segmento de Programa

??h

E3h

??

??

22A9h:

22AAh:

22ABh:

22A8h:

Memória RAM

??

66h

55h

??

1120h:

1121h:

1122h:

111Fh:

Segmento de Pilha

Figura 4-36: Ilustração para a instrução EX (SP),HL - O processador terminou de executar a instrução.

4.7 Instruções de rotação e deslocamento. As instruções de rotação permitem que se faça a rotação dos bits do acumulador para a esquerda ou pa-

ra a direita, efeito semelhante ao funcionamento de um shift register. A rotação pode ser feita utilizando-se a-penas os oito bits do acumulador, ou com nove bits, onde o flag CY assume o papel de bit mais significativo.

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Figura 4-37: Exemplos de rotações ã direita com 8 e 9 bits.

A rotação dos bits pode implicar na divisão inteira, por dois, do valor do registrador em questão, se for à

direita, e em uma multiplicação por dois se a rotação for para a esquerda. Para que isto aconteça é necessário uma condição importante: o bit que circula (aquele que é empurrado para fora do acumulador) deve ter nível

Page 76: Denny daniel collina   apostila de sitemas microprocessados

CAPÍTULO 4. 74

lógico “0”, pois em caso contrário, a rotação não refletirá uma multiplicação, ou divisão, por 2. Como nem sem-pre o possível garantir estas condições, criou-se o subgrupo das instruções de deslocamento.

O subgrupo de instruções de deslocamento pode ser subdividido em deslocamento lógico e deslocamen-to aritmético:

Deslocamento lógico: Empurra-se sempre um bit em nível lógico “0” para dentro do registrador. Isto garante a ocorrência de multiplicações ou divisões por 2;

Deslocamento aritmético: Quando o deslocamento é à direita (divisão por 2), promove-se a extensão de sinal, que é obtida através da cópia do nível lógico do bit 7 (bit de sinal) para o bit 6. Isto garante a manutenção do sinal “+” ou “-“. Quando o deslocamento é para a esquerda (multiplicação por 2) acon-tece o mesmo que no deslocamento lógico: um bit em nível “0” é empurrado para dentro do registrador através do bit 0.

4.7.1 Instruções de rotação. RLCA ;rotaciona acumulador à esquerda

• Rotate accumulator left with copy to carry;

• Instrução específica para o acumulador. Foi incluída no projeto do Z80 para permitir a compatibilidade com o μP 8080;

• O conteúdo do acumulador é rotacionado à esquerda. O bit 7 é “empurrado para fora” e é realimentado ao acumulador no lugar do bit 0. O bit 7 também é copiado para o bit CY do registrador de flags;

• Ex.: LD A,21h RLCA ;A ← 42h CY ← 0

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Acumulador Figura 4-38: Ilustração do funcionamento da instrução RLCA.

RRCA ;rotaciona acumulador à direita

• Rotate accumulator right with copy to carry;

• Instrução específica para o acumulador. Foi incluída no projeto do Z80 para permitir a compatibilidade com o μP 8080;

• O conteúdo do acumulador é rotacionado à direita. O bit 0 é “empurrado para fora” e é realimentado ao acumulador no lugar do bit 7. O bit 0 também é copiado para o bit CY do registrador de flags;

• Ex.: LD A,21h RRCA ;A ← 10h CY ← 1

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Acumulador Figura 4-39: Ilustração do funcionamento da instrução RRCA.

RLA ;rotaciona CY e acumulador à esquerda

• Rotate left accumulator;

• Instrução específica para o acumulador. Foi incluída no projeto do Z80 para permitir a compatibilidade com o μP 8080;

Page 77: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 75

• O conteúdo do acumulador e o bit CY são rotacionados à esquerda. O bit 7 é “empurrado para fora” do acumulador e é copiado para o CY. O conteúdo anterior do CY é “empurrado” para o acumulador no lugar do bit 0;

• Ex.: LD A,21h SCF ;CY ← 1 RLA ;A ← 43h CY ← 0

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Acumulador Figura 4-40: Ilustração para o funcionamento da instrução RLA.

RRA ;rotaciona CY e acumulador à direita

• Rotate right accumulator;

• Instrução específica para o acumulador. Foi incluída no projeto do Z80 para permitir a compatibilidade com o μP 8080;

• O bit CY e o conteúdo do acumulador são rotacionados à direita. O bit 0 é “empurrado para fora” do acumulador e é copiado para o CY.O conteúdo anterior do CY é “empurrado” para o acumulador no lugar do bit 7;

• Ex.: LD A,21h SCF ;CY ← 1 RRA ;A ← 90h CY ← 1

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Acumulador Figura 4-41: Ilustração para o funcionamento da instrução RRA.

RLC reg8 ;rotaciona o registrador à esquerda RLC (HL) ;rotaciona posição de memória à esquerda

• Rotate register (or memory contents) left with copy to carry;

• O operando reg8 corresponde a um dos registradores de 8 bits: A, B, D, D, E, H e L;

• Há variantes desta instrução que utilizam os ponteiros IX e IY;

• O conteúdo do registrador (ou da posição memória) é rotacionado à esquerda. O bit 7 é “empurrado para fora” e é realimentado ao registrador (ou da posição memória) no lugar do bit 0. O bit 7 também é copiado para o bit CY do registrador de flags;

• Ex.: LD B,21h RLC B ;B ← 42h CY ← 0

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Registrador ou memória Figura 4-42: Ilustração do funcionamento da instrução RLC.

RRC reg8 ;rotaciona o registrador à direita RRC (HL) ;rotaciona posição de memória à direita

• Rotate register (or memory contents) right with copy to carry;

• O operando reg8 corresponde a um dos registradores de 8 bits: A, B, D, D, E, H e L;

• Há variantes desta instrução que utilizam os ponteiros IX e IY;

Page 78: Denny daniel collina   apostila de sitemas microprocessados

CAPÍTULO 4. 76

• O conteúdo do registrador (ou da posição memória) é rotacionado à direita. O bit 0 é “empurrado para fora” e é realimentado ao registrador (ou da posição memória) no lugar do bit 7. O bit 0 também é copi-ado para o bit CY do registrador de flags;

• Ex.: LD D,21h RRC D ;D ← 10h CY ← 1

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Registrador ou memória Figura 4-43: Ilustração do funcionamento da instrução RRC.

RL reg8 ;rotaciona CY e registrador à esquerda RL (HL) ;rotaciona CY e memória à esquerda

• Rotate left;

• O operando reg8 corresponde a um dos registradores de 8 bits: A, B, D, D, E, H e L;

• Há variantes desta instrução que utilizam os ponteiros IX e IY;

• O conteúdo do registrador (ou da posição memória) e o bit CY são rotacionados à esquerda. O bit 7 é “empurrado para fora” do registrador (ou da posição memória) e é copiado para o CY.O conteúdo an-terior do CY é “empurrado” para o registrador (ou para a posição memória) no lugar do bit 0;

• Ex.: LD E,21h SCF ;CY ← 1 RL E ;E ← 43h CY ← 0

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Registrador ou memória Figura 4-44: Ilustração para o funcionamento da instrução RL.

RR reg8 ;rotaciona CY e registrador à direita RR (HL) ;rotaciona CY e memória à direita

• Rotate right;

• O operando reg8 corresponde a um dos registradores de 8 bits: A, B, D, D, E, H e L;

• Há variantes desta instrução que utilizam os ponteiros IX e IY;

• O bit CY e o conteúdo do registrador (ou da posição memória) são rotacionados à direita. O bit 0 é “empurrado para fora” do registrador (ou da posição memória) e é copiado para o CY. O conteúdo ante-rior do CY é “empurrado” para o registrador (ou para a posição memória) no lugar do bit 7;

• Ex.: LD E,21h SCF ;CY ← 1 RR E ;E ← 90h CY ← 1

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Registrador ou memória Figura 4-45: Ilustração para o funcionamento da instrução RR.

Page 79: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 77

4.7.2 Instruções de deslocamento. SLA reg8 ;deslocamento aritmético do reg. à esquerda SLA (HL) ;deslocamento aritmético da memória à esquerda

• Shift left arithmetic;

• O operando reg8 corresponde a um dos registradores de 8 bits: A, B, D, D, E, H e L;

• Há variantes desta instrução que utilizam os ponteiros IX e IY;

• O conteúdo do registrador (ou da posição memória) é deslocado para a esquerda. O bit 7 é “empurra-do para fora” do registrador (ou da posição memória) e é copiado para o CY.Os demais bits são empur-rados para a esquerda. O bit 0 é levado ao nível “0”.

• Ex.: LD A,21h SLA A ;A ← 42h CY ← 0

Registrador ou memória “0”

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Figura 4-46: Ilustração para o funcionamento da instrução SLA.

SRA reg8 ;deslocamento aritmético do reg. à direita SRA (HL) ;deslocamento aritmético da memória à direita

• Shift right arithmetic;

• O operando reg8 corresponde a um dos registradores de 8 bits: A, B, D, D, E, H e L;

• Há variantes desta instrução que utilizam os ponteiros IX e IY;

• O conteúdo do registrador (ou da posição memória) é deslocado à direita. O bit 0 é

• O bit 0 é “empurrado para fora” do registrador (ou da posição memória) e é copiado para o CY.Os de-mais bits são deslocados à direita, exceto o bit 7 que terá seu conteúdo copiado para o bit 6;

• Ex.: LD A,81h SLA A ;A ← C0h CY ← 1

CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0

Registrador ou memória Figura 4-47: Ilustração para o funcionamento da instrução SRA.

4.8 Instruções de entrada e saída. No início deste capítulo vimos que o μP dispõe de instruções que viabilizam a movimentação dados en-

tre seus registradores e a memória. O grupo que apresentaremos a seguir, permite ao microprocessador trans-ferir dados, agora, para dispositivos periféricos ligados a ele, as portas de entrada e saída15, e assim comuni-car-se com “o mundo exterior”. Reveja a Figura 1-7 na página 9.

Assim como ocorre para as posições de memória que são identificadas através de números - endereços de memória, os dispositivos de E/S também são numerados, portanto temos também endereços de E/S. Mas como os dispositivos de memória e de E/S, que estão todos interligados aos barramentos do μP conseguem discernir se o endereço que o μP colocou no barramento (de endereços) corresponde a uma posição de memó-ria para ou a um dispositivo de E/S. A resposta é: o processador dispõe de dois pinos de controle: MREQ e IORQ que respectivamente sinalizam para os dispositivos uma requisição (RQ = request) para memória ou para

15 O termo original em inglês é I/O port, cuja tradução literal é “porto de E/S”. No entanto, é comum utilizar “porta de E/S”.

Page 80: Denny daniel collina   apostila de sitemas microprocessados

CAPÍTULO 4. 78

E/S (ou I/O). Veja na figura abaixo, um recorte da Figura 1-5, da página 7, que apresenta o detalhamento da pinagem do Z80.

Figura 4-48: Detalhe dos pinos de controle do Z80.

Dependendo do tipo de instrução de E/S utilizada, o μP Z80 pode chegar a endereçar até 216 dispositi-

vos de E/S (capacidade que é pouco utilizada). Novamente, assim como há um mapa de memória, tem-se também, o mapa de E/S.

IN A,(port) ;A (port)

• O acumulador é carregado com o conteúdo de 8 bits lido do dispositivo de E/S cujo endereço é espe-cificado pelo operando port. Ou em outras palavras: o μP efetua uma operação de leitura da porta de E/S de endereço port.

• Ex.: IN A,(07h) ;A ← (ES_07h)16

OUT (port),A ;(port) A

• O conteúdo do acumulador é copiado para o dispositivo de E/S cujo endereço é especificado pelo ope-rando port. Ou em outras palavras: o μP efetua a uma operação de escrita na porta de endereço port.

• Ex.: OUT (80h),A ;(ES_80h) ← A

IN reg8,(C) ;reg8 (port_BC)

• O operando reg8 corresponde a um dos registradores de 8 bits: A, B, D, D, E, H e L;

• O registrador especificado é carregado com o conteúdo de 8 bits lido do dispositivo de E/S cujo ende-reço de 16 bits é especificado pelo conteúdo par de registradores BC. Ou em outras palavras: o μP efe-tua uma operação de leitura da porta de E/S de endereço apontado por BC.

• Esta instrução, por utilizar o endereçamento de um par de registradores e permite que se possa sele-cionar até 216 = 65.536 dispositivos de E/S;

• Ex.: LD BC,1122h IN D,(C) ;D ← (ES_1122h)

OUT (C),reg8 ;(port_BC) reg8

• O operando reg8 corresponde a um dos registradores de 8 bits: A, B, D, D, E, H e L;

• O conteúdo do registrador especificado é copiado para o dispositivo de E/S cujo endereço de 16 bits é especificado pelo conteúdo par de registradores BC. Ou em outras palavras: o μP efetua uma operação de escrita na porta de E/S de endereço apontado por BC.

• Esta instrução, por utilizar o endereçamento de um par de registradores, permite que se possa selecio-nar até 216 = 65.536 dispositivos de E/S;

• Ex.: LD BC,3344h IN (C),H ;(ES_3344h) ← H

16 A inclusão do prefixo “ES_” tem apenas a função de ressaltar que a especificação de um endereço de E/S.

Page 81: Denny daniel collina   apostila de sitemas microprocessados

As Instruções do μPZ80 79

O Z80 dispõe ainda de mais 4 pares de instruções de E/S que não serão abordadas.

4.9 Instruções de controle da CPU. NOP ;nenhuma operação é executada

• Esta instrução tem o propósito de gerar um atraso no processamento, uma vez que nenhuma operação é executada, assim como nenhum flag é alterado.

HALT ;parar o processamento

• Esta instrução tem o propósito de gerar um atraso no processamento, uma vez que nenhuma operação é executada, assim como nenhum flag é alterado.

Page 82: Denny daniel collina   apostila de sitemas microprocessados
Page 83: Denny daniel collina   apostila de sitemas microprocessados

O Código ASCII. 81

APÊNDICE A.

A. O CÓDIGO ASCII. Principais características. É o código padrão para a representação de caracteres alfanuméricos; Pode ser utilizado para troca de informações entre qualquer tipo

de sistema computacional; Inicialmente utilizou-se de 7 bits e, portanto, permitia representar um elenco de 128 caracteres alfabéticos, numéricos, pontuação, etc.; Atu-almente foi expandido e utiliza 8 bits. Os 128 caracteres que foram acrescidos não são padronizados, e podem variar de país para país.

Veja, abaixo um exemplo da Tabela ASCII para o idioma português (PC860):

D E C I M A L

H E X A D E C I M A L

Page 84: Denny daniel collina   apostila de sitemas microprocessados
Page 85: Denny daniel collina   apostila de sitemas microprocessados

O Conjunto Completo de Instruções do Z80. 83

Apêndice B.

B. O CONJUNTO COMPLETO DE INSTRUÇÕES DO Z80.

B.1 Instruções de Transferência de 8 bits. Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No. of Bytes

No. of M Cycles

No. of T States

Comments

LD r, r’ r ← r’ • • • • • • • • 01 r r’ 1 1 4 r, r’ Reg. LD p, p’* p ← p’ • • • • • • • • 11 011 101

01 p p’ DD 2 2 8 000 B

001 C LD q, q’* q ← q’ • • • • • • • • 11 111 101

01 q q’ FD 2 2 8 010 D

011 E LD r, n r ← n • • • • • • • • 00 r 110

← n → 2 2 7 100 H

101 L LD p, n* p ← n • • • • • • • • 11 011 101

00 p 110 ← n →

DD 3 3 11 111 A p, p’ Reg.

LD q, n* q ← n • • • • • • • • 11 111 101 00 q 110 ← n →

FD 3 3 11 000 B 001 C 010 D

LD r, (HL) r ← (HL) • • • • • • • • 01 r 110 1 2 7 011 E LD r, (IX + d) r ← (IX + d) • • • • • • • • 11 011 101

01 r 110 ← d →

DD 3 5 19 100 IXH 101 IXL 111 A

LD r, (IY + d) r ← (IY + d) • • • • • • • • 11 111 101 01 r 110 ← d →

FD 3 5 19 q, q’ Req. 000 B

LD (HL), r (HL) ← r • • • • • • • • 01 110 r 1 2 7 001 C LD (IX + d), r (IX + d) ← r • • • • • • • • 11 011 101

01 110 r ← d →

DD 3 5 19 010 D 011 E 100 IYH

LD (IY + d), r (IY + d) ← r • • • • • • • • 11 111 101 01 110 r ← d →

FD 3 5 19 101 IYL 111 A

LD (HL), n (HL) ← n • • • • • • • • 00 110 110 ← n →

36 2 3 10

LD (IX + d), n (IX + d) ← n • • • • • • • • 11 011 101 00 110 110 ← d → ← n →

DD 36

4 5 19

LD (IY + d), n (IY + d) ← n • • • • • • • • 11 111 101 00 110 110 ← d → ← n →

FD 36

4 5 19

LD A, (BC) A ← (BC) • • • • • • • • 00 001 010 0A 1 2 7 LD A, (DE) A ← (DE) • • • • • • • • 00 011 010 1A 1 2 7 LD A, (nn) A ← (nn) • • • • • • • • 00 111 010

← n → ← n →

3A 3 4 13

LD (BC), A (BC) ← A • • • • • • • • 00 000 010 02 1 2 7 LD (DE), A (DE) ← A • • • • • • • • 00 010 010 12 1 2 7 LD (nn), A (nn) ← A • • • • • • • • 00 110 010

← n → ← n →

32 3 4 13

LD A, I A ← I b b b 0 b IFF2 0 • 11 101 101 01 010 111

ED 57

2 2 9

LD A, R A ← R b b b 0 b IFF2 0 • 11 101 101 01 011 111

ED 5F

2 2 9 R is read after it is increased.

LD I, A I ← A • • • • • • • • 11 101 101 01 000 111

ED 47

2 2 9

LD R, A R ← A • • • • • • • • 11 101 101 01 001 111

ED 4F

2 2 9 R is written after it is increased.

Notes: r, r’ means any of the registers A, B, C, D, E, H, L. p, p’ means any of the registers A, B, C, D, E, IXH, IXL. q, q’ means any of the registers A, B, C, D, E, IYH, IYL. ddL, ddH refer to high order and low order eight bits of the register respectively. * means unofficial instruction.

Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation, IFF2 = the interrupt flip-flop 2 is copied.

Page 86: Denny daniel collina   apostila de sitemas microprocessados

Apêndice B. 84

B.2 Instruções de Transferência de 16 bits. Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No. of Bytes

No. of M Cycles

No. of T States

Comments

LD dd, nn dd ← nn • • • • • • • • 00 dd0 001 ← n → ← n →

3 3 10 dd Pair 00 BC 01 DE

LD IX, nn IX ← nn • • • • • • • • 11 011 101 00 110 001 ← n → ← n →

DD 21

4 4 14 02 HL 03 SP

LD IY, nn IY ← nn • • • • • • • • 11 111 101 00 110 001 ← n → ← n →

FD 21

4 4 14

LD HL, (nn) L ← (nn) H ← (nn+1)

• • • • • • • • 00 101 010 ← n → ← n →

2A 3 5 16

LD dd, (nn) ddL ← (nn) ddH← (nn+1)

• • • • • • • • 11 101 101 01 dd1 011 ← n → ← n →

ED 4 6 20

LD IX, (nn) IXL ← (nn) IXH ← (nn+1)

• • • • • • • • 11 011 101 00 101 010 ← n → ← n →

DD 2A

4 6 20

LD IY, (nn) IYL ← (nn) IYH ← (nn+1)

• • • • • • • • 11 111 101 00 101 010 ← n → ← n →

FD 2A

4 6 20

LD (nn), HL (nn) ← L (nn+1) ← H

• • • • • • • • 00 100 010 ← n → ← n →

22 3 5 16

LD (nn), dd (nn) ← ddL (nn+1)← ddH

• • • • • • • • 11 101 101 01 dd0 011 ← n → ← n →

DD 4 6 20

LD (nn), IX (nn) ← IXL (nn+1) ← IXH

• • • • • • • • 11 011 101 00 100 010 ← n → ← n →

DD 22

4 6 20

LD (nn), IY (nn) ← IYL (nn+1) ← IYH

• • • • • • • • 11 111 101 00 100 010 ← n → ← n →

FD 22

4 6 20

LD SP, HL SP ← HL • • • • • • • • 11 111 001 F9 1 1 6 LD SP, IX SP ← IX • • • • • • • • 11 011 101

11 111 001 DD F9

2 2 10

LD SP, IY SP ← IY • • • • • • • • 11 111 101 11 111 001

FD F9

2 2 10

PUSH qq SP ← SP - 1 (SP) ← qqH SP ← SP - 1 (SP) ← qqL

• • • • • • • • 11 qq0 101 1 3 11 qq Pair 00 BC 01 DE 10 HL

PUSH IX SP ← SP - 1 (SP) ← IXH SP ← SP - 1 (SP) ← IXL

• • • • • • • • 11 011 101 11 100 101

DD E5

2 4 15 11 AF

PUSH IY SP ← SP - 1 (SP) ← IYH SP ← SP - 1 (SP) ← IYL

• • • • • • • • 11 111 101 11 100 101

FD E5

2 4 15

POP qq (SP) ← qqL SP ← SP + 1 (SP) ← qqH SP ← SP + 1

• • • • • • • • 11 qq0 001 1 3 10

POP IX (SP) ← IXL SP ← SP + 1 (SP) ← IXH SP ← SP + 1

• • • • • • • • 11 011 101 11 100 001

DD E1

2 4 14

POP IY (SP) ← IYL SP ← SP + 1 (SP) ← IYH SP ← SP + 1

• • • • • • • • 11 111 101 11 100 001

FD E1

2 4 14

Notes: dd is any of the register pair BC, DE, HL, SP. qq is any of the register pair BC, DE, HL, AF. Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.

Page 87: Denny daniel collina   apostila de sitemas microprocessados

O Conjunto Completo de Instruções do Z80. 85

B.3 Instruções de Permuta, Transferência de blocos e Pesquisa de grupos. Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No.of Bytes

No.of M Cycles

No.of T States

Comments

EX DE, HL DE ↔ HL • • • • • • • • 11 101 011 EB 1 1 4 EX AF, AF’ AF ↔ AF’ • • • • • • • • 00 001 000 08 1 1 4 EXX BC ↔ BC’

DE ↔ DE’ HL ↔ HL’

• • • • • • • • 11 011 001 D9 1 1 4

EX (SP), HL (SP+1) ↔ H (SP) ↔ L

• • • • • • • • 11 100 011 E3 1 5 19

EX (SP), IX (SP+1)↔ IXH (SP) ↔ IXL

• • • • • • • • 11 011 101 11 100 011

DD E3

2 6 23

EX (SP), IY (SP+1)↔ IYH (SP) ↔ IYL

• • • • • • • • 11 111 101 11 100 011

FD E3

2 6 23

LDI (DE) ← (HL) DE ← DE+ 1 HL ← HL + 1 BC ← BC - 1

• • b1 0 b2 b3 0 • 11 101 101 10 100 000

ED A0

2 4 16

LDIR (DE) ← (HL) DE← DE + 1 HL ← HL + 1 BC ← BC - 1 repeat until: BC = 0

• • b1 0 b2 0 0 • 11 101 101 10 110 000

ED B0

2 2

5 4

21 16

if BC ≠ 0 if BC = 0

LDD (DE) ← (HL) DE ← DE - 1 HL ← HL - 1 BC ← BC - 1

• • b1 0 b2 b3 0 • 11 101 101 10 101 000

ED A8

2 4 16

LDDR (DE) ← (HL) DE ← DE - 1 HL ← HL - 1 BC ← BC - 1 repeat until: BC = 0

• • b1 0 b2 0 0 • 11 101 101 10 111 000

ED B8

2 2

5 4

21 16

if BC ≠ 0 if BC = 0

CPI A - (HL) HL ← HL + 1 BC ← BC -1

b4 b4 b5 b4 b6 b3 1 • 11 101 101 10 100 001

ED A1

2 4 16

CPIR A - (HL) HL ← HL + 1 BC ← BC -1 Repeat until: A = (HL) or BC = 0

b4 b4 b5 b4 b6 b3 1 • 11 101 101 10 110 001

ED B1

2 2

5 4

21 16

if BC ≠ 0 and A ≠ (HL). if BC = 0 or A = (HL)

CPD A - (HL) HL ← HL - 1 BC ← BC -1

b4 b4 b5 b4 b6 b3 1 • 11 101 101 10 101 001

ED A9

2 4 16

CPDR A - (HL) HL ← HL - 1 BC ← BC -1 Repeat until: A = (HL) or BC = 0

b4 b4 b5 b4 b6 b3 1 • 11 101 101 10 111 001

ED B9

2 2

5 4

21 16

if BC ≠ 0 and A ≠ (HL). if BC = 0 or A = (HL)

Notes: 1 F5 is a copy of bit 1 of A + last transferred byte, thus (A + (HL))1 2 F3 is a copy of bit 3 of A + last transferred byte, thus (A + (HL))3 3 P/V flag is 0 if the result of BC - 1 = 0, otherwise P/V = 1. 4 These flags are set as in CP (HL)

5 F5 is copy of bit 1 of A - last compared address - H, thus (A - (HL) - H)1. H is as in F after the comparison. 6 F3 is copy of bit 3 of A - last compared address - H, thus (A - (HL) - H)3. H is as in F after the comparison.

Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.

Page 88: Denny daniel collina   apostila de sitemas microprocessados

Apêndice B. 86

B.4 Instruções Aritméticas de 8 bits. Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No.of Bytes

No.of M Cycles

No.of T States

Comments

ADD A, r A ← A + r b b b b b V 0 b 10 000 r 1 1 4 r Reg. p Reg.ADD A, p* A ← A + p b b b b b V 0 b 11 011 101

10 000 p DD 2 2 8 000 B 000 B

001 C 001 C ADD A, q* A ← A + q b b b b b V 0 b 11 111 101

10 000 q FD 2 2 8 010 D 010 D

011 E 011 E ADD A, n A ← A + n b b b b b V 0 b 11 000 110

← n → 2 2 8 100 H 100 IXH

101 L 101 IXH ADD A, (HL) A ← A + (HL) b b b b b V 0 b 10 000 110 1 2 7 111 A 111 A ADD A, (IX + d) A ← A + (IX + d) b b b b b V 0 b 11 011 101

10 000 110 ← d →

DD 3 5 19

ADD A, (IY + d) A ← A + (IY + d) b b b b b V 0 b 11 111 101 10 000 110 ← d →

FD 3 5 19

ADC A, s A ← A + s + CY b b b b b V 0 b 001 s is any of r, n, (HL), SUB A, s A ← A - s b b b b b V 1 b 010 (IX+d), (IY+d), p, q SBC A, s A ← A - s - CY b b b b b V 1 b 011 as shown for the ADD AND s A ← A AND s b b b 1 b P 0 0 100 instruction. The OR s A ← A OR s b b b 0 b P 0 0 110 underlined bits re-

place XOR s A ← A XOR s b b b 0 b P 0 0 101 the underlined bits in CP s A - s b b b1 b b1 V 1 b 111 the ADD set. INC r r ← r + 1 b b b b b V 0 • 00 r 100 1 1 4 INC p* p ← p + 1 b b b b b V 0 • 11 011 101

00 p 100 DD 2 2 8 q Reg.

000 B INC q* q ← q + 1 b b b b b V 0 • 11 111 101

00 q 100 FD 2 2 8 001 C

010 D INC (HL) (HL) ← (HL) + 1 b b b b b V 0 • 00 110 100 1 3 11 011 E INC (IX + d) (IX + d) ←

(IX + d) + 1 b b b b b V 0 • 11 011 101

00 110 100 ← d →

DD

3 6 23 100 IYH 101 IYL 111 A

INC (IY + d) (IY + d) ← (IY + d) + 1

b b b b b V 0 • 11 111 101 00 110 100 ← d →

FD 3 6 23

DEC m m ← m - 1 b b b b b V 1 • 101 m is any of r, p, q, (HL), (IX+d), (IY+d), as shown for the INC instruction. DEC sa-me format and states as INC. Replace 100 with 101 in opcode.

Notes: 1 F5 and F3 are copied from the operand (s), not from the result of (A - s). The V symbol in the P/V flag column indicates that the P/V flags contains the overflow of the operation. Similarly the P sym-bol indicates parity. r means any of the registers A, B, C, D, E, H, L. p means any of the registers A, B, C, D, E, IXH, IXL. q means any of the registers A, B, C, D, E, IYH, IYL. ddL, ddH refer to high order and low order eight bits of the register respectively. CY means the carry flip-flop. * means unofficial instruction.

Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.

B.5 Instruções Aritméticas de 16 bits. Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No.of Bytes

No.of M Cycles

No.of T States

Comments

ADD HL, ss HL ← HL + ss • • b2 b2 b2 • 0 b1 00 ss1 001 1 3 11 ss Reg. ADC HL, ss HL ← HL + ss +

CY b1 b1 b2 b2 b2 V1 0 b1 11 101 101

01 ss1 010 ED 2 4 15 00 BC

01 DE SBC HL, ss HL ← HL - ss - CY b1 b1 b2 b2 b2 V1 1 b1 11 101 101

01 ss0 010 ED 2 4 15 10 HL

11 SP ADD IX, pp IX ← IX + pp • • b2 b2 b2 • 0 b1 11 011 101

00 pp1 001 DD 2 4 15

pp Reg. ADD IY, rr IY ← IY + rr • • b2 b2 b2 • 0 b1 11 111 101

00 rr1 001 FD 2 4 15 00 BC

01 DE INC ss ss ← ss + 1 • • • • • • • • 00 ss0 011 1 1 6 10 IX INC IX IX ← IX + 1 • • • • • • • • 11 011 101

00 100 011 DD 23

2 2 10 11 SP

Page 89: Denny daniel collina   apostila de sitemas microprocessados

O Conjunto Completo de Instruções do Z80. 87

Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No.of Bytes

No.of M Cycles

No.of T States

Comments

INC IY IY ← IY + 1 • • • • • • • • 11 111 101 00 100 011

FD 23

2 2 10 rr Reg. 00 BC

DEC ss ss ← ss - 1 • • • • • • • • 00 ss1 011 1 1 6 01 DE DEC IX IX ← IX - 1 • • • • • • • • 11 011 101

00 101 011 DD 2B

2 2 10 10 IY 11 SP

DEC IY IY ← IY - 1 • • • • • • • • 11 111 101 00 101 011

FD 2B

2 2 10

Notes: The V symbol in the P/V flag column indicates that the P/V flags contains the overflow of the operation. ss means any of the registers BC, DE, HL, SP. pp means any of the registers BC, DE, IX, SP. rr means any of the registers BC, DE, IY, SP. 16 bit additions are performed by first adding the two low order eight bits, and then the two high order eight bits. 1 Indicates the flag is affected by the 16 bit result of the operation. 2 Indicates the flag is affected by the 8 bit addition of the high order eight bits. CY means the carry flip-flop.

Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.

B.6 Instruções de propósito geral e de controle da CPU Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No.of Bytes

No.of M Cycles

No.of T States

Comments

DAA Converts A into pac-ked BCD following add or subtract with BCD operands. __

b b b b b P • b

00 100 111 27 1 1 4

CPL A ← A • • b1 1 b1 • 1 • 00 101 111 2F 1 1 4 One’s complement. NEG4 A ← 0 - A

__ b b b b b V 1 b 11 101 101

01 000 100 ED 44

2 2 8 Two’s complement.

CCF CY ← CY • • b1 b2 b1 • 0 b 00 111 111 3F 1 1 4 Complement carry flag.

SCF CY ← 1 • • b1 0 b1 • 0 1 00 110 111 37 1 1 4 NOP No operations • • • • • • • • 00 000 000 00 1 1 4 HALT CPU halted • • • • • • • • 01 110 110 76 1 1 4 DI3 IFF1 ← 0

IFF2 ← 0 • • • • • • • • 11 110 011 F3 1 1 4

EI3 IFF1 ← 1 IFF2 ← 1

• • • • • • • • 11 111 011 FB 1 1 4

IM 04 Set interrupt mode 0 • • • • • • • • 11 101 101 01 000 110

ED 46

2 2 8

IM 14 Set interrupt mode 1 • • • • • • • • 11 101 101 01 010 110

ED 56

2 2 8

IM 24 Set interrupt mode 2 • • • • • • • • 11 101 101 01 011 110

ED 5E

2 2 8

Notes: The V symbol in the P/V flag column indicates that the P/V flags contains the overflow of the operation. Similarly the P symbol indicates parity. 1 F5 and F3 are a copy of bit 5 and 3 of register A _ 2 H contains the previous carry state (after instruction H ↔ C)

3 No interrupts are issued directly after a DI or EI. 4 This instruction has other unofficial opcodes, see Opcodes list. CY means the carry flip-flop.

Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.

B.7 Instruções de Rotação e Deslocamento Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No. of Bytes

No. of M Cycles

No. of T States

Comments

RLCA • • b 0 b • 0 b 00 000 111 07 1 1 4 RLA • • b 0 b • 0 b 00 010 111 17 1 1 4 RRCA • • b 0 b • 0 b 00 001 111 0F 1 1 4 RRA • • b 0 b • 0 b 00 011 111 1F 1 1 4 RLC r b b b 0 b P 0 b 11 001 011

00 000 r CB 2 2 8 r Reg.

000 B RLC (HL) b b b 0 b P 0 b 11 001 011

00 000 110 CB 2 4 15 001 C

010 D RLC (IX + d) b b b 0 b P 0 b 11 011 101

11 001 011 ← d → 00 000 110

DD CB

4 6 23 011 E 100 H 101 L 111 A

RLC (IY + d) b b b 0 b P 0 b 11 111 101 11 001 011

FD CB

4 6 23

Page 90: Denny daniel collina   apostila de sitemas microprocessados

Apêndice B. 88

Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No. of Bytes

No. of MCycles

No. of T States

Comments

← d → 00 000 110

LD r,RLC (IX + d)* r ← (IX + d) RLC r (IX + d) ← r

b b b 0 b P 0 b 11 011 101 11 001 011 ← d → 00 000 r

DD CB

4 6 23

LD r,RLC (IY + d)* r ← (IY + d) RLC r (IY + d) ← r

b b b 0 b P 0 b 11 111 101 11 001 011 ← d → 00 000 r

FD CB

4 6 23

RL m b b b 0 b P 0 b 010 Instruction format RRC m b b b 0 b P 0 b 001 and states are the RR m b b b 0 b P 0 b 011 same as RLC. SLA m b b b 0 b P 0 b 100 Replace 000 with SLL m* b b b 0 b P 0 b 110 new number. SRA m b b b 0 b P 0 b 101 SRL m b b b 0 b P 0 b 111 RLD

b b b 0 b P 0 • 11 101 101

01 101 111 ED 6F

2 5 18

RRD

b b b 0 b P 0 • 11 101 101

01 100 111 ED 67

2 5 18

Notes: The P symbol in the P/V flag column indicates that the P/V flags contains the parity of the result. r means any of the registers A, B, C, D, E, H, L. * means unofficial instruction. CY means the carry flip-flop.

Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.

B.8 Instruções de Manipulação de bit. Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No. ofBytes

No. of M Cycles

No. of T States

Comments

BIT b, r _ Z ← rb

b1 b b2 1 b3 b4 0 • 11 001 011 01 b r

CB 2 2 8 r Reg. 000 B

BIT b, (HL) ___ Z ← (HL)b

b1 b b2 1 b3 b4 0 • 11 001 011 01 b 110

CB 2 3 12 001 C 010 D

BIT b, (IX + d)5 _____ Z ← (IX + d)b

b1 b b2 1 b3 b4 0 • 11 011 101 11 001 011 ← d → 01 b 110

DD CB

4 5 20 011 E 100 H 101 L 111 A

BIT b, (IY + d)5 _____ Z ← (IY + d)b

b1 b b2 1 b3 b4 0 • 11 111 101 11 001 011 ← d → 01 b 110

FD CB

4 5 20

SET b, r rb ← 1 • • • • • • • • 11 001 011 11 b r

CB

2 2 8 b Bit. 000 0 001 1

SET b, (HL) (HL)b ← 1 • • • • • • • • 11 001 011 11 b 110

CB

2 4 15 010 2 011 3

SET b, (IX + d) (IX + d)b ← 1 • • • • • • • • 11 011 101 11 001 011 ← d → 11 b 110

DD CB

4 6 23 100 4 101 5 110 6 111 7

SET b, (IY + d) (IY + d)b ← 1 • • • • • • • • 11 111 101 11 001 011 ← d → 11 b 110

FD CB

4 6 23

LD r,SET b, (IX + d)* r ← (IX + d) rb ← 1 (IX + d) ← r

• • • • • • • • 11 011 101 11 001 011 ← d → 11 b r

DD CB

4 6 23

LD r,SET b, (IY + d)* r ← (IY + d) rb ← 1 (IY + d) ← r

• • • • • • • • 11 111 101 11 001 011 ← d → 11 b r

FD CB

4 6 23

RES b, m mb ← 0 m ≡ r, (HL), (IX+d), (IY+d)

• • • • • • • • 10 To form new opcode re-place 11 of SET b, s with 10. Flags and states are the same.

Page 91: Denny daniel collina   apostila de sitemas microprocessados

O Conjunto Completo de Instruções do Z80. 89

Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No. ofBytes

No. of M Cycles

No. of T States

Comments

Notes: The notation mb indicates bit b (0 to 7) of location m. BIT instructions are performed by an bitwise AND. 1 S is set if b = 7 and Z = 0 2 F5 is set if b = 5 and Z = 0 3 F3 is set if b = 3 and Z = 0 4 P/V is set like the Z flag 5 This instruction has other unofficial opcodes * means unofficial instruction.

Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.

B.9 Instruções de Entrada e Saída Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No.of Bytes

No.of M Cycles

No.of T States

Comments

IN A, (n) A ← (n) • • • • • • • • 11 011 011 ← n →

DB 2 3 11 r Reg. 000 B

IN r, (C) r ← (C) b b b 0 b P 0 • 11 101 101 01 r 000

ED 2 3 12 001 C 010 D

IN (C)* or IN F, (C)*

Just affects flags, value is lost.

b b b 0 b P 0 • 11 101 101 01 110 000

ED 70

2 3 12 011 E 100 H

INI (HL) ← (C) HL ← HL + 1 B ← B - 1

b1 b1 b1 b3 b1 X b2 b3 11 101 101 10 100 010

ED A2

2 4 16 101 L 111 A

INIR (HL) ← (C) HL ← HL + 1 B ← B - 1 Repeat until B = 0

0 1 0 b3 0 X b2 b3 11 101 101 10 110 010

ED B2

2 2

5 4

21 16

if B ≠ 0 if B = 0

IND (HL) ← (C) HL ← HL - 1 B ← B - 1

b1 b1 b1 b4 b1 X b2 b4 11 101 101 10 101 010

ED AA

2 4 16

INDR (HL) ← (C) HL ← HL - 1 B ← B - 1 Repeat until B = 0

0 1 0 b4 0 X b2 b4 11 101 101 10 111 010

ED BA

2 2

5 4

21 16

if B ≠ 0 if B = 0

OUT (n), A (n) ← A • • • • • • • • 11 010 011 ← n →

D3 2 3 11

OUT (C), r (C) ← r • • • • • • • • 11 101 101 01 r 001

ED 2 3 12

OUT (C), 0* (C) ← 0 • • • • • • • • 11 101 101 01 110 001

ED 71

2 3 12

OUTI (C) ← (HL) HL ← HL + 1 B ← B - 1

b1 b1 b1 X b1 X X X 11 101 101 10 100 011

ED A3

2 4 16

OTIR (C) ← (HL) HL ← HL + 1 B ← B - 1 Repeat until B = 0

0 1 0 X 0 X X X 11 101 101 10 110 011

ED B3

2 2

5 4

21 16

if B ≠ 0 if B = 0

OUTD (C) ← (HL) HL ← HL - 1 B ← B - 1

b1 b1 b1 X b1 X X X 11 101 101 10 101 011

ED AB

2 4 16

OTDR (C) ← (HL) HL ← HL - 1 B ← B - 1 Repeat until B = 0

0 1 0 X 0 X X X 11 101 101 10 111 011

ED BB

2 2

5 4

21 16

if B ≠ 0 if B = 0

Notes: The V symbol in the P/V flag column indicates that the P/V flags contains the overflow of the operation. Similarly the P symbol indicates parity. r means any of the registers A, B, C, D, E, H, L. 1 flag is affected by the result of B ← B - 1 as in DEC B. 2 N is a copy bit 7 of the last value from the input (C). 3 this flag contains the carry of ( ( (C + 1) AND 255) + (C) ) 4 this flag contains the carry of ( ( (C - 1) AND 255) + (C) ) * means unofficial instruction.

Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, X = flag is unknown, b = flag is set according to the result of the operation.

Page 92: Denny daniel collina   apostila de sitemas microprocessados

Apêndice B. 90

B.10 Instruções de Desvio Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No.of Bytes

No.of M Cycles

No.of T States

Comments

JP nn PC ← nn • • • • • • • • 11 000 011 ← n → ← n →

C3 3 3 10 ccc Condition 000 NZ 001 Z

JP cc, nn if cc is true, PC ← nn

• • • • • • • • 11 ccc 010 ← n → ← n →

3 3 10 010 NC 011 C 100 PO 101 PE 110 P

JR e PC ← PC + e • • • • • • • • 00 011 000 ← e - 2 →

18 2 3 12 111 M

JR ss, e if ss is true PC ← PC + e

• • • • • • • • 00 ss 000 ← e - 2 →

2 2

3 2

12 7

if ss is true if ss is false

JP HL PC ← HL • • • • • • • • 11 101 001 E9 1 1 4 JP IX PC ← IX • • • • • • • • 11 011 101

11 101 001 DD E9

2 2 8 ss Condition 111 C 110 NC

JP IY PC ← IY • • • • • • • • 11 111 101 11 101 001

FD E9

2 2 8 101 Z 100 NZ

DJNZ e B ← B - 1 if B ≠ 0 PC ← PC + e

• • • • • • • • 00 010 000 ← e - 2 →

10 2 2

2 3

8 13

if B = 0 if B ≠ 0

Notes: e is a signed two-complement number in the range <-126, 129> e - 2 in the opcode provides an effective number of PC + e as PC incremented by 2 prior to the addition of e.

Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.

B.11 Instruções de Chamada e Retorno de subrotina. Mnemonic

Symbolic Operation

Flags S Z F5 H F3 P/V N C

Opcode 76 543 210

Hex

No.of Bytes

No.of M Cycles

No.of T States

Comments

CALL nn SP ← SP - 1 (SP) ← PCH SP ← SP - 1 (SP) ← PCL PC ← nn

• • • • • • • • 11 001 101 ← n → ← n →

CD 3 5 17

CALL cc, nn if cc is true, SP ← SP - 1 (SP) ← PCH SP ← SP - 1 (SP) ← PCL PC ← nn

• • • • • • • • 11 ccc 100 ← n → ← n →

3 3

3 5

10 17

if cc is false if cc is true

RET PCL ← (SP) SP ← SP + 1 PCH ← (SP) SP ← SP + 1

• • • • • • • • 11 001 001 C9 1 3 10

RET cc if cc is true, PCL ← (SP) SP ← SP + 1 PCH ← (SP) SP ← SP + 1

• • • • • • • • 11 ccc 000 1 1

1 3

5 11

if cc is false if cc is true

RETI2 PCL ← (SP) SP ← SP + 1 PCH ← (SP) SP ← SP + 1

• • • • • • • • 11 101 101 01 001 101

ED 4D

2 4 14 cc Condition 000 NZ 001 Z 010 NC 011 C

RETN1,2 PCL ← (SP) SP ← SP + 1 PCH ← (SP) SP ← SP + 1 IFF1 ← IFF2

• • • • • • • • 11 101 101 01 000 101

ED 45

2 4 14 100 PO 101 PE 110 P 111 M

RST p SP ← SP - 1 (SP) ← PCH SP ← SP - 1 (SP) ← PCL PC ← p

• • • • • • • • 11 t 111 1 3 11 t p 000 0h 001 8h 010 10h 011 18h 100 20h 101 28h 110 30h 111 38h

Notes: 1 This instruction has other unofficial opcodes, see Opcode list. 2 Instruction also IFF1 ← IFF2

Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.

Page 93: Denny daniel collina   apostila de sitemas microprocessados

Referências Bibliográficas.. 91

BIBLIOGRAFIA

C. REFERÊNCIAS BIBLIOGRÁFICAS.

Livro texto: Livros que sugerimos para consulta.

[01] CYPRIANO, L. B., Microprocessador Z-80 - Hardware, Vol. I, 3a ed., Ed. Érica, 1984.

[02] CYPRIANO, L. B., Microprocessador Z-80 - Software, Vol. II, 3a ed., Ed. Érica, 1984.

[03] ZILOG, Z80 Family CPU User Manual, 2001.

Bibliografia auxiliar: Material complementar que foi utilizado na geração do texto desta apostila.

[04] INTEL CORPORATION, 8080/8085 Assembly Language Programming,1979.

[05] INTEL CORPORATION, Microsystem Components Handbook, Vol.II, 1984.

[06] MALVINO, A. P., Microcomputadores e Microprocessadores, Ed. McGraw Hill do Brasil, 1985.

[07] TOKHEIM, R. L., Introdução aos Microprocessadores, Ed. McGraw Hill do Brasil, 1985.

[08] TOCCI, R. J., Microcoprocessadores e microcomputadores: Hardware e Software, 2a ed., Ed. Prentice Hall, 1983.

[09] VISCONTI, A. C., Microprocessadores 8080/8085 - Hardware, Vol. I, 3a ed., Ed. Érica, 1981.

[10] VISCONTI, A. C., Microprocessadores 8080/8085 - Software, Vol. II, 3a ed., Ed. Érica, 1981.

[11] ZILOG, Z80 Family - Discrete Devices and Embedded Controllers Databook, 1995.

Sites sugeridos:

[12] ZILOG Inc., www.zilog.com

[13] Thomas Scherrer, Official Support-Page: Hardware, Software, Utilities, FAQ and Docs for Z80-Family, www.z80.info

[14] CPU-World: All about CPUs, www.cpu-world.com

[15] CPU Museum, www.cpu-museum.com