Your SlideShare is downloading. ×
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Denny daniel collina   apostila de sitemas microprocessados
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Denny daniel collina apostila de sitemas microprocessados

458

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
458
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
25
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. CENTRO FEDERAL DE EDUÇÃO TECNOLÓGICA DE MINAS GERAIS DEPARTAMENTO DE ENSINO DO SEGUNDO GRAU COORDENAÇÃO DO CURSO TÉCNICO DE ELETRÔNICA LABORATÓRIO DE SISTEMAS MICROPROCESSADOS I Introdução TeóricaJunho/2007 Prof. Denny Daniel Collina denny@deii.cefetmg.br
  • 2. Índice Analítico1. 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._______________________________________________________________ 172. 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._____________________________________________________________ 333. A linguagem assembly para o Z80. [10] ________________________________________________ 35 3.1 Labels. __________________________________________________________________________ 35 3.2 Mnemônicos ou códigos de operação. ________________________________________________ 36 3.3 Operandos._______________________________________________________________________ 36 3.3.1 Constantes numéricas. ___________________________________________________________ 36 3.3.2 Constantes de Caracteres. ________________________________________________________ 36 3.3.3 Operações com Constantes._______________________________________________________ 36 3.4 Comentários. _____________________________________________________________________ 37 3.5 Pseudo-instruções. ________________________________________________________________ 37 3.6 Cuidados ao se definir variáveis e constantes. _________________________________________ 40Índice. I
  • 3. 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._______________________________________________________ 79A. O Código ASCII. ______________________________________________________________________ 81B. 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. _______________________________________ 90C. Referências Bibliográficas._____________________________________________________________ 91Índice II
  • 4. Índice de Instruções ADC A,byte ___________________________50 LD (DE),A ____________________________ 57 ADC A,reg8 ____________________________50 LD (end),A ___________________________ 43 ADC HL,reg16 __________________________53 LD (end),reg16 ________________________ 45 ADD A,(HL) ___________________________60 LD (HL), reg8 ________________________ 58 ADD A,byte ___________________________49 LD A,(BC) ____________________________ 57 ADD A,reg8 ____________________________49 LD A,(DE) ____________________________ 57 ADD HL,reg16 __________________________52 LD A,(end) ___________________________ 42 AND (HL) _____________________________58 LD reg,byte __________________________ 43 AND byte _____________________________54 LD reg16,(end) ________________________ 44 AND reg8 ______________________________54 LD reg16,dbyte ________________________ 44 BIT n,(HL) ___________________________58 LD reg8,(HL) _________________________ 58 CALL C,end ___________________________66 LD reg8,reg8’ _________________________ 42 CALL end _____________________________65 LD SP,reg16 ___________________________ 70 CALL M,end ___________________________66 NEG __________________________________ 50 CALL NC,end __________________________66 NOP __________________________________ 77 CALL NZ,end __________________________66 OR (HL) ______________________________ 58 CALL P,end ___________________________66 OR byte ______________________________ 54 CALL PE,end __________________________66 OR reg8 ______________________________ 54 CALL PO,end __________________________66 ORG __________________________________ 36 CALL Z,end ___________________________66 OUT (C),reg8 _________________________ 76 CCF __________________________________54 OUT (port),A _________________________ 76 CP (HL) ______________________________60 POP reg16 _____________________________ 69 CP byte ______________________________51 PUSH reg16 ____________________________ 68 CP reg8 _______________________________51 RES n,(HL) ___________________________ 58 CPL __________________________________53 RET __________________________________ 66 DAA __________________________________51 RET C ________________________________ 67 DB ___________________________________37 RET M ________________________________ 67 DCR reg8 ______________________________49 RET NC _______________________________ 67 DEC (HL) _____________________________58 RET NZ _______________________________ 67 DEC reg16 _____________________________53 RET P ________________________________ 67 DEFSEG _______________________________35 RET PE _______________________________ 67 DS ___________________________________38 RET PO _______________________________ 67 DW ___________________________________38 RET Z ________________________________ 67 END __________________________________35 RL (HL) ______________________________ 74 EQU __________________________________36 RL reg8 ______________________________ 74 EX (SP),reg16 _________________________71 RLA __________________________________ 72 EX AF,AF’ ____________________________46 RLC (HL) _____________________________ 73 EX DE,HL _____________________________45 RLC reg8 _____________________________ 73 EXX __________________________________46 RLCA _________________________________ 72 HALT _________________________________77 RR (HL) ______________________________ 74 IN A,(port) __________________________76 RR reg8 ______________________________ 74 IN reg8,(C) ___________________________76 RRA __________________________________ 73 INC (HL) _____________________________60 RRC (HL) _____________________________ 73 INC reg16 _____________________________53 RRC reg8 _____________________________ 73 INC reg8 ______________________________49 RRCA _________________________________ 72 JP (HL) ______________________________61 SBC A,(HL) ___________________________ 58 JP C,end _____________________________62 SBC A,byte ___________________________ 50 JP end _______________________________61 SBC A,reg8 ___________________________ 50 JP M,end _____________________________62 SBC HL,reg16 __________________________ 53 JP NC,end ____________________________62 SCF __________________________________ 55 JP NZ,end ____________________________62 SEG __________________________________ 36 JP P,end _____________________________61 SET n,(HL) ___________________________ 58 JP PE,end ____________________________62 SLA (HL) _____________________________ 75 JP PO,end ____________________________62 SLA reg8 _____________________________ 75 JP Z,end _____________________________62 SRA (HL) _____________________________ 75 JR C,ee ______________________________63 SRA reg8 _____________________________ 75 JR ee ________________________________63 SUB byte _____________________________ 49 JR NC,end ____________________________63 SUB reg8 _____________________________ 49 JR NZ,ee _____________________________63 XOR (HL) _____________________________ 60 JR Z,ee ______________________________63 XOR byte _____________________________ 54 LD (BC),A ____________________________57 XOR reg8 _____________________________ 54Índice. III
  • 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, fossemelas automáticas ou manuais. Tal preocupação tinha como objetivo minimizar esforços, o desgaste do agentehumano 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ãona 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 mesmastarefas que um humano pode executar, mas os compu-tadores podem fazê-lo com muito maior velocidade eprecisão. Isto devido ao fato de os computadores reali-zarem todos os seus cálculos e operações um passopor vez e de demandar uma pequena fração de tempopara executar cada passo. Ao contrário dos humanos, um computador nãopensa! Um computador necessita de um jogo completode instruções que lhe informem exatamente o que fazera cada passo para desenvolver suas tarefas. Este con-junto de instruções, chamado de programa, é preparadopor uma ou mais pessoas, e é diferente para cada tare- Figura 1-1: O ábaco, primeira máquina de calcular.fa a ser executada. Estes programas são colocados naunidade 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, umpor vez, interpreta-os e executa a operação correspon-dente. Seria impossível listar todas as aplicações doscomputadores. 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 complexase devem ser calculadas para muitos valores diferentesdas variáveis do sistema. Um computador pode calcularestas complexas expressões matemáticas em altas ve-locidades. Além disso, ele pode executar cálculos repe-tidos usando diferentes tipos de dados, tabelar os resul-tados e determinar que conjuntos de valores produzem Figura 1-2: Máquina diferencial de Babbage (1822).os melhores resultados. Em muitos casos, um compu-tador pode poupar ao engenheiro horas, ou até mesmo dias, de cálculos tediosos, deixando, assim, mais tem-po livre para o trabalho criativo. Controle de processos: O tempo não é um fator crítico quando o computador é utilizado para processardados comerciais ou realizar cálculos de engenharia, no sentido de que os resultados não têm necessidadeimediata (isto é, dentro de alguns milisegundos ou segundos). Os computadores são, muitas vezes, usados emaplicaçõ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 nocontrole de processos industriais, que é utilizado em fábricas de papel, refinarias de petróleo, etc.1 Os números entre colchetes indicam as referências bibliográficas utilizadas para a redação do tópico correspondente. A referência com- pleta pode ser consultada no final desta apostila.Introdução aos Computadores. 5
  • 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 depesquisa, e em aplicações comerciais para pequenos negócios. Seu uso ainda ocorre, mas está recebendoboa 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 mainframesvariam da resolução de problemas científicos de engenharia complexos até aplicações comerciais orientadaspara 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: aunidade central de processamento, a unidade de memória e as unidades de entrada e saída. A interligaçãodestas unidades pode ser vista na Figura 1-3. Unidade de Unidade de U. C. P. Entrada Saída Do mundo Para o exterior mundo exterior Memória Figura 1-3: Organização básica de um computador. A Unidade Central de Processamento (UCP) é a composição da Unidade Lógica-Aritmética (ULA), da u-nidade de Controle e de um conjunto de registradores que normalmente são implementados em um único chip,o microprocessador (μP). A Unidade de Controle dirige a operação de todas as outras unidades, fornecendo sinais de tempori- zação e de controle. De certa forma, a unidade de controle é como o dirigente de uma orquestra, que é o responsável por manter cada um dos membros da orquestra na sincronização correta. A Unidade Lógica-Aritmética (ULA) é a área do computador onde são realizadas as operações, arit- méticas e lógicas, com os dados. O tipo de operação a ser executada é determinado pela unidade de controle. Os operandos poderão vir tanto da unidade de memória como da unidade de entrada. A Unidade de Memória (memória primária ou memória do sistema) armazena grupos de dígitos binários(palavras) que podem representar ou instruções (programa) que o computador deverá executar, ou dados a se-rem operados pelo programa. A memória serve também para o armazenamento de resultados intermediários efinais das várias operações. Dentro desta unidade podemos destacar três subgrupos: memórias da famíliaRAM, da família ROM, e registradores. A Unidade de Entrada é composta por todos os dispositivos utilizados para receber informações e dadosque são externos ao computador, e introduzi-los nas unidades de memória ou na ULA. Alguns dispositivos deentrada 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 docomputador para o “mundo exterior”. Exemplos de unidades de saída: displays, indicadores luminosos, im-pressoras, monitores de vídeo, conversores digitais-analógicos (DAC’s), etc.6 Capítulo 1.
  • 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.Introdução aos Computadores. 7
  • 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. μP Z80 16 bits PC SP IX IY 8 bits A F A’ F’ B C B’ C’ D E D’ E’ H L H’ L’ Figura 1-6: Arquitetura de registradores do μP Z80. Todos os microcomputadores, apesar de variarem em sua arquitetura, têm um elemento em comum - apastilha do microprocessador. Como sabemos, o μP funciona como a unidade central de processamento domicrocomputador. Em essência, o μP é o coração do microcomputador, pois suas características definem ascaracterísticas do microcomputador. Sua velocidade determina a velocidade máxima do microcomputador, eseus 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 queuma 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 demaiscomponentes.8 Capítulo 1.
  • 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 deentrada e saída, e as memórias RAM e ROM. Os pinos do chip dão acesso apenas aos dispositivos de E/S e aalguns pinos de controle, clock e alimentação. Veja a Figura 1-8. Unidade de U. C. P. Unidade de Entrada Saída Do mundo exterior Para o mundo exterior +V GND CLK Memória RAM + ROM Microcontrolador Figura 1-8: Diagrama em blocos de um microcontrolador.1.2.2 Memórias.1.2.3 Tipos de memórias Um sistema microprocessado pode dispor de dois tipos de memória: primária (do sistema ou principal) esecundá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çõesarmazenadas e a sua volatilidade.3 No passado utilizou-se memórias primárias baseadas em materiais magnéticos: ferrite ou memória de ferrite, que foi substituída pelas memórias de semicondutores por apresentarem tamanho bastante reduzido.Introdução aos Computadores. 9
  • 10. Memória primária Memórias de leitura e escrita Memórias apenas de leitura (RWM) (ROM) RAM estática RAM dinâmica Memórias permanentes Memórias apagáveis (SRAM) (DRAM) RAM não volátil RAM dinâmica integrada ROM Mascarável ROM Programável e Apagável (NVRAM) (iRAM) (Masked ROM) (EPROM) ROM Programável ROM Programável e Apagável (PROM) Eletricamente (EEPROM) Memória Flash Figura 1-9: Classificação das memórias primárias. As memórias que compõem este grupo que permitem a alteração das informações nelas armazenadassão denominadas memórias de leitura e escrita (RWM), que são mais conhecidas por outra sigla (RAM). Asque 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, ouentã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 coma 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, enquantoalguns, 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 outracaracterística muito importante: são voláteis. Destacamos alguns tipos dos vários existentes para serem apre-sentadas neste subgrupo: SRAM (Static Random Access Memory): Esta memória é constituída por células compostas por flip-flops,ou biestáveis. Cada flip-flop necessita de 6 transistores na sua construção, o que a faz ter um baixo nível de in-tegração, mas alta velocidade de acesso (veja a Figura 1-10). Esta memória é mais cara e consome mais e-nergia do que as RAMs dinâmicas (veja a descrição abaixo). NVRAM (Non volatile RAM): Encontramos duas possíveis implementações com esta designação: A primeira é composta de um arranjo com uma RAM estática, com uma EEPROM (veja descrição abaixo) e circuitos monitores de tensão. Logo após o ligamento os dados são copiados da EEPROM para a RAM e durante o seu funcionamento são lidos e gravados na RAM. Quando a tensão de ali- mentação cai abaixo de certo valor os dados são copiados da RAM para a EEPROM, evitando assim que sejam perdidos. A segunda é conhecida como ZeroPower NVRAM: É uma memória que, em um mesmo encapsula- mento, contem uma RAM estática construída com tecnologia CMOS (baixo consumo), uma bateria de lítio e circuitos monitores de tensão. Quando a alimentação externa cai abaixo de 3 V, o circuito moni- tor de tensão comuta alimentação da RAM para a bateria, mantendo os dados.10 Capítulo 1.
  • 11. DRAM (Dynamic RAM): Cada célula desta memória é construída por apenas um transistor MOS e de umpequeno capacitor, veja a Figura 1-11. O armazenamento dos níveis lógicos de um bit ocorre sob a forma deníveis diferentes de carga do capacitor intrínseco ao circuito. A vantagem deste tipo de memória reside no fatode ter o número reduzido de componentes por célula, o que traz um grau de integração bastante elevado, alémde 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 elenã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 deuma certa capacidade de armazenamento. Para sistemas pequenos a RAM estática é a recomendada. Figura 1-10: Diagrama de uma célula de memória Figura 1-11: Diagrama de uma célula de memória RAM estática. RAM dinâmica. iRAM (Integrated RAM): Este é um tipo de memória RAM dinâmica onde o circuito de refresh já está dis-ponível dentro do mesmo encapsulamento da memória. Para o usuário ela funciona de forma similar à RAM di-nâmica, sem apresentar o inconveniente de ter que adicionar circuitos para efetuar a tarefa de refresh.1.2.3.2 ROM - Memórias apenas de leitura. Este subgrupo das memórias tem outra característica muito importante além da descrita no título. Todasas ROMs são não voláteis, isto quer dizer que o padrão de bits gravados na memória é permanente, não podeser 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 dememória só é adquirido através de encomenda direta ao fabricante e os lotes mínimos são de alguns milharesde 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ãopode ser apagada e poder ser considerada como uma ROM. Normalmente é utilizada em equipamentos cujoprograma já foi testado e aprovado, mas que não têm um volume de produção para justificar a encomenda deROM 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, diferenteda ROM e da PROM, tem a vantagem de poder ser apagada, se necessário. Isto se faz através da exposiçãoda 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 seexpor o chip à luz, o encapsulamento de uma EPROM é construído em cerâmica e dotado de uma janela dequartzo. Estes dois materiais colaboram para o seu alto custo. EEPROM (Electrically Erasable PROM): Este tipo de memória foi desenvolvida para suplantar algumasdesvantagens das EPROMs: necessidade da retirada do chip do circuito para o apagamento completo parapermitir 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 seucusto é superior ao de uma EPROM.4 É bastante difícil de precisar o tempo, pois ele é função da intensidade luminosa emitida pela lâmpada, da distância do chip à lâmpada e da tecnologia de fabricação do componente.Introdução aos Computadores. 11
  • 12. Memória Flash: Ou flash E2PROM, é uma variante da E2PROM, sua principal diferença refere-se ao fatode que ela não permite o apagamento de uma palavra apenas. Deve-se apagar todo o chip, ou um setor, paraque se possa regrava-lo. Apesar deste inconveniente, as memórias flash que têm a vantagem de possuíremcélulas com estrutura mais simples que as E2PROMs e permitem um maior nível de integração o que permite areduçã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 querdizer 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 quecomanda 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 daunidade de entrada, os valores intermediários gerados durante o processamento, os valores finais que vão serenviados 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 nomede 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 osmeios de que a linguagem assembly dispõe para efetuar divisão organizada da memória. Uma forma visual de representar a memória de um computador é o mapa de memória, que nada mais édo que uma tabela onde identificamos o que está armazenado em cada bloco de memória. Em alguns casos,pode-se chegar ao ponto de identificar individualmente o tipo de informação contido em cada posição de me-mória. Veja a Figura 1-12 0000h Segmento de programa vazio vazio Segmento de dados vazio vazio Vazio FFFFh Figura 1-12: Exemplo de um mapa de memória. Observando a Figura 1-12, vemos que o mapa de memória não está todo preenchido, há espaços vazi-os. Na verdade foi dito que o μP Z80 tem capacidade de endereçar até 64 KBytes. Não há a obrigatoriedade dese preencher todo o mapa de memória. Utiliza-se a quantidade de memória necessária para o funcionamentoadequado do equipamento. Outro ponto a observar é que não existe a obrigatoriedade do segmento de programa estar posicionadona memória “antes” do segmento de dados. Estes segmentos podem ser alocados na memória em qualquerordem ou seqüência.5 Convém ressaltar que o prefixo “K”, aqui difere do usado em engenharia “k” por ter valor multiplicador de 1024.12 CAPÍTULO 1.
  • 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 quetem 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 omicroprocessador 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 deforma 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 osdados 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 umalinguagem que chamamos de linguagem de máquina ou código objeto. Na Figura 1-13 podemos observar umpequeno programa exemplo em linguagem de máquina para o μP Z80. A linguagem de máquina é própria de cada μP e é definida pelo fabricante, durante a etapa de desen-volvimento do μP. É muito comum que o código objeto de μP não seja compatível com o de outro. Podemos ci-tar como uma das exceções a esta regra a compatibilidade de código entre os microprocessadores 8085 e Z80. Um programa em linguagem de máquina é longo e confuso para o ser humano, porém, pode-se repre-sentá-lo de uma forma mais simples, utilizando-se, ao contrário da base binária, a base hexadecimal. Pois, co-mo sabemos, a conversão de binário para hexadecimal é bastante simples. Veja a Figura 1-14. Endereço na memória Conteúdo Endereço Conteúdo 0000 0000 0000 0000b 0011 1110b 0000h 3Eh 0000 0000 0000 0001b 1000 0000b 0001h 80h 0000 0000 0000 0010b 1101 0011b 0002h D3h 0000 0000 0000 0011b 0001 1111b 0003h 1Fh 0000 0000 0000 0100b 0010 0001b 0004h 21h 0000 0000 0000 0101b 0000 0000b 0005h 00h 0000 0000 0000 0110b 0001 0000b 0006h 10h 0000 0000 0000 0111b 0111 1110b 0007h 7Eh 0000 0000 0000 1000b 0010 0011b 0008h 23h 0000 0000 0000 1001b 1000 0110b 0009h 86h 0000 0000 0000 1010b 0010 0111b 000Ah 27h 0000 0000 0000 1011b 1101 0011b 000Bh D3h 0000 0000 0000 1100b 0001 0111b 000Ch 17h 0000 0000 0000 1101b 0011 1111b 000Dh 3Fh 0000 0000 0000 1110b 0000 0001b 000Eh 01h 0000 0000 0000 1111b 1101 1010b 000Fh DAh 0000 0000 0001 0000b 0001 0011b 0010h 13h 0000 0000 0001 0001b 0000 0000b 0011h 00h 0000 0000 0001 0010b 1010 1111b 0012h AFh 0000 0000 0001 0011b 1101 0011b 0013h D3h 0000 0000 0001 0100b 0000 1111b 0014h 0Fh 0000 0000 0001 0101b 0111 0110b 0015h 76hFigura 1-13: Programa em linguagem de máquina Figura 1-14: O mesmo programa apresentado em para o μP Z80, apresentado em binário. hexadecimal. Como o próprio nome diz, a linguagem de máquina é muito mais voltada para a máquina que para o serhumano. Evidentemente os primeiros computadores eram programados em linguagem de máquina, entretantoesta linguagem possui uma série de inconvenientes, tais como: os programas são muitos longos, cansativos deserem 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 programaIntrodução aos Computadores. 13
  • 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çãocompleta. O μP Z80 dispõe de instruções que ocupam 1, 2, 3 e até 4 bytes, portanto, ao se traduzir uma linhade 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 dainstruçã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 naFigura 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,“. Estainstruçã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 entendimentodo 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 emmuitas 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. Seao invés de utilizar como operando da instrução de desvio condicional, um número, fosse utilizado um label querotulasse a instrução para onde o salto deveria ser executado, alterações no programa não exigiriam alteraçõesno 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 aser resolvido, desprendendo dos aspectos inerentes ao equipamento que será utilizado. Apresentam uma es-trutura técnica, formada por instruções que são decodificadas em diversas instruções de máquina; são, ainda,linguagens universais, não dependendo do repertório de instruções estabelecido pelos fabricantes dos micro-processadores. Com linguagens deste tipo temos a seguintes vantagens: Os programas podem ser escritos de maneira concisa e mais rápida; Para programar não há a necessidade de conhecerem-se as características do sistema nem a lin- guagem de máquina do microprocessador envolvido; Os programas nestas linguagens podem ser transferidos facilmente de um computador para o outro (portabilidade); A linguagem está mais próxima da utilizada para a formulação do problema, sendo assim mais próxi- ma do homem que da máquina.14 CAPÍTULO 1.
  • 15. É neste contexto que se inserem as linguagens de alto Inícionível ou linguagens automáticas que foram responsáveis pela Etapa 1crescente difusão dos computadores provocando a sua utili- Programa: editor de textozação em massa, pois o usuário passou a não ter mais a ne- Função: edição do arquivo fontecessidade de conhecer a fundo a máquina e nem sua lingua- Resultado: programa fonte ".asm"gem assembly. Bastam conhecimentos matemáticos ou es- Etapa 2pecíficos de sua área e o conhecimento dos detalhes da lin- Programa: assemblerguagem de alto nível. Outra razão é que o usuário tem a Função: tradução para código objetopossibilidade de usar programas prontos, desenvolvidos por Resultado: arquivo objeto ".obj"outros, e que não dependem do equipamento que ele possui, Etapa 3crescendo rapidamente o número de pacotes de programas Programa: linkerdisponíveis. Função: montagem e geração do código executável Resultado: arquivo executável ".hex" Etapa 4 Programa: simulador1.4 Etapas da elaboração de um programa. [07] Função: depuração do programa Resultado: correção de alguns erros A programação de um sistema é a construção corretada seqüência de instruções que este vai realizar para condu-zir à solução do problema. Esta seqüência de instruções é Pronto para a Nvariável, pois a programação possui uma ampla variedade de execução realalternativas e opções que dependem do programador que, ?através de várias maneiras, atinge os mesmos resultados. S Etapa 5 Programas mais elaborados exigem uma metodologia Execução real - Programa executado pelode trabalho, sem a qual, torna-se impossível fazer uma pro- microprocessador utilizando E/S real ou simuladagramação correta. Essencialmente, o projeto de um progra-ma a ser processado por um computador deve ter os seguin-tes procedimentos: O programa N Análise do problema; está correto ? Determinação do algoritmo (opcional, mas altamen- S te recomendável); Fim Escrever o programa em linguagem simbólica (edi- ção); Figura 1-16: Fluxo de elaboração e depuração de um programa. Traduzir o programa para linguagem de máquina (compilação e link-edição); Testar e corrigir o programa (depuração). Na análise do problema, deve ser determinado de maneira bem clara quais os objetivos que devem seralcançados e exatamente que tarefa deve ser realizada. Se este programa for processado em um equipamentojá disponível, verificar sua capacidade de execução do programa, sua capacidade de memória, seus periféricose 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ídasque 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çõesque 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 digramavisto 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 fundamentalpara a sua correção (depuração).Introdução aos Computadores. 15
  • 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 maisfá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 emlinguagens de baixo nível, devido ao fato que cada instrução possui um código de máquina correspondente. Noentanto, este processo é lento, tedioso e suscetível a erros. Na prática, utilizam-se programas para a traduçãodo 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 quenã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 programastradutores. 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 linguagemassembly, para um programa objeto em linguagem de máquina. Existem diversos tipos de assemblers, poiscomo 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 decompiladores, 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 aindaconvertê-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 damemó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 namemó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 encadeamentode um ou vários códigos objeto, bastando para tal que a lista dos arquivos que os contêm seja fornecida.16 CAPÍTULO 1.
  • 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 doque teríamos ao executá-lo diretamente no equipamento real. Informações como conteúdo de registradores e oestado 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 executadamais 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 ohardware do equipamento, sua simulação deixa a desejar. Este é o caso, por exemplo, da necessidade de lerdados 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 problemasde 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çãode proclamar a infalibilidade desta ferramenta. É interessante salientar que a ferramenta da simulação deve serencarada 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 maisreais possíveis ao contexto em que o equipamento será empregado, é que podemos atestar o bom funciona-mento ou não de um programa.1.5 Questões de revisão. Após a leitura do texto desta prática introdutória, efetue uma revisão respondendo às questões seguintes: 01. Classifique os computadores de acordo com sua capacidade de processamento. 02. Quais são os elementos essenciais de um computador? 03. Que características de um microcomputador são definidas pelo microprocessador que o compõe? 04. Defina programa e dados. 05. Cite um exemplo do uso do computador, diferente daqueles apresentados no texto da Prática 0. 06. Durante o processamento, o microprocessador (μP) provê um grande número de funções, cite-as. 07. O que torna o microprocessador uma máquina extremamente versátil? 08. Caracterize as memória RAM e ROM. Que tipo de informação cada uma pode conter? Cite exemplos. 09. Explique o significado dos termos “leitura” e “escrita”. 10. O que acontece se, em um determinado programa, existir uma instrução para escrever dados na ROM? 11. Do que é formada a linguagem de máquina? Qual é a característica comum entre as linguagens de má- quina dos microprocessadores dos vários fabricantes? 12. Por que se utiliza a representação na base hexadecimal da linguagem de máquina? 13. Caracterize e descreva brevemente a linguagem assembly. 14. Defina label. Qual a vantagem da sua utilização na elaboração de programas? 15. Defina linguagem de baixo nível. 16. Defina linguagem de alto nível e cite suas vantagens. 17. Cite as etapas componentes da elaboração de um programa de computador. 18. Defina programa tradutor e descreva os tipos existentes. 19. O que se entende por “depuração” de um programa? 20. Qual a validade da simulação no processo de desenvolvimento de um programa? 21. Existe apenas uma linguagem assembly? Explique.Introdução aos Computadores. 17
  • 18. 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çãodo 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 queutilizaremos.2.1 Elaboração do fluxograma. Para efeito de padronização, iniciaremos apresentando o formato de alguns dos blocos mais usados naelaboração de fluxogramas. Início Terminador: é utilizado para representar o início e o fim do programa. y = x +5 2 Processo: neste bloco especificamos as operações, cálculos, tarefas, ou seja, o processamento que deve ser executado. sin(x) Subrotina: representa um processamento pré-definido, a solução de uma função, ou mesmo um sub-programa. Tomada de decisão: Este bloco representa o momento de um teste boole- S ano, que se tiver resultado verdadeiro (S = sim = verdadeiro) implicará no ? desvio do processamento. Caso o teste tenha resultado falso, o processa- N mento prosseguirá normalmente. Dados Entrada de dados: Bloco que representa a entrada de dados, ou seja, a co- leta de informação vinda do ambiente externo ao programa. Teclado Entrada manual: Bloco que representa a entrada de informação gerada pe- lo usuário (ou operador) do equipamento. Papel Saída de dados: Bloco que representa a operação saída de dados em pa- pel, ou seja, impressão. Display Saída de dados: Bloco que representa a operação saída de dados em um dispositivo de exibição que pode ser um display, um monitor de vídeo, 1 Conector: Símbolo que indica a continuidade do processo em outro ponto, na mesma página. 1 Conector: Símbolo que indica a continuidade do processo em outro ponto, em outra página. Setas: Indicam o sentido do fluxo do processamento Como já devem ter observado, a Figura 1-16 apresenta um fluxograma. Problemas Propostos: P1: Criar um programa que busque da memória os valores armazenados nas posições 1000h e 1001h, some-os e, em seguida, armazene o resultado na posição de memória 1002h.O primeiro programa em linguagem assembly. 19
  • 19. P2: Criar um programa que busque da memória os valores armazenados nas posições 1000h e 1001h, some-os e, em seguida, armazene o resultado na posição de memória 1002h. Repetir esta opera- ção enquanto o resultado da soma não for zero. P3: Criar um programa que faça piscar indefinidamente, a intervalos de 1 segundo, um led ligado à por- ta de saída a partir do momento em que a chave ligada à porta de entrada for levada a nível alto. Vamos aos fluxogramas: Início Início Início Ler o valor da Ler o valor da Fazer saída = 0 posição 1000h posição 1000h (led apagado) Ler o valor da Ler o valor da Ler posição 1001h posição 1001h chave Somar os dois Somar os dois valores valores Chave = 0 S ? N Armazenar o Armazenar o resultado na resultado na posição 1002h posição 1002h Fazer saída = 1 (led aceso) Fim Resultado S ≠0? Subrotina de tempo = 1segundo N Fim Fazer saída = 0 (led apagado) Figura 2-1: Fluxogramas para a solução dos problemas propostos P1, P2 e P3, respectivamente. O programa P1 pode ser traduzido em um fluxograma linear, onde o processamento seguiu contínuosem 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 entraem 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. NaFigura 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 e20 Capítulo 2.
  • 20. 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 Lógica de Seleção - 74LS138 Lógica de Seleção - 74LS138 A13...A11 Y0 Y2 A2...A0 Y0 Y1 Y2 Y3 A15 A0 A10...A0 CE A10...A0 CS G G CLK CLK Z80A CPU EPROM RAM PA - Porta de entrada A D0 Buffer PB - Porta de entrada B D0Buffer 8x FFD Q0 PC - Porta de 8x FFD Q0 PD - Porta de saída C saída D 2716 6116 8 bits D7 74LS244 8 bits 74LS244 D7 74LS374 Q7 8 bits 74LS374 Q7 8 bits D7...D0 D7...D0 D7...D0 D7...D0 D7...D0 D7...D0 D7 D0 Figura 2-2: Diagrama simplificado do hardware básico. CI6 8x buffer tri-state CN2 D0 18 2 D1 16 1Y1 1A1 4 1 CN1 CI2 1Y2 1A2 6 2 1 2 A0 8 9 D0 D2 14 +5V Alimentação A1 7 A0 D0 10 D1 D3 12 1Y3 1A3 8 3 A2 6 A1 D1 11 D2 D4 9 1Y4 1A4 11 4 A3 5 A2 D2 13 D3 D5 7 2Y1 2A1 13 5 MREQ A4 4 A3 D3 14 D4 D6 5 2Y2 2A2 15 6 C1 IOREQ A5 3 A4 D4 15 D5 D7 3 2Y3 2A3 17 7 100nF WR A6 2 A5 D5 16 D6 2Y4 2A4 8 +5V RD A7 1 A6 D6 17 D7 1 Port 00h C2 A8 23 A7 D7 1G 19 100nF A9 22 A8 74LS244 2G CI1 CI10A 27 30 A0 A10 19 A9 IO-0 1 C3 D1 M1 A0 31 A1 A10 3 100nF LED 19 A1 32 A2 CS1 18 RD 2 20 MREQ A2 33 A3 RD 20 CS C4 22 IORQ A3 34 A4 WR 21 OE 100nF 74LS32 21 WR A4 35 A5 WE CI7 8x buffer tri-state CN3 R3 RD A5 36 A6 D0 18 2 C5 HM6116 - RAM 2Kx8 330R 28 A6 37 A7 D1 16 1Y1 1A1 4 1 100nF REFSH A7 38 A8 D2 14 1Y2 1A2 6 2 CI3 18 A8 39 A9 A0 8 9 D0 D3 12 1Y3 1A3 8 3 C6 HALT A9 40 A10 A1 7 A0 O0 10 D1 D4 9 1Y4 1A4 11 4 100nF 24 A10 1 A11 A2 6 A1 O1 11 D2 D5 7 2Y1 2A1 13 5 +5V WAIT A11 2 A12 A3 5 A2 O2 13 D3 D6 5 2Y2 2A2 15 6 C7 16 A12 3 A13 A4 4 A3 O3 14 D4 D7 3 2Y3 2A3 17 7 100nF 17 INT A13 4 A14 A5 3 A4 O4 15 D5 2Y4 2A4 8 NMI A14 5 A15 A6 2 A5 O5 16 D6 1 Port 01h C8 26 A15 A7 1 A6 O6 17 D7 1G 19 100nF RESET 14 D0 A8 23 A7 O7 74LS244 2G CI10B 25 D0 15 D1 A9 22 A8 IO-1 4 C9 23 BUSRQ D1 12 D2 A10 19 A9 6 100nF BUSAK D2 8 D3 A10 RD 5 6 D3 7 D4 CS0 18 C10 CLK D4 9 D5 RD 20 CE 100nF 74LS32 D5 10 D6 21 OE 8x F.F.D. CI8 CN4 D6 13 D7 VPP D0 3 2 C11 D7 D1 4 D0 Q0 5 1 100nF 2716 - EPROM 2Kx8 D2 7 D1 Q1 6 2 Z80-CPU D3 8 D2 Q2 9 3 D4 13 D3 Q3 12 4 CI4 A11 1 15 CS0 D5 14 D4 Q4 15 5 XT1 1,0 MHz A12 2 A Y0 14 D6 17 D5 Q5 16 6 CLK A13 3 B Y1 13 CS1 D7 18 D6 Q6 19 7 C Y2 12 D7 Q7 8 +5V Y3 11 IO-2 2 1 Port 02h 12 9 6 Y4 10 1 11 OC 13 10 A14 4 G1 Y5 9 WR 3 CLK 11 8 MREQ 5 G2A Y6 7 74LS374 CI11D CI11C G2B Y7 CI11A 74LS02 74LS02 74LS02 74LS138 CI9 8x F.F.D. CN5 CI5 D0 3 2 A0 1 15 IO-0 D1 4 D0 Q0 5 1 R1 220R A1 2 A Y0 14 IO-1 D2 7 D1 Q1 6 2 A2 3 B Y1 13 IO-2 D3 8 D2 Q2 9 3 +5V C Y2 12 IO-3 D4 13 D3 Q3 12 4 +5V Y3 11 D5 14 D4 Q4 15 5 6 Y4 10 D6 17 D5 Q5 16 6 D2 R2 4 G1 Y5 9 D7 18 D6 Q6 19 7 1N4148 2,2k IOREQ 5 G2A Y6 7 D7 Q7 8 G2B Y7 IO-3 5 1 Port 03h 4 11 OC 74LS138 Reset WR 6 CLK 74LS374 2 CI11B 74LS02 + CH1 CEFET MG - DEII - Coordenação de Eletrônica C13 Reset 10uF Disciplina: Sistemas Microprocessados I Prof. Denny D. Collina 1 Title Hardware básico para o microprocessador Z80 Size Document Number Rev A4 HMZ80 1 Date: Friday, September 29, 2006 Sheet 1 of 1 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, paraque possa ser lido e executado. Portanto, isto justifica o uso da memória ROM.O primeiro programa em linguagem assembly. 21
  • 21. Mas em qual a faixa de endereços foi mapeada a memória ROM? Para evitar este tipo de pergunta, todomicroprocessador é 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 primeirocrité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, Etapa 1agora iremos trabalhar na Etapa 1. Programa: editor de texto Função: edição do arquivo fonte A edição do programa (que também é chamado de código Resultado: programa fonte ".asm"fonte ou arquivo fonte) deve ser feita em editores de texto do tipo“ASCII puro”, ou seja, são aqueles editores que geram arquivoscom 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 oarquivo.22 Capítulo 2.
  • 22. 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á Etapa 2a tradução linha-a-linha do código fonte, escrito em linguagem as- Programa: assemblersembly, para a linguagem de máquina (códigos binários, que por fa- Função: tradução para código objetocilidade são escritos em hexadecimal). Resultado: arquivo objeto ".obj" 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, oresultado obtido. O editor apresenta uma nova janela de chamada “Resultados de Comando” que exibe oconteú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 corde 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.O primeiro programa em linguagem assembly. 23
  • 23. 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 daescrita das instruções, não há como efetuar a verificação da estrutura lógica de um programa, ou seja, em umasituaçã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.24 Capítulo 2.
  • 24. P1CAP1.obj: É o arquivo contendo o código objeto, ou seja, as instruções já traduzidas para linguagemde máquina (códigos hexadecimais). Caso tentemos abrir este arquivo, o editor fará a apresentação de seuconteúdo em um formato típico para arquivos binários: conteúdo em hexadecimal na parte esquerda da janelae o correspondente em código ASCII na parte direita (veja a Figura 2-10). Caso insista em abrir o arquivo comoum 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 arquivoobjeto 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 arquivode 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.O primeiro programa em linguagem assembly. 25
  • 25. 2.5 Executando o linker. Dando prosseguimento à criação do nosso primeiro progra- Etapa 3ma em assembly, agora utilizaremos o aplicativo linker. Este apli- Programa: linkercativo tem a função de efetuar a conversão de um ou mais arqui- Função: montagem e geração do código executávelvos objeto em um arquivo executável, cuja extensão é “.hex”. Este Resultado: arquivo executável ".hex"último é o arquivo que está pronto para ser gravado em um chip dememó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 estearquivo apresenta formato padronizado (conhecido como Hex-Intel). Outra curiosidade, é que apesar de contero 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 é asua primeira leitura do texto, sugerimos que a salte.26 Capítulo 2.
  • 26. P1CAP1.sym: É o arquivo de símbolos, ele contém todos a relação de todos os labels (ou símbolos) e ovalor 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 Etapa 4programa (depuração). A etapa de simulação não é obrigatória, Programa: simuladormas é uma “ferramenta” extremamente útil no processo de depura- Função: depuração do programação. Enquanto na execução real as instruções são processadas ra- Resultado: correção de alguns errospidamente, 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 nomanual 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 dosusuários iniciantes aos mais avançados.O primeiro programa em linguagem assembly. 27
  • 27. 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 estainstrução foi armazenada. Observe que a instrução seguinte foi armazenada a partir do endereço 0003h, poisa 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 Figura2-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.28 Capítulo 2.
  • 28. 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 umde 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émda apresentação de seus conteúdos, pode-se observar uma lista com o conteúdo de 8 posições consecutivasde memória logo após as setas duplas “»” (Para o registrador SP são listados 16 valores). O valor que apareceem 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 comocó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 nosimulador: 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çãodesta 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 dasimulaçã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 sejaD.O primeiro programa em linguagem assembly. 29
  • 29. Display Update - DSP: Atualização da tela durante a simulação. Utilizando a tecla ^, pode-se alternarentre 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 simuladorexecute o processamento de uma subrotina, mas não o exiba na tela. Quanto inativo (off) o processamento dasubrotina é 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 eASCII. 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 ousuá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 dobit 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 parafuncionar 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). I/O Address FF:_:11111111 PINS FF:_:11111111 Int 1 NMI 1 FF:_:11111111 IFF1 0 FF:_:11111111Figura 2-19: Fragmento da área dos pinos de inter- Figura 2-20: Fragmento da área das portas parale- rupção do simulador. 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óriaque 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.30 Capítulo 2.
  • 30. 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 quesã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 omanual 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çõesque 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:O primeiro programa em linguagem assembly. 31
  • 31. 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 apontadapelo 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 podeser 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 quese 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 ainstrução que está sendo apontada pelo registrador PC. Após a digitação da instrução desejada, o registradorPC é 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 nometambém deve ser especificado pelo usuário) que conterá a anotação de todas as instruções que foram altera-das.32 Capítulo 2.
  • 32. 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 doDOS”. 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çãode 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 quecriamos. 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 quea 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. Dump absolute - ajusta o endereço inicial de memória para a d 1 a ou d 2 a visualização de uma das janelas da área de dados (memory space). rc Reset CPU - reinicializa o processador. hs Help Simulation - tela de ajuda das funções de simulação. qe Quit exit - termina a execução do simulador.O primeiro programa em linguagem assembly. 33
  • 33. 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 linguagemespecífica e diferente para cada microprocessador. Para um mesmo microprocessador pode, também, existirvariações das características da linguagem assembly, podendo ser estabelecidos pontos diferentes, em funçãode 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, quandose 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 comoponto positivo, por outro lado, esta mesma liberdade pode levá-lo a situações de difícil solução se o mesmonão tiver um mínimo de organização na tarefa de construção de seu programa. O conjunto de procedimentosque não são exigências da linguagem, mas que buscam organizar e facilitar a criação de código, chamamos deestilo 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á auma 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 serum 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 podemser 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.A linguagem assembly para o Z80. 35
  • 34. 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 pelaCPU. 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) = parar3.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 INICIO3.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 emvá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 8 Hexadecimal - sufixos “h” ou “H”: Ex.: LD A,12h LD DE,1FFFh LD BC,0CDEFH3.3.2 Constantes de Caracteres. É possível, também, apresentar valores constantes baseados no código ASCII (consulte a tabela ASCII noApêndice A. ), bastando para tal apresentar o caractere correspondente entre aspas simples ( ‘ ). Caso queiraapresentar 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,61h3.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: Sugere-se utilizar preferencialmente o sufixo “h” minúsculo, para evitar confusões com o registrador H do μP.836 Capítulo 3.
  • 35. 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 0FFh3.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 tercomo primeiro caractere o ponto-e-vírgula (;) e que o seu conteúdo deve ser de caracteres ASCII apenas. Ocampo 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 assemblypossui 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 emuma 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ória9 A colocação dos colchetes indica que a presença do Label é facultativa.A linguagem assembly para o Z80. 37
  • 36. 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 utilizadoem 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 presentesem 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.38 Capítulo 3.
  • 37. • 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.A linguagem assembly para o Z80. 39
  • 38. [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” ) quandoreunimos 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 deoperaçã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. Quandoestamos 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.40 Capítulo 3.
  • 39. Mas o mesmo não acontece quando estamos trabalhando com o sistema real. Neste caso, levamos ochip 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 copieestes 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 seralterados. 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 = 3132h1000 05 13 Var1: db 05h ;inicializa a posicao Var1 com valor 05h1001 03 09 15 14 Vet1: db 03h, 09h, 15h, 0FFh ;incializa um vetor de 4 bytes1004 FF1005 4A 6F 61 15 Name: db "Joao e Maria", 00h ;inicializa unma string ASCII de 13 bytes1008 6F 20 65100B 20 4D 61100E 72 69 611011 001012 FD FF 0A 16 Vet2: db 253, 0FFh, 12q, 111b ;incializa um vetor de 4 bytes1015 071016 24 17 Var4: db 12*3 ;incializa a posicao Var4 com 24h1017 72 18 Var5: db Const1 + Const2 ;incializa a posicao Var5 com 72h1018 32 19 Var6: db 33h and 0FEh ;incializa a posicao Var3 com 32h1019 1234 20 DVar1: dw 1234h ;inicializa uma word DVar1 com 1234h101B 5678 9ABC 21 QVar1: dw 5678h, 9ABCh ;incializa duas words101F 04F8 22 C123: dw 1295+12-35 ;inicializa uma word C123 com 04F8h1021 4161 23 Letras: dw "Aa" ;inicializa uma word Letras com 6141h1023 (0001) 24 Var2: ds 01h ;reserva o espaco de 01h byte sem inicializacao1024 (0005) 25 Var3: ds Const1 ;reserva o espaco de 05h bytes sem inicializacao1029 (0004) 26 Vetx: ds 04h ;reserva o espaco de 04h bytes sem inicializacaoFigura 3-10: Resultado da montagem de um segmento de dados, com definição de constantes, strings e veto- res (arquivo “.prn”).A linguagem assembly para o Z80. 41
  • 40. 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 umconjunto de 158 tipos de instruções diferentes que estão ligadas a funções de controle, a operações aritméticase 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 queconstará 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-laaqui. Em uma abordagem simplificada, a arquitetura pode ser apresentada como composta por 20 registrado-res: Um contador de programa (PC) de 16 bits; μP Z80 Dois registradores para uso como ponteiros para a memória de 16 bits cada - (registradores de índice IX e IY); 16 bits PC SP Um registrador de 16 bits para uso como ponteiro de pilha - re- IX IY gistrador stack pointer (registrador SP); 8 bits Um registrador de 8 bits para execução da maioria das opera- A F A’ F’ ções aritméticas, lógicas, etc., - o acumulador (registrador A); B C B’ C’ Um registrador indicador de estado de 8 bits, dos quais apenas 6 são utilizados - registrador de flags ou registrador de estado (re- D E D’ E’ gistrador F); H L H’ L’ 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, Figura 4-1: Arquitetura de regis- ser utilizados ao pares (BC, DE, HL) transformando-se em 3 regis- tradores do μP Z80. 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.As Instruções do μPZ80 43
  • 41. 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 Descrição simbólica Copia o conteúdo armazenado em um registrador de 8 bits “reg8” para reg8 reg8’ outro registrador de 8 bits “reg8”. Copia o conteúdo armazenado na posição de memória especificada A (end) “(end)” para o registrador acumulador. Copia o conteúdo armazenado no registrador acumulador para a posição (end) A de memória especificada por “(end)”. Copia o conteúdo armazenado na posição de memória consecutiva da reg8 byte 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 seguidada 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). μP Z80 Memória 16 bits Segmento de Programa PC=200Fh SP IX IY 200Eh: 78h 8 bits A=23h F A’ F’ 200Fh: ?? B=23h C B’ C’ 2010h: ?? D E D’ E’ 2011h: ?? H L H’ L’ 12 Figura 4-2: Ilustração para a instrução LD A,B .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. É interessante utilizar o sufixo minúsculo “h” como indicador da base hexadecimal, para não ser confundido com o registrador H do μP.1344 Capítulo 4.
  • 42. μP Z80 Memória Memória Código 16 bits Segmento de Dados Segmento de Programa hexa de PC=2003h SP “STA” IX IY 24FFh: ?? 2000h: 3Ah 8 bits 2500h: 02h A=02h F A’ F’ 2001h: 00h 2501h: ?? B C B’ C’ 2002h: 25h Operando “2500h” 2502h: ?? D E D’ E’ 2003h: ?? armazenado com os bytes H L H’ L’ trocados 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). μP Z80 Memória Memória 16 bits Segmento de Dados Segmento de Programa PC=07F8h SP IX IY 2504h: ?? 07F5h: 32h 8 bits 2505h: ?? A=02h F A’ F’ 07F6h: 07h 2506h: ?? B C B’ C’ 07F7h: 25h 2507h: 02h D E D’ E’ 07F8h: ?? H L H’ L’ 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): μP Z80 Memória 16 bits Segmento de Programa PC=2010h SP IX IY 200Eh: 0Eh 8 bits A F A’ F’ 200Fh: AAh B C=AAh B’ C’ 2010h: ?? D E D’ E’ 2011h: ?? H L H’ L’ Figura 4-5: Ilustração para a instrução LD C,0AAh.As Instruções do μPZ80 45
  • 43. 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 (pulsosde clock) para serem completadas. Uma vez que estamos abordando transferência de 2 bytes de informação, tanto a fonte quanto o destinodevem 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. Masdevemos 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 Descrição simbólica Copia o conteúdo armazenado nas duas posições de memória consecuti- reg16 dbyte vas da instrução para um registrador (ou par) de 16 bits “reg16”. Copia o conteúdo armazenado em duas posições de memória consecuti- reg16 (end) vas, cujo endereço inicial é especificado por “(end)” para um regis- trador (ou par) de 16 bits “reg16”. Copia o conteúdo armazenado em um registrador (ou par) de 16 bits (end) reg16 “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. μP Z80 Memória 16 bits Segmento de Programa PC=1853h SP IX IY 1850h: 21h 8 bits 1851h: 02h A F A’ F’ 1852h: 1Ah B C B’ C’ 1853h: ?? D E D’ E’ H=1Ah L=02h H’ L’ 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.46 Capítulo 4.
  • 44. • 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). μP Z80 Memória Memória 16 bits Segmento de Dados Segmento de Programa PC=2506h SP IX IY 18FFh: ?? 2503h: 2Ah 8 bits 1900h: 12h A F A’ F’ 2504h: 00h 1901h: 34h B C B’ C’ 2505h: 19h 1902h: ?? D E D’ E’ 2506h: ?? H=34h L=12h H’ L’ 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). μP Z80 Memória Memória 16 bits Segmento de Dados Segmento de Programa PC=2702h SP IX IY 26FEh: EDh 1900h: ?? 8 bits 26FFh: 4Bh 1901h: ?? A F A’ F’ 2700h: 02h 1902h: 12h B=34h C=12h B’ C’ 2701h: 19h 1903h: 34h D E D’ E’ 2702h: ?? H L H’ L’ 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). μP Z80 Memória 16 bits Segmento de Programa PC=1A06h SP IX IY 1A06h: EBh 8 bits A F A’ F’ 1A07h: ?? B C B’ C’ 1A08h: ?? D=01h E=00h D’ E’ 1A09h: ?? H=27h L=65h H’ L’ Figura 4-9: Ilustração para a instrução EX DE,HL. Situação inicial, a instrução vai ser executada.As Instruções do μPZ80 47
  • 45. μP Z80 Memória 16 bits Segmento de Programa PC=1A07h SP IX IY 1A06h: EBh 8 bits A F A’ F’ 1A07h: ?? B C B’ C’ 1A08h: ?? D=27h E=65h D’ E’ 1A09h: ?? H=01h L=00h H’ L’ 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). μP Z80 Memória 16 bits Segmento de Programa PC=03FFh SP IX IY 03FFh: 08h 8 bits A=12h F=34h A’=56h F’=78h 0400h: ?? B C B’ C’ 0401h: ?? D E D’ E’ 0402h: ?? H L H’ L’ Figura 4-11: Ilustração para a instrução EX AF,AF’. Situação inicial, a instrução vai ser executada. μP Z80 Memória 16 bits Segmento de Programa PC=03FFh SP IX IY 03FFh: 08h 8 bits A=56h F=78h A’=12h F’=34h 0400h: ?? B C B’ C’ 0401h: ?? D E D’ E’ 0402h: ?? H L H’ L’ 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).48 Capítulo 4.
  • 46. μP Z80 16 bits Memória PC=0400h SP Segmento de Programa IX IY 8 bits 03FFh: ?? A F A’ F’ 0400h: D9h B=22h C=66h B’=AAh C’=EEh 0401h: ?? D=33h E=77h D’=BBh E’=FFh 0402h: ?? H=44h L=88h H’=CCh L’=00h Figura 4-13: Ilustração para a instrução EXX. Situação inicial, a instrução vai ser executada. μP Z80 Memória 16 bits Segmento de Programa PC=0401h SP IX IY 03FFh: ?? 8 bits A F A’ F’ 0400h: D9h B=AAh C=EEh B’=22h C’=66h 0401h: ?? D=BBh E=FFh D’=33h E’=77h 0402h: ?? H=CCh L=00h H’=44h L’=88h 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 (maisespecificamente: 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çõessobre 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:As Instruções do μPZ80 49
  • 47. bit7 bit6 bit5 bit4 bit3 bit2 bit1 Bit0 S Z --- H --- P/V N CY Flag S: Indica que o resultado da operação é positivo (S=0) ou negativo sign flag (S=1). Na verdade este flag é um espelho do bit mais significa- tivo do resultado da operação (bit a7); Flag Z: Indica se o resultado da operação é zero (Z=1) ou diferente de zero flag zero (Z=0). É obtido através da função nor de todos os bits do valor resultado; Flag H: Indica se ocorreu um “vai-um” do primeiro para o segundo nibble Half carry flag do acumulador, quando da soma de dois valores. É utilizado so- mente com a instrução DAA; Flag P/V: Informa se a paridade do resultado é par (P=1) ou ímpar (P=0) Parity/overflow após operações lógicas e indica a ocorrência de overflow após flag operações aritméticas Flag N: Indica que a operação aritmética anterior foi uma soma (N=0) ou Add/Subtract flag foi uma subtração (N=1). É utilizado somente com a instrução DAA. Flag CY: Indica se ocorreu um “vai-um” do bit mais significativo em uma Carry flag 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. B7 B6 B5 B4 B3 B2 B1 B0 5V S1 A7 A6 A5 A4 A3 A2 A1 A0 A4 A3 A2 A1 B4 B3 B2 B1 Cout Cin A4 A3 A2 A1 B4 B3 B2 B1 Cout Cin 74LS83A 74LS83A U1 U2 s4 s3 s2 s1 Carry s4 s3 s2 s1 Out S7 . . S4 S3 . . S0 Figura 4-15: Circuito somador/subtrator de 8 bits, da ULA (versão simplificada).50 Capítulo 4.
  • 48. Estes flags em conjunto com as instruções desvio condicional (Prática 3) nos permitirão criar estruturasde 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 Descrição simbólica A A + reg8 Efetua a operação entre o conteúdo do acumulador e o conteúdo do re- A A - reg8 gistrador especificado por “reg8“. A A + byte Efetua a operação entre o conteúdo do acumulador e o valor constante A A – byte numérica especificado por “byte“. A A + reg8 + CY Efetua a operação entre o conteúdo do acumulador, o conteúdo do regis- A A - reg8 – CY trador especificado por “reg8“ e o conteúdo do flag CY. A A + byte + CY Efetua a operação entre o conteúdo do acumulador, o valor constante A A – byte – CY numérica especificado por “byte“ e o conteúdo do flag CY. reg8 reg8 + 1 Incrementa/decrementa o registrador especificado por “reg8“. reg8 reg8 - 1 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 formamais concisa.ADD A,reg8 ;A A + reg8 0ADD A,byte ;A A + byteLegenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 + 3FhSUB reg8 ;A A - reg8 1SUB byte ;A A – byteLegenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 - 33hINC reg8 ;reg8 reg8 + 1 0 -DCR reg8 ;reg8 reg8 - 1 1Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 - 1As Instruções do μPZ80 51
  • 49. NEG ;A 0 - A 1Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 emconsideraçã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 cujonú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.ADC A,reg8 ;A A + reg8 + CY 0ADC A,byte ;A A + byte + CYLegenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 + CYSBC A,reg8 ;A A – reg8 1SBC A,byte ;A A - byteLegenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N 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 - CY4.3.3 Instruções de comparação. Estas instruções, na verdade, compõem um subgrupo das Operações aritméticas com operandos de 8bits, 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 daoperação de subtração vista anteriormente, aqui, o conteúdo do acumulador é preservado, ou seja, o resultadoda operação não é carregado no acumulador, alterando-o. Como uma operação foi efetuada pela ULA, os bitsdo registrador de flags são alterados. Portanto as instruções de comparação afetam apenas os flags. Vejamos quais são:52 Capítulo 4.
  • 50. CP reg8 ;A - reg8 1CP byte ;A - byteLegenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 ← 1Pergunta: 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 comvalores 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ãodestes 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 implicariaem um processamento um pouco mais rápido, uma vez que não seriam necessárias as conversõesBCD → 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 daoperação utilizando instruções do tipo DAA.DAA ;ajuste decimal do acumulador -Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • Decimal adjust accumulator;As Instruções do μPZ80 53
  • 51. • 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ãooperados 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 ajustedesta 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 valorresultado 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 primeirodígito: 8h + 9h = 11h, que é armazenado fazendo o flag H=1. Portanto, apesar do dígito menos significativo deC1h ser menor que 9, a soma do fator de correção deve ser feita. DAA ;A ← C1h + 66h A ← 27h CY=1 H=14.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 Descrição simbólica Efetua a soma entre o conteúdo do par HL e o conteúdo do par espe- HL HL + reg16 cificado por “reg16“. HL HL + reg16 + CY Efetua a operação entre o conteúdo do par HL, o conteúdo do par HL HL - reg16 – CY especificado por “reg16“ e o conteúdo do flag CY. reg16 reg16 + 1 Incrementa/decrementa o par especificado por “reg16“. reg16 reg16 - 1 Onde: reg8 = BC,DE,HL ou SP Vamos às instruções:ADD HL,reg16 ;HL HL + reg16 - - ? - 0Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 ← 68ACh54 Capítulo 4.
  • 52. ADC HL,reg16 ;HL HL + reg16 + CY 0 ?SBC HL,reg16 ;HL HL - reg16 – CY 1Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 ← 68ADhINC reg16 ;reg16 reg16 + 1 - - - - - -DEC reg16 ;reg16 reg16 - 1Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 ← FFFFh4.3.6 Operações lógicas. Este conjunto de operações nos permite atuar no registrador acumulador de maneira bem diferente queo conjunto de operações aritméticas. Aqui podemos enfocar o registrador como um “pacote de bits” e alterar oestado 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 como 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 operandose, também, como o destino do resultado da operação.CPL ;A not (A) 1 1Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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: Not 0011 1010 1100 0101As Instruções do μPZ80 55
  • 53. AND reg8 ;A A and reg8 1 0 0AND byte ;A A and byteLegenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 0011 1010 ANA C ;A ← A and C and 1001 1111 Suponha como situação inicial, A = 3Ah e C = 9Fh, teremos: 0001 1010OR reg8 ;A A or reg8 0 0 0OR byte ;A A or byteLegenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 0011 1010 or 1001 1111 OR 9Fh ;A ← A or 00h 1011 1111 Suponha como situação inicial, A = 3Ah, teremos:XOR reg8 ;A A xor reg8 0 0 0XOR byte ;A A xor byteLegenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 0011 1010 XRI 9Fh ;A ← A xor 00h xor 1001 1111 Suponha como situação inicial, A = 3Ah, teremos: 1010 0101 Ha duas instruções que também efetuam operações lógicas que, ao contrário das anteriores, não tomamo acumulador como operando. Ao contrário, elas operam apenas um bit do registrador de flags: o bit carry (CY).Vejamos:CCF ;CY not (CY) - - ? - 0Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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.56 Capítulo 4.
  • 54. SCF ;CY 1 - - 0 - 0 1Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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çãoque 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 constantenumérica de 16 bits. As instruções que utilizam este modo de endereçamento ocupam 3 bytes: um para o código de operaçãode 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, quecontem tanto o código de operação quanto o operando. Exemplo: LD D,H EX DE,HL4.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,1122hAs Instruções do μPZ80 57
  • 55. 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 contacom um operando de apenas 1 byte. Este byte é interpretado como um valor com sinal (em complemento de2). 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. É bomressaltar que no momento em que ocorreu a busca do operando (o segundo byte da instrução), o conteúdo doPC será PC+2 se comparado com o endereço inicial (antes da busca da instrução acontecer). Ao conteúdo dePC+2 é que será somado o valor relativo e, portanto, teremos um desvio que pode atingir 126 posições dememó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,–1264.4.1.5 Endereçamento indireto. Destes quatro modos de endereçamento vistos, os modos direto e imediato sempre selecionam ummesmo 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 queefetuasse 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 outraquestão: se o número de elementos do vetor não for previamente conhecido, ou ainda, se o vetor tiver númerode 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 permitama solucionar estas proposições. A solução para o problema apresentado acima, passa pela necessidade de o μP dispor de um grupo deinstruçõ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 registradoresde 16 bits ou em pares de registradores (IX, IY, BC, DE ou HL), e como vimos, o conteúdo dos registradorespode 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 linhada 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 utilizamcomo 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 parastack pointer. Entretanto, sua utilização está vinculada à operação de valores de uma estrutura de memóriaque, novamente é indicada pelo seu nome: a pilha.58 Capítulo 4.
  • 56. 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 doregistrador 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. μ P Z80 Memória Memória 16 bits Segmento de Dados Segmento de Programa PC=2002h SP IX IY 23A9h: ?? 2000h: ?? 8 bits 23AAh: 82h A=82h F A’ F’ 2001h: 0Ah 23ABh: ?? B=23h C=AAh B’ C’ 2002h: ?? 23ACh: ?? D E D’ E’ 2003h: ?? H L H’ L’ Figura 4-17: Ilustração para a instrução LD A,(BC).LD (BC),A ;(BC) ALD (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.As Instruções do μPZ80 59
  • 57. μP Z80 Memória Memória 16 bits Segmento de Dados Segmento de Programa PC=1B02h SP IX IY 2762h: ?? 1B00h: ?? 8 bits 2763h: ?? A=82h F A’ F’ 1B01h: ?? 2764h: ?? B=23h C=AAh B’ C’ 1B02h: 12h 2765h: 82h D=27h E=65h D’ E’ 1B03h: ?? H L H’ L’ 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 registradoresHL 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 oponteiro 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 algunsexemplos. 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;60 Capítulo 4.
  • 58. • 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. μP Z80 Memória Memória 16 bits Segmento de Dados Segmento de Programa PC=1B56h SP IX IY 21FFh: ?? 1B55h: 56h 8 bits 2200h: 05h A F A’ F’ 1B56h: 23h 2201h: 1Bh B C B’ C’ 1B57h: ?? 2202h: CAh D=05h E=55h D’ E’ 1B58h: ?? H=22h L=00h H’ L’ Figura 4-20: Ilustração para a instrução LD D,(HL). μP Z80 Memória Memória 16 bits Segmento de Dados Segmento de Programa PC=1B58h SP IX IY 21FFh: ?? 1B55h: 56h 8 bits 2200h: 05h A F A’ F’ 1B56h: 23h 2201h: 55h B C B’ C’ 1B57h: 73h 2202h: CAh D=05h E=55h D’ E’ 1B58h: 23h H=22h L=01h H’ L’ Figura 4-21: Ilustração para a instrução LD (HL),E. μP Z80 Memória Memória 16 bits Segmento de Dados Segmento de Programa PC=1B5Bh SP IX IY 21FFh: ?? 1B59h: 36h 8 bits 2200h: 05h A F A’ F’ 1B5Ah: FFh 2201h: 55h B C B’ C’ 1B5Bh: ?? 2202h: CAh D E D’ E’ 1B5Ch: ?? H=22h L=02h H’ L’ Figura 4-22: Ilustração para a instrução LD (HL),0FFh.As Instruções do μPZ80 61
  • 59. ADD A,(HL) ;A A + (HL) 0Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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)INC (HL) ;(HL) (HL) + 1 0 -Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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) + 1XOR (HL) ;A A xor (HL) 0 0 0Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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)CP (HL) ;A – (HL) 1Legenda: reflete resultado da operação; ? indeterminado; – não afetado Flags S Z H P/V N CY • 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 tipojump 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 doresultado da última operação executada pela ULA, como vimos no item 4.3.1 . O μP dispõe de um conjunto deinstruções que, em função destas condições, rompe ou não a seqüência natural de execução das instruções. Aeste 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 deprocessamento 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.62 Capítulo 4.
  • 60. Instruções de Desvio Jump Call Return Absoluto Relativo Absoluto Incondicional Condicional Incondicional Condicional Incondicional Condicional 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 ← 2200hJP (HL) ;PC HL 14 • 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 ← 0600h4.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 asinstruçõ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.As Instruções do μPZ80 63
  • 61. • Ex.: JP P,2100h ;PC ← 2100h se S = 0JP 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 eedeve estar na faixa de –128 a +127. Portanto, esta instrução permite desvios “curtos”, ou seja, para posiçõesde memória distante pouco mais de uma centena de bytes anteriores ou posteriores.64 Capítulo 4.
  • 62. O endereçamento relativo conta com um operando de apenas 1 byte. Este byte é interpretado como umvalor 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 ressaltarque 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+25h4.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+25hJR 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;As Instruções do μPZ80 65
  • 63. 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 ouoperação) em momentos distintos do processamento. Uma solução simplista para tal fato seria, ao elaborar oprograma, repetir a mesma porção de código quantas vezes fosse necessário. No entanto, isto implica em umaumento 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 formaque quando necessário, pudesse ser utilizada em qualquer momento da execução. A esta porção de códigochamamos 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 dasubrotina não deve implicar em alteração do fluxo principal da execução. É importante, ainda, que a execuçãode 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 quechamamos 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 podedemandar o armazenamento de vários endereços de retorno. Portanto, o μP deve dispor de recursos parapermitir tal ocorrência. Isto nos leva a apresentar a pilha (stack) que é uma região da memória RAM, reservadapelo programador, utilizada para armazenamento vários tipos de dados, entre eles, os endereços de retornodas subrotinas. Sendo a subrotina um módulo de programa à parte do processamento principal, podem ser passados aela 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 desaí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 valoresnos registradores do μP. Isto se faz em situações onde a quantidadedestes 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 Iníciomemória RAM, uma boa sugestão é utilizar-se da pilha, que permite aampliação do número dos parâmetros de entrada e saída, sendo limi-tados apenas pela quantidade de memória do equipamento. Utilizandoa pilha, é possível implementar subrotinas que podem chamar a si call subrot1pró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 mesmosregistradores já estavam sendo utilizados pelo processamento do pro- Fimgrama principal, ou para a passagem de parâmetros, ou armazenamvalores outros que não podem ser perdidos. Teremos, então, um pro-blema. A solução para este conflito é utilizar um grupo de instruçõesque é capaz de salvar uma cópia do conteúdo dos registradores na subrot1:memória e depois recuperá-la. A região de memória utilizada para estesalvamento é, novamente, a pilha. Este grupo é composto das instru-ções: PUSH e POP. Há, ainda, duas outras instruções que se referem à call subrot2pilha: “LD SP,reg16” e “EX SP,reg16” que também serão vistas nes-ta seção. ret Os dois grupos de instruções que apresentamos acima utilizam subrot2: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 novosegmento é função do registrador ponteiro de pilha SP (stack pointer).Daí, é imprescindível que, antes da utilização de qualquer uma destasinstruções, o registrador SP seja inicializado adequadamente. ret Até o momento, estávamos trabalhando com apenas 2 tipos di-ferentes de informação armazenada na memória: programa (ou códi- Figura 4-24: Fluxo de execução de um programa com subrotinas.66 Capítulo 4.
  • 64. go) e dados, ou seja, a memória estava dividida em dois segmentos. Agora vemos há mais um: o segmento depilha. 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 ← 0600hAs Instruções do μPZ80 67
  • 65. μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=1910h SP=1F00h IX IY 1910h: CDh 1EFDh: ?? 8 bits 1911h: 00h A F A’ F’ 1EFEh: ?? 1912h: 06h B C B’ C’ 1EFFh: ?? 1913h: ?? D E D’ E’ 1F00h: ?? H L H’ L’ Figura 4-26: Ilustração para a instrução CALL 0600h - O processador vai iniciar a execução da instrução. μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=0600h SP=1EFEh IX IY 0600h: ?? 1EFDh: ?? 8 bits 0601h: ?? A F A’ F’ 1EFEh: 13h 0602h: ?? B C B’ C’ 1EFFh: 19h 0603h: ?? D E D’ E’ 1F00h: ?? H L H’ L’ 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 chamadaincondicional apenas pelo fato de que primeiramente é feito o teste do flag em questão, para verificar se achamada 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 dedesvio 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 = 0CALL M,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag S = 1CALL NZ,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag Z = 0CALL Z,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag Z = 1CALL PO,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag P = 0CALL PE,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag P = 1CALL NC,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag CY = 0CALL C,end ;(SP-1) PCHigh (SP-2) PCLow PC end se flag CY = 14.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);68 Capítulo 4.
  • 66. • 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. μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=1913h SP=1F00h IX IY 1910h: CDh 1EFDh: ?? 8 bits 1911h: 00h A F A’ F’ 1EFEh: 13h 1912h: 06h B C B’ C’ 1EFFh: 19h 1913h: ?? D E D’ E’ 1F00h: ?? H L H’ L’ 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 flagem questão para verificar se o retorno deve ser executado ou não.RET P ;PCLow (SP) PCHigh (SP+1) se flag S = 0RET M ;PCLow (SP) PCHigh (SP+1) se flag S = 1RET NZ ;PCLow (SP) PCHigh (SP+1) se flag Z = 0RET Z ;PCLow (SP) PCHigh (SP+1) se flag Z = 1RET PO ;PCLow (SP) PCHigh (SP+1) se flag P = 0RET PE ;PCLow (SP) PCHigh (SP+1) se flag P = 1RET NC ;PCLow (SP) PCHigh (SP+1) se flag CY = 0RET C ;PCLow (SP) PCHigh (SP+1) se flag CY = 14.6.2 Instruções de pilha. Como já foi apresentado, a pilha (stack) é uma região da memória RAM reservada, inicialmente, para oarmazenamento de endereços de retorno das subrotinas. Mas existem outras atribuições para a pilha, como ade 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.As Instruções do μPZ80 69
  • 67. O nome pilha vem, exatamente, da sua estrutura de funcionamento, os valores vão sendo armazenadosna 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 dotipo 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çosmais 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 parde 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 SPnã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 domapa 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. μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=1CF3h SP=1F33h IX IY 1CF3h: ?? 1E30h: ?? 8 bits 1CF3h: E5h A F A’ F’ 1E31h: ?? 1CF4h: ?? B C B’ C’ 1E32h: ?? 1CF5h: ?? D E D’ E’ 1F33h: ?? H=1Ah L=02h H’ L’ Figura 4-29: Ilustração para a instrução PUSH HL - O processado vai executar a instrução.70 Capítulo 4.
  • 68. μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=1CF4h SP=1F31h IX IY 1CF3h: ?? 1E30h: ?? 8 bits 1CF3h: E5h A F A’ F’ 1E31h: 02h 1CF4h: ?? B C B’ C’ 1E32h: 1Ah 1CF5h: ?? D E D’ E’ 1F33h: ?? H=1Ah L=02h H’ L’ 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. μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=2221h SP=1E31h IX IY 2220h: ?? 1E30h: ?? 8 bits 2221h: F1h A F A’ F’ 1E31h: 02h 2222h: ?? B C B’ C’ 1E32h: 1Ah 2223h: ?? D E D’ E’ 1F33h: ?? H L H’ L’ Figura 4-31: Ilustração para a instrução POP HL - O processador vai executar a instrução. μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=2222h SP=1E33h IX IY 2220h: ?? 1E30h: ?? 8 bits 2221h: F1h A F A’ F’ 1E31h: 02h 2222h: ?? B C B’ C’ 1E32h: 1Ah 2223h: ?? D E D’ E’ 1F33h: ?? H=1Ah L=02h H’ L’ Figura 4-32: Ilustração para a instrução POP HL - O processador terminou de executar a instrução.As Instruções do μPZ80 71
  • 69. 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: ... 2100: push BC 2011: ... 2101: push DE 2012: call 2100h 2102: ... 2015: ... ... ... 2016: ... ... ... 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). . μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=2222h SP=1F33h IX IY 2220h: ?? 1E30h: ?? 8 bits 2221h: ??h A F A’ F’ 1E31h: ?? 2222h: F9h B C B’ C’ 1E32h: ?? 2223h: ?? D E D’ E’ 1F33h: ?? H=11h L=22h H’ L’ Figura 4-33: Ilustração para a instrução LD SP,HL - O processador vai executar a instrução. . μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=2223h SP=1122h IX IY 2220h: ?? 111Fh: ?? 8 bits 2221h: ??h A F A’ F’ 1120h: ?? 2222h: F9h B C B’ C’ 1121h: ?? 2223h: ?? D E D’ E’ 1122h: ?? H=11h L=22h H’ L’ Figura 4-34: Ilustração para a instrução LD SP,HL - O processador terminou de executar a instrução.72 Capítulo 4.
  • 70. 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). . μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=22AAh SP=1121h IX IY 22A8h: ?? 111Fh: ?? 8 bits 22A9h: ??h A F A’ F’ 1120h: ?? 22AAh: E3h B C B’ C’ 1121h: BBh 22ABh: ?? D E D’ E’ 1122h: AAh H=55h L=66h H’ L’ Figura 4-35: Ilustração para a instrução EX (SP),HL - O processador vai executar a instrução. . μP Z80 Memória Memória RAM 16 bits Segmento de Programa Segmento de Pilha PC=22AAh SP=1121h IX IY 22A8h: ?? 111Fh: ?? 8 bits 22A9h: ??h A F A’ F’ 1120h: ?? 22AAh: E3h B C B’ C’ 1121h: 66h 22ABh: ?? D E D’ E’ 1122h: 55h H=AAh L=BBh H’ L’ 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áriouma condição importante: o bit que circula (aquele que é empurrado para fora do acumulador) deve ter nívelAs Instruções do μPZ80 73
  • 71. 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;74 CAPÍTULO 4.
  • 72. • 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 à esquerdaRLC (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 à direitaRRC (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;As Instruções do μPZ80 75
  • 73. • 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 à esquerdaRL (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 à direitaRR (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.76 CAPÍTULO 4.
  • 74. 4.7.2 Instruções de deslocamento.SLA reg8 ;deslocamento aritmético do reg. à esquerdaSLA (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 CY bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit1 bit 0 “0” Registrador ou memória Figura 4-46: Ilustração para o funcionamento da instrução SLA.SRA reg8 ;deslocamento aritmético do reg. à direitaSRA (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çosde memória, os dispositivos de E/S também são numerados, portanto temos também endereços de E/S. Mascomo os dispositivos de memória e de E/S, que estão todos interligados aos barramentos do μP conseguemdiscernir 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 eIORQ que respectivamente sinalizam para os dispositivos uma requisição (RQ = request) para memória ou para15 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”.As Instruções do μPZ80 77
  • 75. E/S (ou I/O). Veja na figura abaixo, um recorte da Figura 1-5, da página 7, que apresenta o detalhamento dapinagem 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-setambé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)16OUT (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) ← AIN 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) ← H16 A inclusão do prefixo “ES_” tem apenas a função de ressaltar que a especificação de um endereço de E/S.78 CAPÍTULO 4.
  • 76. 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.As Instruções do μPZ80 79
  • 77. 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 tipode 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 LO Código ASCII. 81
  • 78. Apêndice B.B. O CONJUNTO COMPLETO DE INSTRUÇÕES DO Z80.B.1 Instruções de Transferência de 8 bits. Symbolic Flags Opcode No. of No. of No. ofMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes M T Comments Cycles StatesLD r, r’ r ← r’ • • • • • • • • 01 r r’ 1 1 4 r, r’ Reg.LD p, p’* p ← p’ • • • • • • • • 11 011 101 DD 2 2 8 000 B 01 p p’ 001 CLD q, q’* q ← q’ • • • • • • • • 11 111 101 FD 2 2 8 010 D 01 q q’ 011 ELD r, n r←n • • • • • • • • 00 r 110 2 2 7 100 H ← n → 101 LLD p, n* p←n • • • • • • • • 11 011 101 DD 3 3 11 111 A 00 p 110 ← n → p, p’ Reg.LD q, n* q←n • • • • • • • • 11 111 101 FD 3 3 11 000 B 00 q 110 001 C ← n → 010 DLD r, (HL) r ← (HL) • • • • • • • • 01 r 110 1 2 7 011 ELD r, (IX + d) r ← (IX + d) • • • • • • • • 11 011 101 DD 3 5 19 100 IXH 01 r 110 101 IXL ← d → 111 ALD r, (IY + d) r ← (IY + d) • • • • • • • • 11 111 101 FD 3 5 19 01 r 110 q, q’ Req. ← d → 000 BLD (HL), r (HL) ← r • • • • • • • • 01 110 r 1 2 7 001 CLD (IX + d), r (IX + d) ← r • • • • • • • • 11 011 101 DD 3 5 19 010 D 01 110 r 011 E ← d → 100 IYHLD (IY + d), r (IY + d) ← r • • • • • • • • 11 111 101 FD 3 5 19 101 IYL 01 110 r 111 A ← d →LD (HL), n (HL) ← n • • • • • • • • 00 110 110 36 2 3 10 ← n →LD (IX + d), n (IX + d) ← n • • • • • • • • 11 011 101 DD 4 5 19 00 110 110 36 ← d → ← n →LD (IY + d), n (IY + d) ← n • • • • • • • • 11 111 101 FD 4 5 19 00 110 110 36 ← d → ← n →LD A, (BC) A ← (BC) • • • • • • • • 00 001 010 0A 1 2 7LD A, (DE) A ← (DE) • • • • • • • • 00 011 010 1A 1 2 7LD A, (nn) A ← (nn) • • • • • • • • 00 111 010 3A 3 4 13 ← n → ← n →LD (BC), A (BC) ← A • • • • • • • • 00 000 010 02 1 2 7LD (DE), A (DE) ← A • • • • • • • • 00 010 010 12 1 2 7LD (nn), A (nn) ← A • • • • • • • • 00 110 010 32 3 4 13 ← n → ← n →LD A, I A←I b b b 0 b IFF2 0 • 11 101 101 ED 2 2 9 01 010 111 57LD A, R A←R b b b 0 b IFF2 0 • 11 101 101 ED 2 2 9 R is read after it 01 011 111 5F is increased.LD I, A I←A • • • • • • • • 11 101 101 ED 2 2 9 01 000 111 47LD R, A R←A • • • • • • • • 11 101 101 ED 2 2 9 R is written after 01 001 111 4F 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.O Conjunto Completo de Instruções do Z80. 83
  • 79. B.2 Instruções de Transferência de 16 bits. Symbolic Flags Opcode No. of No. of M No. of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsLD dd, nn dd ← nn • • • • • • • • 00 dd0 001 3 3 10 dd Pair ← n → 00 BC ← n → 01 DELD IX, nn IX ← nn • • • • • • • • 11 011 101 DD 4 4 14 02 HL 00 110 001 21 03 SP ← n → ← n →LD IY, nn IY ← nn • • • • • • • • 11 111 101 FD 4 4 14 00 110 001 21 ← n → ← n →LD HL, (nn) L ← (nn) • • • • • • • • 00 101 010 2A 3 5 16 H ← (nn+1) ← n → ← n →LD dd, (nn) ddL ← (nn) • • • • • • • • 11 101 101 ED 4 6 20 ddH← (nn+1) 01 dd1 011 ← n → ← n →LD IX, (nn) IXL ← (nn) • • • • • • • • 11 011 101 DD 4 6 20 IXH ← (nn+1) 00 101 010 2A ← n → ← n →LD IY, (nn) IYL ← (nn) • • • • • • • • 11 111 101 FD 4 6 20 IYH ← (nn+1) 00 101 010 2A ← n → ← n →LD (nn), HL (nn) ← L • • • • • • • • 00 100 010 22 3 5 16 (nn+1) ← H ← n → ← n →LD (nn), dd (nn) ← ddL • • • • • • • • 11 101 101 DD 4 6 20 (nn+1)← ddH 01 dd0 011 ← n → ← n →LD (nn), IX (nn) ← IXL • • • • • • • • 11 011 101 DD 4 6 20 (nn+1) ← IXH 00 100 010 22 ← n → ← n →LD (nn), IY (nn) ← IYL • • • • • • • • 11 111 101 FD 4 6 20 (nn+1) ← IYH 00 100 010 22 ← n → ← n →LD SP, HL SP ← HL • • • • • • • • 11 111 001 F9 1 1 6LD SP, IX SP ← IX • • • • • • • • 11 011 101 DD 2 2 10 11 111 001 F9LD SP, IY SP ← IY • • • • • • • • 11 111 101 FD 2 2 10 11 111 001 F9PUSH qq SP ← SP - 1 • • • • • • • • 11 qq0 101 1 3 11 qq Pair (SP) ← qqH 00 BC SP ← SP - 1 01 DE (SP) ← qqL 10 HLPUSH IX SP ← SP - 1 • • • • • • • • 11 011 101 DD 2 4 15 11 AF (SP) ← IXH 11 100 101 E5 SP ← SP - 1 (SP) ← IXLPUSH IY SP ← SP - 1 • • • • • • • • 11 111 101 FD 2 4 15 (SP) ← IYH 11 100 101 E5 SP ← SP - 1 (SP) ← IYLPOP qq (SP) ← qqL • • • • • • • • 11 qq0 001 1 3 10 SP ← SP + 1 (SP) ← qqH SP ← SP + 1POP IX (SP) ← IXL • • • • • • • • 11 011 101 DD 2 4 14 SP ← SP + 1 11 100 001 E1 (SP) ← IXH SP ← SP + 1POP IY (SP) ← IYL • • • • • • • • 11 111 101 FD 2 4 14 SP ← SP + 1 11 100 001 E1 (SP) ← IYH SP ← SP + 1Notes: 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.84 Apêndice B.
  • 80. B.3 Instruções de Permuta, Transferência de blocos e Pesquisa de grupos. Symbolic Flags Opcode No.of No.of M No.of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsEX DE, HL DE ↔ HL • • • • • • • • 11 101 011 EB 1 1 4EX AF, AF’ AF ↔ AF’ • • • • • • • • 00 001 000 08 1 1 4EXX BC ↔ BC’ • • • • • • • • 11 011 001 D9 1 1 4 DE ↔ DE’ HL ↔ HL’EX (SP), HL (SP+1) ↔ H • • • • • • • • 11 100 011 E3 1 5 19 (SP) ↔ LEX (SP), IX (SP+1)↔ IXH • • • • • • • • 11 011 101 DD 2 6 23 (SP) ↔ IXL 11 100 011 E3EX (SP), IY (SP+1)↔ IYH • • • • • • • • 11 111 101 FD 2 6 23 (SP) ↔ IYL 11 100 011 E3LDI (DE) ← (HL) 1 • • b 0 b b 0 • 2 3 11 101 101 ED 2 4 16 DE ← DE+ 1 10 100 000 A0 HL ← HL + 1 BC ← BC - 1LDIR (DE) ← (HL) 1 • • b 0 b 0 0 • 2 11 101 101 ED 2 5 21 if BC ≠ 0 DE← DE + 1 10 110 000 B0 2 4 16 if BC = 0 HL ← HL + 1 BC ← BC - 1 repeat until: BC = 0LDD (DE) ← (HL) 1 • • b 0 b b 0 • 2 3 11 101 101 ED 2 4 16 DE ← DE - 1 10 101 000 A8 HL ← HL - 1 BC ← BC - 1LDDR (DE) ← (HL) 1 • • b 0 b 0 0 • 2 11 101 101 ED 2 5 21 if BC ≠ 0 DE ← DE - 1 10 111 000 B8 2 4 16 if BC = 0 HL ← HL - 1 BC ← BC - 1 repeat until: BC = 0 4 4 5 4 6 3CPI A - (HL) b b b b b b 1 • 11 101 101 ED 2 4 16 HL ← HL + 1 10 100 001 A1 BC ← BC -1CPIR A - (HL) 4 4 5 4 b b b b b b 1 • 6 3 11 101 101 ED 2 5 21 if BC ≠ 0 and HL ← HL + 1 10 110 001 B1 A ≠ (HL). BC ← BC -1 2 4 16 if BC = 0 or Repeat until: A = (HL) A = (HL) or BC = 0 4 4 5 4 6 3CPD A - (HL) b b b b b b 1 • 11 101 101 ED 2 4 16 HL ← HL - 1 10 101 001 A9 BC ← BC -1CPDR A - (HL) 4 4 5 4 b b b b b b 1 • 6 3 11 101 101 ED 2 5 21 if BC ≠ 0 and HL ← HL - 1 10 111 001 B9 A ≠ (HL). BC ← BC -1 2 4 16 if BC = 0 or Repeat until: A = (HL) A = (HL) or BC = 0 1Notes: 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.O Conjunto Completo de Instruções do Z80. 85
  • 81. B.4 Instruções Aritméticas de 8 bits. Symbolic Flags Opcode No.of No.of M No.of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsADD 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 DD 2 2 8 000 B 000 B 10 000 p 001 C 001 CADD A, q* A←A+q b b b b b V 0 b 11 111 101 FD 2 2 8 010 D 010 D 10 000 q 011 E 011 EADD A, n A←A+n b b b b b V 0 b 11 000 110 2 2 8 100 H 100 IXH ← n → 101 L 101 IXHADD A, (HL) A ← A + (HL) b b b b b V 0 b 10 000 110 1 2 7 111 A 111 AADD A, (IX + d) A ← A + (IX + d) b b b b b V 0 b 11 011 101 DD 3 5 19 10 000 110 ← d →ADD A, (IY + d) A ← A + (IY + d) b b b b b V 0 b 11 111 101 FD 3 5 19 10 000 110 ← d →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, qSBC A, s A ← A - s - CY b b b b b V 1 b 011 as shown for the ADDAND s A ← A AND s b b b 1 b P 0 0 100 instruction. TheOR s A ← A OR s b b b 0 b P 0 0 110 underlined bits re- placeXOR s A ← A XOR s b b b 0 b P 0 0 101 the underlined bits in 1 1CP s A-s b b b b b V 1 b 111 the ADD set.INC r r←r+1 b b b b b V 0 • 00 r 100 1 1 4INC p* p←p+1 b b b b b V 0 • 11 011 101 DD 2 2 8 q Reg. 00 p 100 000 BINC q* q←q+1 b b b b b V 0 • 11 111 101 FD 2 2 8 001 C 00 q 100 010 DINC (HL) (HL) ← (HL) + 1 b b b b b V 0 • 00 110 100 1 3 11 011 EINC (IX + d) (IX + d) ← b b b b b V 0 • 11 011 101 DD 3 6 23 100 IYH (IX + d) + 1 00 110 100 101 IYL ← d → 111 AINC (IY + d) (IY + d) ← b b b b b V 0 • 11 111 101 FD 3 6 23 (IY + d) + 1 00 110 100 ← d →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. 1Notes: 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. Symbolic Flags Opcode No.of No.of M No.of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsADD HL, ss HL ← HL + ss 2 2 2 • • b b b • 0 b 1 00 ss1 001 1 3 11 ss Reg.ADC HL, ss HL ← HL + ss + 1 1 2 2 2 1 b b b b b V 0 b 1 11 101 101 ED 2 4 15 00 BC CY 01 ss1 010 01 DESBC HL, ss HL ← HL - ss - CY b b 1 1 b 2 b 2 b 2 V 1 1 b 1 11 101 101 ED 2 4 15 10 HL 01 ss0 010 11 SPADD IX, pp IX ← IX + pp • • b 2 b 2 b 2 • 0 b 1 11 011 101 DD 2 4 15 00 pp1 001 pp Reg.ADD IY, rr IY ← IY + rr • • b 2 b 2 b 2 • 0 b 1 11 111 101 FD 2 4 15 00 BC 00 rr1 001 01 DEINC ss ss ← ss + 1 • • • • • • • • 00 ss0 011 1 1 6 10 IXINC IX IX ← IX + 1 • • • • • • • • 11 011 101 DD 2 2 10 11 SP 00 100 011 2386 Apêndice B.
  • 82. Symbolic Flags Opcode No.of No.of M No.of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsINC IY IY ← IY + 1 • • • • • • • • 11 111 101 FD 2 2 10 rr Reg. 00 100 011 23 00 BCDEC ss ss ← ss - 1 • • • • • • • • 00 ss1 011 1 1 6 01 DEDEC IX IX ← IX - 1 • • • • • • • • 11 011 101 DD 2 2 10 10 IY 00 101 011 2B 11 SPDEC IY IY ← IY - 1 • • • • • • • • 11 111 101 FD 2 2 10 00 101 011 2BNotes: 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 Symbolic Flags Opcode No.of No.of M No.of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsDAA Converts A into pac- b b b b b P • b 00 100 111 27 1 1 4 ked BCD following add or subtract with BCD operands. __CPL A←A • • b 1 1 b 1 • 1 • 00 101 111 2F 1 1 4 One’s complement. 4NEG A←0-A b b b b b V 1 b 11 101 101 ED 2 2 8 Two’s complement. __ 01 000 100 44CCF CY ← CY • • b 1 b 2 b 1 • 0 b 00 111 111 3F 1 1 4 Complement carry flag.SCF CY ← 1 • • b 1 0 b • 1 0 1 00 110 111 37 1 1 4NOP No operations • • • • • • • • 00 000 000 00 1 1 4HALT CPU halted • • • • • • • • 01 110 110 76 1 1 4 3DI IFF1 ← 0 • • • • • • • • 11 110 011 F3 1 1 4 IFF2 ← 0 3EI IFF1 ← 1 • • • • • • • • 11 111 011 FB 1 1 4 IFF2 ← 1 4IM 0 Set interrupt mode 0 • • • • • • • 11 101 101 ED • 2 2 8 01 000 110 46 4IM 1 Set interrupt mode 1 • • • • • • • • 11 101 101 ED 2 2 8 01 010 110 56 4IM 2 Set interrupt mode 2 • • • • • • • • 11 101 101 ED 2 2 8 01 011 110 5ENotes: 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 _ H contains the previous carry state (after instruction H ↔ C) 2 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 Symbolic Flags Opcode No. of No. of M No. of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsRLCA • • b 0 b • 0 b 00 000 111 07 1 1 4RLA • • b 0 b • 0 b 00 010 111 17 1 1 4RRCA • • b 0 b • 0 b 00 001 111 0F 1 1 4RRA • • b 0 b • 0 b 00 011 111 1F 1 1 4RLC r b b b 0 b P 0 b 11 001 011 CB 2 2 8 r Reg. 00 000 r 000 BRLC (HL) b b b 0 b P 0 b 11 001 011 CB 2 4 15 001 C 00 000 110 010 DRLC (IX + d) b b b 0 b P 0 b 11 011 101 DD 4 6 23 011 E 11 001 011 CB 100 H ← d → 101 L 00 000 110 111 ARLC (IY + d) b b b 0 b P 0 b 11 111 101 FD 4 6 23 11 001 011 CBO Conjunto Completo de Instruções do Z80. 87
  • 83. Symbolic Flags Opcode No. of No. of M No. of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States Comments ← d → 00 000 110LD r,RLC (IX + d)* r ← (IX + d) b b b 0 b P 0 b 11 011 101 DD 4 6 23 RLC r 11 001 011 CB (IX + d) ← r ← d → 00 000 rLD r,RLC (IY + d)* r ← (IY + d) b b b 0 b P 0 b 11 111 101 FD 4 6 23 RLC r 11 001 011 CB (IY + d) ← r ← d → 00 000 rRL m b b b 0 b P 0 b 010 Instruction formatRRC m b b b 0 b P 0 b 001 and states are theRR 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 withSLL m* b b b 0 b P 0 b 110 new number.SRA m b b b 0 b P 0 b 101SRL m b b b 0 b P 0 b 111RLD b b b 0 b P 0 • 11 101 101 ED 2 5 18 01 101 111 6FRRD b b b 0 b P 0 • 11 101 101 ED 2 5 18 01 100 111 67Notes: 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. Symbolic Flags Opcode No. of No. of M No. of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States Comments 1 2 3 4BIT b, r _ b b b 1 b b 0 • 11 001 011 CB 2 2 8 r Reg. Z ← rb 01 b r 000 B 1 2 3 4BIT b, (HL) ___ b b b 1 b b 0 • 11 001 011 CB 2 3 12 001 C Z ← (HL)b 01 b 110 010 D 5 1 2 3 4BIT b, (IX + d) _____ b b b 1 b b 0 • 11 011 101 DD 4 5 20 011 E Z ← (IX + d)b 11 001 011 CB 100 H ← d → 101 L 01 b 110 111 A 5 1 2 3 4BIT b, (IY + d) _____ b b b 1 b b 0 • 11 111 101 FD 4 5 20 Z ← (IY + d)b 11 001 011 CB ← d → 01 b 110SET b, r rb ← 1 • • • • • • • • 11 001 011 CB 2 2 8 b Bit. 11 b r 000 0 001 1SET b, (HL) (HL)b ← 1 • • • • • • • • 11 001 011 CB 2 4 15 010 2 11 b 110 011 3SET b, (IX + d) (IX + d)b ← 1 • • • • • • • • 11 011 101 DD 4 6 23 100 4 11 001 011 CB 101 5 ← d → 110 6 11 b 110 111 7SET b, (IY + d) (IY + d)b ← 1 • • • • • • • • 11 111 101 FD 4 6 23 11 001 011 CB ← d → 11 b 110LD r,SET b, (IX + d)* r ← (IX + d) • • • • • • • • 11 011 101 DD 4 6 23 rb ← 1 11 001 011 CB (IX + d) ← r ← d → 11 b rLD r,SET b, (IY + d)* r ← (IY + d) • • • • • • • • 11 111 101 FD 4 6 23 rb ← 1 11 001 011 CB (IY + d) ← r ← d → 11 b rRES b, m mb ← 0 • • • • • • • • 10 To form new m ≡ r, (HL), opcode re- (IX+d), (IY+d) place 11 of SET b, s with 10. Flags and states are the same.88 Apêndice B.
  • 84. Symbolic Flags Opcode No. of No. of M No. of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsNotes: 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 Symbolic Flags Opcode No.of No.of M No.of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsIN A, (n) A ← (n) • • • • • • • • 11 011 011 DB 2 3 11 r Reg. ← n → 000 BIN r, (C) r ← (C) b b b 0 b P 0 • 11 101 101 ED 2 3 12 001 C 01 r 000 010 DIN (C)* or Just affects flags, b b b 0 b P 0 • 11 101 101 ED 2 3 12 011 EIN F, (C)* value is lost. 01 110 000 70 100 HINI (HL) ← (C) 1 b b 1 b 1 b 3 b 1 X b 2 b 3 11 101 101 ED 2 4 16 101 L HL ← HL + 1 10 100 010 A2 111 A B←B-1INIR (HL) ← (C) 0 1 0 b 3 0 X b 2 b 3 11 101 101 ED 2 5 21 if B ≠ 0 HL ← HL + 1 10 110 010 B2 2 4 16 if B = 0 B←B-1 Repeat until B=0IND (HL) ← (C) 1 b b 1 b 1 b 4 b 1 X b 2 b 4 11 101 101 ED 2 4 16 HL ← HL - 1 10 101 010 AA B←B-1INDR (HL) ← (C) 0 1 0 b 4 0 X b 2 b 4 11 101 101 ED 2 5 21 if B ≠ 0 HL ← HL - 1 10 111 010 BA 2 4 16 if B = 0 B←B-1 Repeat until B=0OUT (n), A (n) ← A • • • • • • • • 11 010 011 D3 2 3 11 ← n →OUT (C), r (C) ← r • • • • • • • • 11 101 101 ED 2 3 12 01 r 001OUT (C), 0* (C) ← 0 • • • • • • • • 11 101 101 ED 2 3 12 01 110 001 71OUTI (C) ← (HL) 1 1 1 b b b X b X X X 1 11 101 101 2 ED 4 16 HL ← HL + 1 10 100 011 A3 B←B-1OTIR (C) ← (HL) 0 1 0 X 0 X X X 11 101 101 ED 2 5 21 if B ≠ 0 HL ← HL + 1 10 110 011 B3 2 4 16 if B = 0 B←B-1 Repeat until B=0OUTD (C) ← (HL) 1 1 1 1 b b b X b X X X 11 101 101 ED 2 4 16 HL ← HL - 1 10 101 011 AB B←B-1OTDR (C) ← (HL) 0 1 0 X 0 X X X 11 101 101 ED 2 5 21 if B ≠ 0 HL ← HL - 1 10 111 011 BB 2 4 16 if B = 0 B←B-1 Repeat until B=0Notes: 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. flag is affected by the result of B ← B - 1 as in DEC B. 1 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.O Conjunto Completo de Instruções do Z80. 89
  • 85. B.10 Instruções de Desvio Symbolic Flags Opcode No.of No.of M No.of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsJP nn PC ← nn • • • • • • • • 11 000 011 C3 3 3 10 ccc Condition ← n → 000 NZ ← n → 001 ZJP cc, nn if cc is true, • • • • • • • • 11 ccc 010 3 3 10 010 NC PC ← nn ← n → 011 C ← n → 100 PO 101 PE 110 PJR e PC ← PC + e • • • • • • • • 00 011 000 18 2 3 12 111 M ←e -2 →JR ss, e if ss is true • • • • • • • • 00 ss 000 2 3 12 if ss is true PC ← PC + e ←e -2 → 2 2 7 if ss is falseJP HL PC ← HL • • • • • • • • 11 101 001 E9 1 1 4JP IX PC ← IX • • • • • • • • 11 011 101 DD 2 2 8 ss Condition 11 101 001 E9 111 C 110 NCJP IY PC ← IY • • • • • • • • 11 111 101 FD 2 2 8 101 Z 11 101 001 E9 100 NZDJNZ e B←B-1 • • • • • • • • 00 010 000 10 2 2 8 if B = 0 if B ≠ 0 ←e -2 → 2 3 13 if B ≠ 0 PC ← PC + eNotes: 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. Symbolic Flags Opcode No.of No.of M No.of TMnemonic Operation S Z F5 H F3 P/V N C 76 543 210 Hex Bytes Cycles States CommentsCALL nn SP ← SP - 1 • • • • • • • • 11 001 101 CD 3 5 17 (SP) ← PCH ← n → SP ← SP - 1 ← n → (SP) ← PCL PC ← nnCALL cc, nn if cc is true, • • • • • • • • 11 ccc 100 3 3 10 if cc is false SP ← SP - 1 ← n → 3 5 17 if cc is true (SP) ← PCH ← n → SP ← SP - 1 (SP) ← PCL PC ← nnRET PCL ← (SP) • • • • • • • • 11 001 001 C9 1 3 10 SP ← SP + 1 PCH ← (SP) SP ← SP + 1RET cc if cc is true, • • • • • • • • 11 ccc 000 1 1 5 if cc is false PCL ← (SP) 1 3 11 if cc is true SP ← SP + 1 PCH ← (SP) SP ← SP + 1 2RETI PCL ← (SP) • • • • • • • • 11 101 101 ED 2 4 14 cc Condition SP ← SP + 1 01 001 101 4D 000 NZ PCH ← (SP) 001 Z SP ← SP + 1 010 NC 011 C 1,2RETN PCL ← (SP) • • • • • • • • 11 101 101 ED 2 4 14 100 PO SP ← SP + 1 01 000 101 45 101 PE PCH ← (SP) 110 P SP ← SP + 1 111 M IFF1 ← IFF2RST p SP ← SP - 1 • • • • • • • • 11 t 111 1 3 11 t p (SP) ← PCH 000 0h SP ← SP - 1 001 8h (SP) ← PCL 010 10h PC ← p 011 18h 100 20h 101 28h 110 30h 111 38h 1Notes: This instruction has other unofficial opcodes, see Opcode list. Instruction also IFF1 ← IFF2 2Flag Notation: • = flag is not affected, 0 = flag is reset, 1 = flag is set, b = flag is set according to the result of the operation.90 Apêndice B.
  • 86. BIBLIOGRAFIAC. 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.comReferências Bibliográficas.. 91

×