Você está na página 1de 110

Laboratrio de Microprocessadores

Wilson Ruiz

CEFET-SP
Laboratrio de Microprocessadores DEBUG & TASM Conceitos, Aplicaes e Projetos Wilson Ruiz Verso 4.0 2002

HALIAEETUS LEUCOCEPHALUS Bald Eagle

Laboratrio de Microprocessadores

Wilson Ruiz

CAPTULO 1 CONCEITOS BSICOS

1.1 Apresentao: Este material, oriundo do trabalho em disciplinas relacionadas ao assunto, tem o objetivo de apenas de introduzir o leitor/aluno no universo da programao assembly (dos microprocessadores das sub-famlias Intel: 80x86, 80x88 e Pentium, conhecidas por i86) e tambm de projetos em hardware, apresentando conceitos e sugerindo aplicaes de uma forma muito direta, no tendo a pretenso de esgotar o assunto. Razes para aprender programao assembly: Conhecer melhor o funcionamento do hardware (microprocessador, perifricos, memrias, etc), permitindo o desenvolvimento de projetos (de hardware e/ou software) mais eficientes. Obter o controle total do PC. Os programas em assembly so em geral mais rpidos, menores e mais poderosos (at certos limites) que os criados em outras linguagens. Possibilidades da incluso de rotinas assembly em programas escritos em linguagens de nveis alto ou mdio (C, Delphi etc). Fcil adaptao do programador a novas tecnologias como; novas famlias de microprocessadores e microcontroladodes. 1.2 Hardware bsico. Caractersticas gerais: 14 registradores de 16 bits. Capaz de enderear diretamente 1Mbyte de memria. Capaz de acessar 65.535 (64Kendereos) portas de I/O

Registradores de uso geral: AX AH/AL BX BH/BL CX CH/CL DX DH/DL (16 bits) (8 bits)

AX: Acumulador Uso geral e para operaes aritmticas e lgicas (registrador que especificado pelo maior nmero de instrues). BX: Base Uso geral e para indexar tabelas de memria (ex.: ndice de vetores). 2

Laboratrio de Microprocessadores

Wilson Ruiz

CX: Contador Uso geral e como contador de repeties (loops) e movimentao repetitiva de dados. DX: Dados Uso geral e para operaes aritmticas. Registradores de Segmento: So usados para a identificao de segmentos especficos de memria. CS: Code Segment Enderea o segmento de cdigo do programa que est sendo executado. O valor do CS no pode ser atualizado diretamente. DS: Data Segment Enderea o segmento de dados do programa. SS: Stack Segment Enderea o segmento de pilha do programa. ES: Extra Segment Usado para enderear um segmento de dados adicional. Registradores Ponteiros ou de Deslocamento Usados em conjunto com registradores de segmento. IP: Instruction Pointer Usado em conjunto com o CS para apontar o byte da prxima instruo a ser executada (endereo de off-set, dentro do segmento). No h acesso direto. SP: Stack Pointer Usado em conjunto com o SS para apontar o topo da pilha (stack). BP: Base Pointer Usado para indicar a base da pilha. Particularmente importante para a passagem de parmetros em linguagem de alto nvel (como C). SI & DI: Source Index e Destination Index Usados em instrues de string. Podem ser usados para indexar acessos a memria.

Laboratrio de Microprocessadores

Wilson Ruiz

Registrador de Flags: Consiste em um registrador de bits de controle (flag), que pode ter seus testados individualmente no programa por instrues condicionais. Possui 16 bits dos quais apenas 9 tem funo para o usurio. OF: Overflow Flag Setada quando ocorre overflow aritmtico. DF: Direction Flag Setada para auto-incremento em instrues de string. IF: Interruption Flag Permite que ocorram interrupes quando setada. Pode ser setada pelo sistema ou pelo usurio. TF: Trap Flag (debug) Usada por debugadores para executar programas passo a passo. SF: Signal Flag Resetada (SF=0) quando um resultado for um nmero positivo ou zero e setada (SF=1) quando um resultado for negativo. ZF: Zero Flag Setada quando um resultado for igual a zero. AF: Auxiliar Flag Setada quando h overflow entre o nibble menos significativo e o mais significativo de um byte. PF: Parity Flag Setada quando o nmero de bits 1 de um resultado for par (paridade par). Setada se overflow no bit mais significativo do resultado. Memria Segmentada: A memria dividida em um nmero arbitrrio de segmentos. O tamanho dos segmentos varia de 16 bytes a 64Kbytes. Cada segmento se inicia em um endereo sempre mltiplo de 16. O endereo de segmento composto por duas words (16 bits cada). A anotao usada para representar um endereo : Segmento:off-set 4

CF: Carry Flag

Laboratrio de Microprocessadores

Wilson Ruiz

Exemplo: Endereo lgico: 015Bh : 0009h

(CS = 015Bh e IP = 0009h) 015Bh: endereo de segmento 0009h: endereo de off-set

Endereo fsico: 015B0h + 0009h ====== 015B9h

Pilha Operacional: Usada para o armazenamento temporrio de dados. Serve para a passagem de parmetros. usada do endereo maior para o endereo menor. So enviados para a pilha e retirados desta apenas words (16 bits). Controle quanto a overflow da pilha responsabilidade do programador.

1.3 Criao de programas. Para a criao de grandes programas so necessrios os seguintes passos: * Desenvolvimento do algoritmo: Estgio em que o problema estabelecido e uma soluo escolhida, possibilitando assim a criao dos respectivos fluxogramas. * Codificao do algoritmo: Consiste em escrever o programa em alguma linguagem de programao (linguagem assembly neste caso especfico), tomando como base a soluo adotada no passo anterior (constituindo-se o programa fonte). * Transformao para a linguagem de mquina (compilao): Criao do programa objeto (a partir do programa fonte), escrito como uma seqncia de zeros e uns que podem ser interpretados pelo microprocessador. Esta etapa realizada integralmente pelo compilador. * Eliminao de erros detectados no programa na fase de teste: A correo em geral, requer a repetio de todos os passos, com observao atenta.

Laboratrio de Microprocessadores

Wilson Ruiz

1.4 Os ambientes de programao. Para a criao de programas em assembly trabalhamos com duas opes: DEBUG e o TASM - Turbo Assembler da Borland, abordados nos prximos captulos. 1.5 Estrutura das instrues em Assembly. Nas linhas do cdigo em Linguagem Assembly existem trs partes notveis: a primeira o nome da instruo a ser executada; a segunda, so os parmetros do comando; a terceira, os operandos. Exemplo 1: ADD AH, BH o

Aqui "ADD" o comando a ser executado, neste caso uma adio e, os registradores "AH" e "BH" so os parmetros. Exemplo 2: MOV AL, 25

Neste exemplo "MOV" a instruo a ser executada, neste caso uma movimentao de dados, "AL" o parmetro e o byte 25h o operando (valor em sempre em hexadecimal no DEBUG e opcionalmente em binrio, decimal ou hexadecimal no TASM). Os nomes das instrues nesta linguagem so constitudos de 2, 3 ou 4 letras (oriundas de abreviaes de frases em ingls). Estas instrues so chamadas mnemnicos (algo fcil de ser memorizado) e quando compiladas so associadas ao seu respectivo cdigo de operao (Op. Code), representando a funo que o microprocessador executar. 1.6 Observaes Este procedimento experimental apresentado em itens numerados, cada qual abordando de forma objetiva o funcionamento de um determinado comando ou funo, algumas caractersticas relevantes a este e/ou exerccios prticos e projetos sobre o mesmo. Para um melhor desempenho do leitor/aluno durante a execuo desse roteiro, necessrio que o mesmo seja seguido na ordem crescente dos itens, do respectivo captulo, e que o contedo de cada tpico seja lido integralmente. Para indicar o incio das observaes, ou comentrios adicionais, pertinentes ao respectivo item do roteiro usado o smbolo: Evitando que o texto explicativo seja confundido com o prprio programa. Quando as explicaes forem feitas sobre um determinado comando ou registrador do microprocessador, o nome deste aparecer sempre entre aspas . 6

Laboratrio de Microprocessadores

Wilson Ruiz

Quando as explicaes forem feitas sobre uma determinada instruo em um programa apresentado, ser usado um ponto-e-vgula ; para separar o texto desta instruo. Nos exemplos, onde existirem desvios, estes podem conter o endereo do ponto de entrada no programa (quando a aplicao feita no DEBUG) ou de outra forma, simplesmente um nome (label) que representar esse endereo (para o TASM), assim o ponto de entrada no programa ser representado tambm por esse nome seguido de dois pontos : para separ-lo da instruo.

Laboratrio de Microprocessadores

Wilson Ruiz

CAPTULO 2 PRTICA COM O DEBUG

2.1 O DEBUG - Introduo. Neste captulo vamos usar o DEBUG, uma vez que este possui timas caractersticas didticas e podemos encontr-lo em qualquer PC com o MS-DOS / Windows, podendo ser encontrado normalmente no diretrio C:\DOS ou C:\WINDOWS. DEBUG um ambiente para desenvolvimento e depurao de programas em assembly dos microprocessadores das sub-famlias Intel 80x86, 80x88 e Pentium (i86), e pode apenas criar arquivos com a extenso .COM, que devido as suas caractersticas, no podem exceder 64 Kbytes de comprimento, e tambm devem sempre iniciarem no endereo de memria 0100H dentro do segmento determinado pelo sistema. importante observar isso, pois deste modo os programas .COM no so relocveis. Usando este ambiente, entre outras coisas, possvel, visualizar os valores dos registradores internos da CPU (microprocessador) e executar o programa na forma passo-apasso, alm da compilao automtica das instrues, recursos interessantes durante o incio do aprendizado e para o desenvolvimento de projetos. Inicialmente so apresentados os comandos mais importantes do DEBUG e aps, gradativamente, so propostos exerccios e projetos relativos aos itens estudados. Para a execuo de todos os comandos mostrados nos exemplos e solicitados nos exerccios, necessrio acionar a tecla ENTER aps a digitao da linha correspondente. O sinal de prompt do DOS adotado nos exemplos : C:\> O sinal de prompt do DEBUG : Assim os comandos a direita deste prompt, so os que devem ser digitados. Para representar o valores numricos apresentados na tela do microcomputador que no possuem significado (remanecentes na memria), ou podem ter outros valores em diferentes mquinas, adotado neste roteiro o smbolo ## (para um byte) e #### (para dois bytes).

Laboratrio de Microprocessadores

Wilson Ruiz

2.2 Entrar no Debug. Digitar o comando: C:\>DEBUG 2.3 Sair do Debug. Digitar o comando: - Q 2.4 Chamar o Help do Debug. Digitar o comando: - ? mostrada a seguinte tela: help assemble compare dump enter fill go hex input load move name output proceed quit register search trace unassemble write allocate expanded memory deallocate expanded memory map expanded memory pages display expanded memory status ? A [endereo] C intervalo endereo D [intervalo] E endereo [lista] F intervalo lista G [=endereo] [endereos] H valor1 valor2 I porta L [endereo] [unidade] [primeiro-setor] [nmero] M intervalo endereo N [caminho] [lista-de-parmetros] O porta byte P [=endereo] [nmero] Q R [registrador] S intervalo lista T [=endereo] [valor] U [intervalo] W [endereo] [unidade] [primeiro-setor] [nmero] XA [#pginas] XD [identificador] XM [pginaL] [pginaP] [identificador] XS 9

Laboratrio de Microprocessadores

Wilson Ruiz

Os principais comandos sero abordados no decorrer do texto. Sempre consultar o Help para esclarecer dvidas sobre os comandos. 2.5 Aritmtica em Hexadecimal. Digitar os comandos: - H 3 2 - H 12 AA - H 3D5C 2A10 O comando H imprime, numa linha abaixo, a soma (1o valor) e a diferena (2o valor) entre os dois nmeros digitados. Confirmar os valores apresentados e testar outros valores de at 16 bits. Sua principal utilidade calcular o tamanho de um determinado programa (em hexadecimal), necessrio para a gravao de um arquivo executvel. 2.6 Verificar o contedo de todos os registradores. Digitar o comando: - R apresentada uma listagem semelhante a esta (diferente nos segmentos): AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1669 ES=1669 SS=1669 CS=1669 IP=0100 NV UP EI PL NZ NA PO NC 1669:0100 89D8 MOV AX, BX Verificar na listagem: Os registradores de uso geral: AX, BX, CX e DX com os seus respectivos contedos. Os registradores de propsito especfico: SP, BP, SI, DI, DS, ES, SS, CS, e IP com seus respectivos contedos. Todos os registradores de segmento com os mesmos valores. Indicao do status de todas as flags. O valor de IP e o endereo mostrado na ltima linha. Exemplo: Para os valores seguintes 10

Laboratrio de Microprocessadores

Wilson Ruiz

1669:0100 1669 incio do segmento 0100 estamos neste off-set dentro do segmento O Debug sempre coloca IP em 0100h ao ser iniciado e tambm encarrega-se de escolher os segmentos convenientemente. Em todas aplicaes no DEBUG, trabalharemos sempre dentro de um nico segmento. A prxima instruo a ser executada, mostrada em mnemnico e em hexadecimal na ltima linha. 2.7 Verificar e alterar o contedo de um registrador qualquer. Digitar os comandos: - R AX AX 0000 _ Digite um novo valor para AX. Verifique se o dado foi armazenado, digitando o comando: - R O comando R seguido do nome do registrador indica que queremos ver o seu contedo e depois altera-lo. Este comando s permite a alteraes de 16 bits, no sendo possvel portanto uma mudana de somente a parte alta ou baixa do respectivo registrador. Testar o comando em outros registradores de uso geral. Verificar as alteraes. Sair do Debug. Entrar novamente no Debug. Verificar o contedo dos registradores alterados anteriormente. 2.8 Examinar o contedo de uma posio de memria. Digitar os comandos: - E 100 - E 101 - E 102 11

Laboratrio de Microprocessadores

Wilson Ruiz

O comando E mostra o contedo de um endereo especificado. 2.9 Alterar o contedo de uma ou vrias posies de memria. O comando E permite, alm de examinar, alterar o contedo de um endereo na memria, bastando para isso digitar os novos bytes, separados por espao, e pressionar o ENTER para finalizar o comando. Digitar o comando: - E 100 ####:0100 ##.01 ##.D8 Usando o comando E verifique a entrada dos bytes anteriores. 01 e D8 so os OP-CODES (cdigos de operao) da seguinte instruo em assembly: ADD AX,BX. Usar o comando R para verificar a ltima linha da listagem. 2.10 Executar uma nica instruo. Com o comando R carregar 03A7 em AX e 092A em BX. Digitar o comando: - T Verificar: IP = 0102 ;este registrador foi deslocado e indica o endereo da prxima instruo a ser executada.

AX = 0CD1 BX = 092A Observar a ltima linha da listagem O comando T permite a execuo de uma instruo de cada vez (execuo passo-a-passo) alm de apresentar a listagem dos registradores. 2.11 Exerccio. Executar novamente a mesma instruo com os resultados do item 2.10; para isso necessrio usar o comando R para posicionar IP em 0100 e, s ento, usar o comando T.

12

Laboratrio de Microprocessadores

Wilson Ruiz

Sempre devemos checar o valor atual de IP e a instruo mostrada na ltima linha da listagem de registradores, antes de executar o comando T. 2.12 Exerccio. Digitar o comando: - E 0100 #### : 0100 ## . 29 ## . D8 Alterar o valor de IP para 0100 Verificar o mnemnico da instruo digitada. Carregar valores de teste nos registradores envolvidos. Executar a instruo Verificar os resultado 2.13 Entrada de instrues em mnemnico. Digitar o comando e o fragmento de programa a seguir: - A 0100 #### : 0100 MOV #### : 0103 MOV #### : 0106 MOV #### : 0109 ADD #### : 010B MOV #### : 010D MOV #### : 010F XOR AX, 0123 BX, 4567 CX, 89AB AX, BX DX, AX AX, BX AX, CX

O comando A possibilita a digitao direta de instrues em mnemnicos a partir do endereo indicado por IP ( p/ apenas A) ou a partir de um endereo especificado ( p/ A 0100, por exemplo) As instrues podem ser digitadas em letras maisculas ou minsculas indiferentemente. Os espaos existentes nas instrues no so importantes para o DEBUG, porm til ter o hbito de digita-los pois os compiladores so mais exigentes com relao a sintaxe das instrues. Lembrar sempre que todos os valores numricos digitados so assumidos pelo DEBUG, como expressos em hexadecimal.

13

Laboratrio de Microprocessadores

Wilson Ruiz

Quando uma instruo digitada de forma errada, o DEBUG mostra uma mensagem de erro e possibilita a sua imediata correo. Estabelecer IP=0100 e executar o programa anterior passo-a-passo, at a instruo XOR AX, CX (NUNCA execute instrues ou trechos desconhecidos de programas, pois o microcomputador poder travar), analisar o resultado mostrado na listagem dos registradores, aps cada instruo. 2.14 Listagem do programa digitado. Digitar o comando: - U 0100 Identificar na tela apresentada o programa anteriormente digitado O comando U permite verificar a listagem do programa na memria a partir do endereo de IP (p/ apenas U) ou a partir de um endereo especificado (p/ U 0100, por exemplo). Para sucessivos comandos U, o contedo da memria mostrado seqencialmente. 2.15 Examinar o contedo de uma regio de memria. Digitar o comando: -D Verificar que o contedo numrico de 128 posies consecutivas de memria apresentado na tela em linhas de 16 bytes cada, com uma faixa de endereos escolhida dentro do segmento, a partir do valor atual de IP. A direita da listagem temos os caracteres ASCII correspondentes (quando um ponto . apresentado, este indica que o caractere realmente um ponto ou um caractere de controle). Para sucessivos comandos D a memria pode ser rapidamente vasculhada. Para verificar o contedo de uma regio no iniciada no valor atual de IP (por exemplo :0200h) digitaramos: - D 0200 Para verificar o contedo de apenas uma pequena regio de memria (por exemplo de :0150h a :0158h) digitaramos: 14

Laboratrio de Microprocessadores

Wilson Ruiz

- D 0150 0158 Testar as possibilidades desse comando. 2.16 Preenchimento de regies de memria rapidamente. Digitar o comando: - F 0150 016F 22 Com o comando D verificar o contedo da memria do endereo :0150h ao endereo :016Fh. O comando F preenche o trecho de memria determinado com o byte fornecido (no exemplo 22h). Digitar o comando: - F 0170 018F 00 11 22 33 44 Com o comando D verificar o contedo da memria do endereo :0170h ao endereo :018Fh. Este comando preenche a regio de memria especificada com a seqncia de bytes fornecida (no exemplo 00h 11h 22h 33h 44h). 2.17 Copiar um bloco contnuo de memria. Usando o comando A 0100, digite o seguinte fragmento de programa: :0100 MOV MOV MOV MOV AL, 00 AH, 01 DL, 06 DH, 07

Supondo que por um erro, voc esqueceu de digitar entre a 2a e 3a instrues estas outras: MOV MOV MOV MOV BL, 02 BH, 03 CL, 04 CH, 05

15

Laboratrio de Microprocessadores

Wilson Ruiz

Como o grupo de instrues a ser inserido tem um total de 8 bytes, copiar as duas ltimas instrues do programa digitado para uma regio 8 bytes abaixo, digitando o seguinte comando: - M 0104 0107 010C Verificar com o comando U. Copia os dados da faixa de endereos de :0104h a :0107h para a partir do endereo :010Ch. Com o comando A 0104 digitar as instrues anteriormente esquecidas. Verificar o final com o comando U. 2.18 Comparar duas regies de memria. Digitar o comando: - C 0100 010F 0150 Verificar os valores apresentados na tela. O comando compara entre si os dados das duas regies de memria ( de :0100h a :0150h com outra que inicia-se em :0150h ), mostrando diferenas. Testar este comando tambm para regies de memria com contedos idnticos. 2.19 Procurar dados na memria. Digitar o comando: - S 0100 0200 FF Verificar os valores apresentados na tela. O comando procura o byte FFh na regio de memria especificada (no caso de :0100h a :0200h), indicando o endereo do byte encontrado. Para procurar uma seqncia de bytes (por exemplo CCh DDh EEh) na mesma regio de memria o comando seria: - S 0100 0200 CC DD EE

16

Laboratrio de Microprocessadores

Wilson Ruiz

2.20 Interrupes Viso geral Interrupes so estruturas usadas para transferir o controle (registradors CS:IP) de uma localizao na memria para outra. Quando uma interrupo ocorre, a CPU suspende temporariamente a funo atual (aps terminar a instruo que est sendo executada) e executa uma rotina especial conhecida como rotina de servio de interrupo (ISR). Quando a ISR termina, a CPU volta execuo no ponto imediatamente aps a instruo que foi interrompida. Existem trs tipos diferentes de interrupes no PC: Interrupes de Software: usadas pelos programas para chamar rotinas na BIOS e no ncleo do DOS; Interrupes de Hardware: usadas pelos dispositivos de hardware para avisar a CPU de que estes solicitam uma funo; Excees: usadas pela prpria CPU para indicar erros.

Quando ocorre uma interrupo, uma seqncia de eventos (principalmente envolvendo a preservao do status atual na pilha operacional) executada para garantir que a CPU responda interrupo e, mais tarde, retorne execuo do programa principal, como se nada tivesse acontecido. Toda interrupo tem um nmero associado, variando de 0 a 255 (em decimal) ou de 00h a FFh (em hexadecimal). Quando uma interrupo ocorre, este nmero serve como um ndice para a tabela conhecida como Vetor de Interrupes, armazenada na memria baixa. Esta tabela contm os endereos de at 256 ISR diferentes. A interrupo 05h, por exemplo, resulta na execuo da ISR cujo endereo o sexto no Vetor (interrupo 0 o primeiro). A tabela est sempre armazenada nos primeiros bytes da memria (0000:0000). Uma interrupo de software gerada quando um programa executa uma instruo INT (algumas dessas sero utilizadas nesse material e outras constam na bibliografia listada). Existem dois tipos de interrupes de hardware: Mascarveis e No mascarveis. As interrupes no mascarveis so executadas mesmo que o flag de interrupo esteja desativado. As interrupes mascarveis so desativadas quando o flag estiver zerado. Um dispositivo gera uma interrupo no mascarvel ativando o pino NMI (NonMaskarable Interrupt) na CPU. Por exemplo: uma INT 02h (Non-Maskable Interrupt) gerada se uma condio no mascarvel, como um erro de paridade na memria, ocorrer. Esta a nica interrupo que no pode ser mascarada pela instruo CLI (Clear Interrupts). 17

Laboratrio de Microprocessadores

Wilson Ruiz

As interrupes mascarveis ocorrem quando um dispositivo (como o teclado, o Clock ou a porta serial) ativa uma linha de interrupo. Estes dispositivos no esto conectados diretamente na CPU, mas sim ao controlador de interrupes, cujo trabalho acumular as requisies de interrupo dos dispositivos de hardware, prioriz-las e pass-las para a CPU uma por vez. A sada do controlador de interrupes (por exemplo o Intel 8259) conectada a uma linha de interrupo da CPU. Um exemplo clssico de interrupo de hardware o que acontece quando uma tecla pressionada no teclado. Atravs do controlador de interrupes, uma interrupo 09h gerada, o que executa uma ISR do ROM BIOS. A ISR l o cdigo de varredura da porta do teclado, converte este cdigo em seu equivalente ASCII e o coloca no Buffer do teclado. O ltimo tipo de interrupo, a exceo, gerada pela CPU quando esta detecta uma condio de erro durante ou aps a execuo de uma instruo. Por exemplo, se uma instruo de diviso foi executada para o divisor igual a zero, a CPU executa uma interrupo 0. 2.21 INT 20 - Uma boa sada. A interrupo INT 20 (o nmero 20 expresso em hexadecimal) est presente no DOS (e portanto no Windows) e tem como funo encerrar um programa em assembly sem parar o microprocessador devolvendo assim, o controle do sistema para o DOS ou para o DEBUG, dependendo do ponto, a partir do qual, o programa foi executado. Digitar o comando abaixo - A 0111 #### : 0111 INT 20 Usar o comando U para verificar na listagem a entrada dessa nova instruo no final do programa anteriormente digitado. 2.22 Execuo integral de um programa. Estabelecer IP = 0100 Usar o comando R para carregar 0000h nos registradores de uso geral Digitar o comando seguinte: G

18

Laboratrio de Microprocessadores

Wilson Ruiz

Uma mensagem semelhante a: Programa finalizado normalmente ser exibida na tela devido a execuo da instruo INT 20. Verificar o resultado do programa com o comando R. O comando G permite a execuo completa de um programa (partindo do endereo indicado por IP, at encontrar o INT 20). NUNCA executar o INT 20 como comando T. 2.23 Execuo parcial de um programa. O comando G permite o estabelecimento de um break point em um programa a ser testado isto ; a execuo deste at um determinado ponto para verificao de alguma determinada caracterstica ou condio. Este recurso pode ser muito til durante a verificao do funcionamento de um determinado trecho de um grande programa. Para testa-lo estabelecer IP=0100 e digitar o comando abaixo: - G 0111 Assim o programa executado at o byte imediatamente anterior ao endereo indicado (endereos em hexadecimal), no caso parando o processamento antes da instruo INT 20. Agora digitar: G

Lembre-se de verificar sempre o contedo de IP antes de executar um programa. 2.24 INT 21 - Uma verstil ferramenta. Assim como o INT 20 existe um grande nmero de interrupes disponveis sendo, inegavelmente, a mais verstil de todas a INT 21. Esta interrupo possui vrios recursos (conhecidos como funes) que so escolhidos carregando-se inicialmente o registrador de entrada com um valor especfico (inclusive um para o trmino de programas .exe que a 4Ch). A tabela seguinte lista os mais importantes desses recursos (no todos), bem como os valores necessrios para a entrada e a sada correspondentes. Ler com ateno as principais funes da INT 21 relacionadas na tabela: 19

Laboratrio de Microprocessadores

Wilson Ruiz

Funo 01h

Descrio Entrada Receber caractere do AH=01h teclado (em ASCII) e o enviar para a tela. Enviar caractere para a AH=02h tela. DL=cdigo ASCII caractere Receber caractere da AH=03h porta serial (COM1). Enviar caractere COM1.

Retorna OBS AL=cdigo ASCII do caractere

02h

Nada do AL=cdigo ASCII do caractere Nada

03h

04h

05h

06h

para AH=04h DL=cdigo ASCII do caractere Enviar caractere para a AH=05h impressora (LPT1). DL=cdigo ASCII do caractere Receber / enviar Para receber caractere. caractere AH=06h DL=FFh Para enviar caracter AH=06h DL=cdigo ASCII do caractere (00h-FEh) Receber caractere do AH=07h teclado sem envia-lo para a tela.

Nada

07h

08h

Receber caractere do AH=08h teclado sem envia-lo para a tela.

AL=cdigo ASCII No do caractere aguarda o recebimento do caractere Somente retorna o caractere se ele estiver pronto no buffer de teclado.No reconhece CTRL+C AL=cdigo ASCII Aguarda o do caractere recebimento de um caractere. No reconhece CTRL+C AL=cdigo ASCII Reconhece do caractere a combinao das teclas CRTL+C 20

Laboratrio de Microprocessadores

Wilson Ruiz

Funo 09h

Descrio Enviar string para a tela.

0Ah

0Bh

Entrada AH=09h DS:DX=aponta p/ uma string com 24h ($) no final. Receber string do teclado. AH=0Ah DS:DX buffer p/ armazenamento de string Composio do buffer: Byte 0: indica o nmero mximo de bytes possvel na entrada de dados. Byte 1: ser atualizado pelo DOS com o nmero de caracteres digitados. O fim da string marcado com o caractere 0Dh, que embora conste da string, no contado no byte 1. Verificar estado de AH=0Bh pressionamento de tecla

Retorna Nada

OBS:

Buffer atualizado Espera o com a string usurio digitada pelo teclar usurio. ENTER ou entrar com um valor 0Dh. Fornece ao usurio todos os comando comuns do DOS para a edio de texto.

0Ch

AL=FFh caso exista caractere no buffer AL=00h caso no exista caractere Limpar buffer do teclado AH=0Ch Veja descrio da e receber caractere AL=no da funo funo que foi p/ recebimento do escolhida em AL. caractere. Valores p/ AL: 01h, 06h ,07h e 08h: indicam a funo desta interrupo que ser chamada aps o esvaziamento do buffer. 21

Laboratrio de Microprocessadores

Wilson Ruiz

Funo 0Eh

Descrio Unidades presente.

19h

Entrada de disco AH=0Eh DL=nmero da unidade de disco: 00h=A, 01h=B Obter unidade de disco AH=19h ativa. Obter data AH=2Ah

Retorna OBS AL=nmero de unidades de disco do sistema AL=unidade de disco ativa (00h=A, 01h=B ,...). AL=dia da semana (de 00h=domingo ... a 06h=sbado) CX=ano (de 1980 a 2099) DH=ms (de 01h=janeiro a 0Ch=dezembro) DL=dia do ms AL=00h, data OK AL=FFh, data invlida CH=hora (formato 24 horas,de 00 a 23) CL=minutos (de 00 a 59) DH=segundos (de 00 a 59) DL=centsimos de segundo (de 00 a 99) Todos os valores retornados por esta funo estaro em hexa.

2Ah

2Bh

Definir data

2Ch

Obter horrio

AH=2Bh CX=ano DH=ms DL=dia do ms AH=2Ch

2Dh

Definir horrio

30h

Obter verso do DOS

AH=2Dh CH=hora CL=minutos DH=segundos DL=centsimos de segundo AH=30h

AL=00h, OK AL=FFh, invlido

Todos os valores retornados por esta funo estaro em Hexa. Com preciso limitada ao perodo do clock do computador horrio Veja obs. anterior horrio

4Ch

Encerrar programa

AH=4Ch

P/ verses anteriores a 5 - AL=nmero principal da verso e AH=secundrio Nada 22

Laboratrio de Microprocessadores

Wilson Ruiz

Hexa 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A

Car

hexa 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A Space 4B ! 4C 4D # 4E $ 4F % 50 & 51 52 ( 53 ) 54 * 55

Car + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U

Hexa 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80

Car V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~

hexa 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB

Car

hexa AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6

car

hexa D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

Car

23

Laboratrio de Microprocessadores

Wilson Ruiz

2.25 Cdigos de caracteres ASCII. Analisar rapidamente o contedo da tabela anterior. O padro ASCII (American Standard Code for Information Interchange) original constitudo por 128 caracteres, com cdigos decimais de 0 a 127 (de 00h a 7Fh), tornando-se um cdigo universal, usado em diferentes famlias de computadores, porm, o conjunto apresentado na tabela tem o dobro de cdigos, incluindo-se ali os cdigos de 128 at 255 (de 80h a FFh), seqncia de cdigos padronizada apenas para a famlia PC, ms eventualmente adotada de forma parcial para equipamentos de outras famlias. Em geral os cdigos que compem a metade adicional da tabela, so chamados caracteres ASCII estendidos, usados como caracteres de controle e no reproduzidos na tabela anterior. 2.26 Envio de caracter para o monitor de vdeo. Digitar o programa abaixo e executar a seqncia de comandos: A 0100 MOV MOV INT INT - U 0100 R G AH, 02 DL, 2A 21 20

Analisar o resultado 2.27 Exerccio: Imprimir outras letras. Consultando a tabela ASCII fornecida, testar o programa anterior com outros cdigos (imprimindo outros caracteres). 2.28 Nomear um programa para futura gravao em disco. Para dar nome ao programa digitar o comando: N letra.com ; se desejado usar outro nome seguido de .COM

24

Laboratrio de Microprocessadores

Wilson Ruiz

Agora o programa anterior possui o nome digitado (com no mximo 8 caracteres, no padro DOS; e extenso .com) 2.29 Salvar o programa em disco. Para gravar o programa (arquivo executvel) necessrio indicarmos o tamanho do mesmo para o Debug assim, utilizaremos o comando H para calcular o nmero de bytes do mesmo da seguinte forma: - H 108 100 0100h = endereo de incio do programa 0108h = o byte seguinte ao trmino da ltima instruo do programa 0208 0008 = respectivamente a soma e a diferena dos valores digitados O uso do comando H para esse clculo pode ser muito til na determinao do comprimento de programas maiores. O Debug usa o par de registradores BX:CX para o tamanho do programa a ser gravado portanto, usando o comando R definir BX=0000 e CX=0008. Digitar o comando: W

Ler a mensagem na tela. Sair do Debug (comando Q). Usar o comando DIR do DOS para verificar o arquivo criado C:\>DIR LETRA.COM Executar este programa diretamente no DOS simplesmente digitando o seu nome: C:\>LETRA Analisar o resultado Para gravarmos este programa em um disquete teramos a seguinte seqncia de comandos: N A:LETRA.COM W 25

Laboratrio de Microprocessadores

Wilson Ruiz

2.30 Leitura de um arquivo. Para ler (carregar) o arquivo do disco para o DEBUG, e verificar o seu contedo, executar a seguinte seqncia de comandos: N LETRA.COM L U 0100

Ou para o arquivo em disquete teramos: N A:LETRA.COM L U 0100

2.31 Execuo passo-a-passo de um programa com interrupes do DOS. Para ser possvel a execuo de um programa na forma passo-a-passo e conseqentemente a sua anlise NO devemos usar o comando T para executar qualquer interrupo, pois estas na verdade, so longos programas e no simples instrues e assim, o fluxo do processamento seria desviado, h averia uma mudana de segmento de memria e provavelmente ficaramos perdidos. possvel contornar-se esse problema tomando-se o seguinte cuidado: Executar novamente o programa anterior passo-a-passo usando o comando T at o endereo onde a prxima instruo a ser executada a INT 21. Usar agora o novo comando P para executar a interrupo indicada. Outra opo seria usar o comando G como um break pointer at imediatamente aps a interrupo em questo. 2.32 Impresso de string na tela. Digitar o programa: MOV MOV INT INT AH, 09 DX, 0200 21 20 26

Laboratrio de Microprocessadores

Wilson Ruiz

Com o comando E entrar a seguinte seqncia de bytes: - E 0200 47, 72, 61, 6E, 64, 65, 20, 50, 72, 6F, 66, 2E, 20, 57, 69, 6C, 73, 6F, 6E, 24 Executar o programa integralmente (com o comando G) Esta funo do INT 21 imprime um string inteiro (endereado por DX) e finalizado pelo caracter $ (24h no cdigo ASCII). 2.33 Entrada da string diretamente: Digitar a seqncia de comandos: A 0150

:0150 DB Isto um teste$ D 0150

Com o comando D possvel verificar que a string anteriormente digitada mostrada no lado direto da tela. O sub-comando DB possibilita a entrada direta de strings na memria (entre aspas duplas ou simples), para depois serem chamadas pela interrupo correspondente. 2.34 Exerccio. Usar a tabela de cdigos ASCII fornecida e modificar o programa anterior para imprimir strings diferentes. Usar o comando D para verificar a string na memria. 2.35 Leitura de caractere do teclado. Digitar o programa a partir de :0100 MOV MOV INT INT AH, 01 AL, FF 21 20

27

Laboratrio de Microprocessadores

Wilson Ruiz

Executar estabelecendo um break pointer na ltima instruo isto , com o comando: G 0106, que indica o endereo posterior ao trmino da execuo do trecho de programa escolhido. Voc ver um cursor piscando e o DOS esperando que uma tecla seja acionada. Pressionar uma tecla (por exemplo a) e depois verificar o contedo de AL na listagem apresentada ou pelo comando R. Comparar o valor encontrado em AL com o da tabela ASCII. O DOS carrega o cdigo ASCII do caractere da tecla pressionada no registrador AL (notar que o contedo de AL, que era inicialmente FFh, foi alterado). O break pointer foi necessrio pois o INT 20 altera o contedo dos registradores. Para sair do break pointer basta apenas digitar o comando G. 2.36 Exerccio. Repetir o procedimento anterior para outras teclas (letras minsculas, maisculas, nmeros e smbolos). 2.37 Leitura de teclas especiais. Repetir o procedimento anterior para as teclas especiais, isto , com o cdigo ASCII estendido (por exemplo a tecla F1). Para cada tecla especial o DOS envia dois caracteres, um aps o outro. O primeiro sempre 00h, indicando que o prximo caractere o cdigo de varredura de uma tecla especial, assim voc ver 00h no registrador AL e o caractere ASCII equivalente ao segundo byte impresso na tela. 2.38 Exerccio. Repetir o procedimento anterior para outras teclas especiais. 2.39 Obter a data. Digitar o programa a partir de :0100h MOV AH, 2A INT 21 ;continua... 28

Laboratrio de Microprocessadores

Wilson Ruiz

INT

20

Executar o programa estabelecendo um break pointer na ltima instruo. Na listagem apresentada ou com o comando R verificar o contedo dos registradores AL, CX, DH e DL. Comparar os valores encontrados com os esperados (de funes da INT 21, constantes na tabela fornecida). 2.40 Definir data. Usar a INT 21 para definir uma nova data para o sistema (consultar a tabela das funes da INT 21). Ler essa nova data. Voltar para a data atual. 2.41 Obter o horrio. Digitar o programa abaixo: MOV AH, 2C INT 21 INT 20 Executar o programa estabelecendo um break pointer na ltima instruo. Na listagem apresentada ou com o comando R verificar o contedo dos registradores CH, CL, DH e DL. Comparar os valores encontrados com os esperados (de funes da INT 21, constantes na tabela fornecida). acordo com as acordo com as

Posicionar IP e executar novamente o programa; e comparar os novos valores com os anteriores. 2.42 Definir horrio. Usar a INT 21 para definir um novo horrio para o sistema (consultar a tabela das funes da INT 21). Ler esse novo horrio. 29

Laboratrio de Microprocessadores

Wilson Ruiz

Voltar para o horrio atual. O horrio calculado pela contagem dos pulsos de clock da mquina, assim nenhum evento pode ser temporizado com preciso acima da taxa de contagem desse relgio. A freqncia desse timer de aproximadamente 18,2 Hz; conseqentemente a preciso ser de aproximadamente 5,4 centsimos de segundo. 2.43 Informar o drive corrente. Digitar o programa: MOV AH, 19 INT 21 INT 20 Executar programa estabelecendo um break pointer na ltima instruo e verificar o contedo de AL consultando a tabela fornecida. 2.44 Testes com as flags. Os sinalizadores (flags) so mostrados a direita, na segunda linha, da listagem dos registradores, no DEBUG. Usar o comando R para verificar o status atual das flags. O nome e a forma de indicao de status das flags mostrado na tabela abaixo: Flag OF DF IF SF ZF AF PF CF nome Overflow Direo Interrupo Sinal Zero Carry auxiliar Paridade Carry Quando setada OV DN EI NG ZR AC PE CY Quando resetada NV UP DI PL NZ NA PO NC

As principais flags so: CARRY FLAG CY NC p/ =1 verdadeiro p/=0 falso

30

Laboratrio de Microprocessadores

Wilson Ruiz

ZERO FLAG SIGNAL FLAG

ZR NZ NG PL

p/=1 p/=0 p/=1 p/=0

verdadeiro falso negativo positivo

Digitar o programa para testar a CARRY FLAG: : 0100 MOV MOV ADD INT AX, FFFE BX, 0001 AX, BX 20

Executar o programa estabelecendo um break pointer na ltima instruo (G0108) e aps, verificar o status da CARRY FLAG. Substituir o valor 0001 por 0002, repetir a execuo e comparar o status atual com o anterior. Digitar o programa para testar a ZERO FLAG: : 0100 MOV MOV SUB INT AX, 0FFE BX, 0001 AX, BX 20

Executar o programa estabelecendo um break pointer na ltima instruo (G0108) e aps verificar o status da ZERO FLAG. Substituir o valor 0001 por 0FFE, repetir a execuo e comparar o status atual com o anterior. Digitar o programa para testar a SIGNAL FLAG: : 0100 MOV MOV SUB INT AX, FFFE BX, 0002 AX, BX 20

Executa o programa estabelecendo um break pointer na ltima instruo (G0108) e aps verificar o status da SIGNAL FLAG. Substituir o valor FFFE por 0001, repetir a execuo e comparar o status atual com o anterior.

31

Laboratrio de Microprocessadores

Wilson Ruiz

2.45 Exerccio. Usando o comando R carregue um valor diferente de 00h em BL isto , estabelea BX = 00## . Digitar e executar o programa: : 0100 MOV AH, 02 MOV CX, 0008 MOV DL, 00 RCL BL, 1 ADC DL, 30 INT 21 LOOP 105 INT 20

Analisar o resultado e executar outras vezes o programa para diferentes valores em BX (mostra na tela o contedo de BL em binrio). 2.46 Exerccio Modificar o programa anterior para o mesmo imprimir um caractere b (significando binrio) no final do nmero.

2.47 Porta Paralela Analisar a tabela seguinte que mostra um resumo das caractersticas da porta paralela do PC.

32

Laboratrio de Microprocessadores

Wilson Ruiz

Porta ENDEREO 0378h

ENDEREO 0379h

ENDEREO 037Ah

BIT 7 6 5 4 3 2 1 0 7 6 5 4 3 4 3 2 1 0

Direo OUT OUT OUT OUT OUT OUT OUT OUT IN IN IN IN IN --IN/OUT IN/OUT IN/OUT IN/OUT

Pinos (DB25) 9 8 7 6 5 4 3 2 11 (bit invertido) 10 12 13 15 Hab IRQ 7 17 (bit invertido) 16 14 (bit invertido) 1 (bit invertido)

Nome do sinal D7 D6 D5 D4 D3 D2 D1 D0 BUSY ACKNLG PAPER OUT SELECT ERROR --SLCT IN INIT AUTO FEED STROBE

Esquema eletrnico da placa de LEDs. Analisar o circuito utilizado para testes de sada no laboratrio.

33

Laboratrio de Microprocessadores

Wilson Ruiz

Sugesto de uma placa para testes de entrada e sada da porta paralela (caso haja interesse do leitor/aluno na sua montagem). 2.48 Sada de dados com comando do DEBUG. Porta paralela sada, endereo 0378h (vide tabela anterior). Conectar a placa de LEDs na porta paralela e digitar os comandos: O 0378 FF O 0378 00 O 0378 55 O 0378 AA

Analisar a sada de cada um desses comandos (status dos LEDs). 2.49 Entrada de dados com o comando do DEBUG. Porta paralela entrada, endereo 0379h (vide tabela anterior). Digitar o comando: - I 0379 ## 34

Laboratrio de Microprocessadores

Wilson Ruiz

Analisar a resposta (lembrar que o bit D7 lido invertido pelo sistema, os bits D2, D1 e D0 no esto disponveis sendo sempre iguais a 1 e para pinos da entrada em aberto, temos atribudo o nvel lgico 1 ). 2.50 Sada de dados em assembly. Digitar e executar instruo: MOV MOV OUT INT o programa estabelecendo um break pointer na ltima

AL, 0F DX, 0378 DX, AL 20

Avaliar a resposta (status dos LEDs). Repetir a execuo do programa anterior para outros bytes de sada (sem a necessidade do break pointer). 2.51 Entrada de dados em assembly. Usar o comando R para estabelecer AX=0000. Digitar e executar instruo: o programa estabelecendo um break pointer na ltima

MOV DX, 0379 IN AL, DX INT 20 Avaliar a resposta (contedo de AL). 2.52 Sub-rotinas Digitar o programa: : 0100 MOV DL, 41 MOV CX, 000A CALL 0200 LOOP 0105 INT 20 MOV AH, 02 ;continua... 35

: 0200

Laboratrio de Microprocessadores

Wilson Ruiz

INT INC RET

21 DL

Executar e analisar o seu funcionamento. 2.53 Exerccio Modificar o programa anterior para o mesmo a apresentar na tela a lista de todos os 255 caracteres ASCII. 2.54 Sub-rotina clssica usada para temporizao ( pausa ou delay). Analisar o funcionamento do exemplo de sub-rotina a seguir: PUSH PUSH MOV MOV DEC JNZ DEC JNZ POP POP RET CX DX CX, 00FF DX, 00FF DX L1 CX L2 DX CX

L2: L1:

Esta rotina fornece uma temporizao proporcional a multiplicao dos dois loops. Sempre conveniente salvar os valores anteriores dos registradores na pilha operacional, no incio de uma sub-rotina e recupera-los no final, antes da instruo RET; isso torna a sub-rotina transparente para o programa principal, evitando a superposio de dados. A exceo a esta regra est em determinadas aplicaes onde a sub-rotina deve fornecer algum resultado para o programa principal e este armazenado em um registrador. O valor do delay deve se ajustado (experimentalmente) para cada caso, pois alm das caractersticas da aplicao, existe diferenas no clock de cada microcomputador, assim de boa prtica, iniciar os testes com valores pequenos para os registradores que controlam os loops pois, se houver exagero, a mquina poder ficar presa em um loop de programa durante muito tempo. 36

Laboratrio de Microprocessadores

Wilson Ruiz

2.55 Exemplo de um programa com temporizao. Digitar, executar e analisar o funcionamento do programa: : 0100 MOV MOV OUT CALL MOV OUT CALL INT DX, 0378 AX, 00FF DX, AL 0200 AX, 0000 DX, AL 0200 20

: 0200

PUSH CX PUSH DX MOV CX, 0FFF MOV DX, FFFF DEC DX JNZ 0208 DEC CX JNZ 0205 POP DX POP CX RET

; se necessrio ajustar o delay para o clock ; do microcomputador do laboratrio ; trocando os valores carregados nos ; registradores CX e DX

2.56 Loop infinito Se substituirmos o INT 20 do programa principal, do item anterior, pela instruo JMP 0100, teramos como resultado os LEDs piscando seguidamente, porm este programa assim entraria em um loop infinito ou seja, s sai com o RESET da mquina. Durante o projeto e testes de programas devemos tomar cuidado com essa perigosa situao pois, ela pode levar-nos a perder um bom tempo de trabalho. Para evitar o loop infinito e poder ver os LEDs da placa piscando, altere o programa anterior (bloco principal) introduzindo um contador decrescente de operaes, que terminar este programa quando seu contedo for igual a zero (cuidado com o valor inicial desse contador para no perder um longo tempo aguardando o trmino do programa). Nomear e gravar este programa.

37

Laboratrio de Microprocessadores

Wilson Ruiz

2.57 Exemplo de um programa de controle com temporizao. Digitar, executar e analisar o funcionamento do programa: : 0100 MOV MOV MOV OUT CALL MOV OUT CALL DEC JNZ INT DX, 0378 BL, 0F AX, 00FF DX, AL 0200 AX, 0000 DX, AL 0200 BL 0105 20 ; valor inicial do contador ajustado para ; 15 piscadas

; decrementa contador ; se contador maior que zero continua ;continua na prxima pgina

: 0200

PUSH CX PUSH DX MOV CX, 0FFF MOV DX, FFFF DEC DX JNZ 0208 DEC CX JNZ 0205 POP DX POP CX RET

; se necessrio ajustar o delay para o ; clock do microcomputador do ; laboratrio trocando os valores ; carregados nos registradores ;CX e DX

2.58 Projeto 1 Escrever um programa que possibilite escolher uma, dentre trs seqncias de acendimento diferentes para os LEDs da placa. Cada seqncia deve ser escolhida atravs de uma tecla diferente previamente definida. Esta seqncia deve ser executada durante um tempo determinado. Incluir uma quarta tecla para o caso de sada do programa (tecla de escape). DICAS PARA O PRIMEIRO PROJETO 1. Primeiramente escrever o algoritmo do programa, envolvendo o programa principal e todas as sub-rotinas.

38

Laboratrio de Microprocessadores

Wilson Ruiz

2. No papel, transcrever para o assembly inicialmente todas as sub-rotinas e s ento o programa principal (essa forma de programao contribui para uma maior clareza do problema ajudando tambm na deteco de erros). 3. Como sugesto de uma boa soluo para esse projeto, a estrutura final deve possuir as seguintes caractersticas: - Uma ou mais sub-rotinas de pausa, para controlar a freqncia de acendimento dos LEDs. - Contadores para temporizar cada efeito escolhido. - Uma sub-rotina para cada efeito. - O acesso a essas sub-rotinas ser definido por comparao dos bytes ASCII das teclas acionas. - Utilizar instrues PUSH e POP quando necessrio.

4. Aps digitar o programa principal, digitar tambm todas as sub-rotinas seqencialmente, criando blocos de instrues no colados, mas sempre separados de mltiplos de 3 bytes (assim ser mais fcil introduzir desvios no programa, para eventuais alteraes sem a necessidade de uma nova digitao integral), isso conseguido digitando-se instrues NOP entre os blocos (instruo de apenas um byte e que no realiza nenhuma funo). 5. Gravar o programa e executa-lo a partir do DOS. 6. Esta estrutura, muito se aproxima, da maioria dos projetos de controle dessa disciplina. 7. Apresentar o resultado para o Professor da disciplina. 2.59 Projeto 2 Alterar o programa anterior incluindo a apresentao de mensagens na tela durante a sua execuo. Apresentar o resultado para o Professor da disciplina. 2.60 Projeto 3 Escrever um programa para temporizar um evento a cada 15 segundos (piscar de um LED na porta paralela ou caractere enviado para a tela) Nesta primeira soluo usar uma sub-rotina de delay ajustada experimentalmente e/ou calculada levando-se em conta o nmero de ciclos de 39

Laboratrio de Microprocessadores

Wilson Ruiz

mquina de cada instruo, a quantidade de loops executados nesta e o tempo de execuo do programa principal. Apresentar o resultado para o Professor da disciplina. 2.61 Projeto 4 Repetir o projeto anterior porm tendo como soluo a leitura do relgio interno do microcomputador. Como sugesto fornecido o seguinte algoritmo simplificado: 1. Ler relgio (segundos). 2. Somar 0Fh ao valor dos segundos. 3. Se soma > 2Ch (2Ch = 44 , 59 15 = 44) subtrair 3Ch ( = 60) criando o valor referncia. 4. Ler relgio 5. Comparar valor lido com o valor referncia. 6. Se menor v para 4. 7. Ler relgio. 8. Piscar LED. 9. Testar tecla de sada. 10. Vai para 2. Apresentar o resultado para o Professor da disciplina. 2.62 Exemplo de controle de um motor de passo. A figura mostra o smbolo de um motor de passo genrico.

Onde A, A, B e B so chamadas fases do motor. 40

Laboratrio de Microprocessadores

Wilson Ruiz

A seguir mostrado o esquema eletrnico de um circuito de drive genrico, para um motor unipolar de seis fios, sem mostrar os acopladores pticos (esse esquema dever ser adaptado ao motor utilizado).

Tabela verdade de c ontrole do conjunto drive + acopladores pticos + motor de passo: Observao: As fases A, B, A e B so acionadas pelos bits D3, D2, D1 e D0 respectivamente (conforme ligaes do cabo utilizado).

Passo 1 Passo 2 Passo 3 Passo 4

Fase A 1 1 1 0

Fase B 1 1 0 1

Fase A 1 0 1 1

Fase B 0 1 1 1

Byte #Eh #Dh #Bh #7h

Para fazermos o motor girar no sentido horrio devemos seguir a tabela anterior na ordem apresentada (..., passo 1, passo 2, passo 3, passo4, passo 1, passo 2, ...) e para invertemos o sentido de rotao, devemos tambm inverter o sentido de leitura da tabela (..., passo 4, passo 3, passo 2, passo 1, passo 4, passo 3, ...). O motor utilizado possui uma resoluo de 1,8o /passo ou 200 passos/revoluo assim, para esse programa exemplo, optaremos por um controle de trs voltas, portanto temos 200 x 3 = 600 passos (em decimal) que equivale a 258h. O intervalo de tempo entre cada passo controla a velocidade (maior velocidade equivale a um menor intervalo de tempo) sendo portanto necessria, a execuo de uma sub-rotina de pausa entre cada um dos passos. O valor dessa pausa depende das 41

Laboratrio de Microprocessadores

Wilson Ruiz

caractersticas de velocidade do microcomputador onde o programa est sendo executado e tem um limite inferior que equivale a mxima velocidade do motor, para este tipo de drive utilizado; sendo que aps esse valor o motor comea a perder passos e assim tem o seu torque drasticamente diminudo, preciso comprometida e at em um caso extremo, o sentido de rotao invertido. Conectar o motor (ou a placa de LEDs) no microcomputador. Digitar o programa exemplo: : 0100 MOV DX, 0378 MOV CX, 0258 MOV OUT CALL DEC JZ MOV OUT CALL DEC JZ MOV OUT CALL DEC JZ MOV OUT CALL DEC JZ JMP INT : 0150 PUSH PUSH MOV MOV DEC JNZ AL, EE DX, AL 0150 CX 012C AL, DD DX, AL 0150 CX 012C AL, BB DX, AL 0150 CX 012C AL, 77 DX, AL 0150 CX 012C 0106 20 CX DX CX, 04FF DX, 04FF DX 0158

;Ajustar para a velocidade do ;microcomputador utilizado. ;continua... 42

Laboratrio de Microprocessadores

Wilson Ruiz

DEC JNZ POP POP RET

CX 0155 DX CX

Executar e analisar o funcionamento do programa anterior. Salvar o programa. Este no o nico formato de um programa para controlar um motor de passo (nem o mais elegante ou eficiente), porm tem como vantagem uma estrutura bastante didtica. 2.63 Exerccio. Executar o programa anterior alterando a velocidade e o sentido de rotao. Testar a velocidade limite do motor usado. 2.64 Exerccio. Modifique o programa anterior para utilizar as instrues de rotao de bytes (consultar a tabela de instrues), para obter um programa menor e mais bem elaborado. Salvar o programa. 2.65 Projeto 5. Escrever um programa que possibilite comandar, atravs do teclado, o sentido de rotao do motor e a sua velocidade alm de enviar m ensagens correspondentes para a tela. revolues. Este programa deve possuir uma tecla de escape e/ou um contador de

Salvar o programa. Apresentar o resultado para o Professor da disciplina.

43

Laboratrio de Microprocessadores

Wilson Ruiz

2.66 Projeto 6. Escrever um programa que faa a eitura das chaves de fim de curso do kit de l motor de passo utilizado no laboratrio e execute movimentos com as seguintes caractersticas: 1. Inicie o movimento, em um determinado sentido, na mxima velocidade. 2. Ao se aproximar da chave de fim de curso, diminua de velocidade. 3. Ao acionar a chave de fim de curso, inverta o sentido de rotao agora, com mxima velocidade. 4. Repita o item 2, para esse sentido de movimento. 5. Entre em loop. revolues. Este programa deve possuir uma tecla de escape e/ou um contador de

Salvar o programa. Apresentar o resultado para o Professor da disciplina. 2.67 Projeto 7. Uma outra forma de controlarmos um motor de passo a sua utilizao no modo chamado meio passo que possui uma maior preciso de movimento porm um menor torque e uma menor velocidade mxima. Esse modo de operao conseguido atravs da seguinte tabela: Fase A 1 1 1 1 1 0 0 0 Fase B 1 1 1 0 0 0 1 1 Fase A 1 0 0 0 1 1 1 1 Fase B 0 0 1 1 1 1 1 0 Byte #Eh #Ch #Dh #9h #Bh #3h #7h #6h

Passo 1 Passo 2 Passo 3 Passo 4 Passo 5 Passo 6 Passo 7 Passo 8

Modificar um dos programas dos projetos anteriores para que o motor trabalhe no modo meio passo. Salvar o programa. Apresentar o resultado para o Professor da disciplina. 44

Laboratrio de Microprocessadores

Wilson Ruiz

CAPTULO 3 PRTICA COM O TASM

3.1 O Turbo Assembler Introduo. Para que possamos criar um programa, neste novo ambiente, precisamos usar algumas novas ferramentas: Primeira: Um editor de texto, para criar o programa fonte. Segunda: Um montador, isto , um programa que ir transformar o fonte em um programa objeto. Terceira: Um linker (ligador) que ir gerar o programa executvel a partir do programa objeto. O editor pode ser qualquer um disponvel (vamos usar o NE Norton Editor, escolhido pela sua simplicidade e caracterstica de gravao do texto sempre em caracteres ASCII). O montador ser o TASM, Turbo Assembler da Borland. O linker ser o TLINK, tambm da Borland. Devemos criar os programas fonte com a extenso .ASM (obrigatrio) para que o TASM reconhea e o transforme no programa objeto, sendo este um "formato intermedirio", assim chamado porque ainda no um programa executvel e to pouco u m programa fonte. O linker gera a partir de um programa objeto (com extenso .OBJ), ou da combinao de vrios deles, um programa executvel, cuja extenso normalmente .EXE (ao contrrio do DEBUG), embora possa ser .COM, dependendo da forma como este for montado e ligado. Os arquivos .EXE so organizados em mltiplos segmentos individuais e separados, enquanto os arquivos .COM contem somente um segmento, o qual inclui todos os dados e cdigos das instrues. H vantagens em ambos tipos de arquivos. Por exemplo, os de estrutura .COM evitam o tempo de carga necessrio para a identificao de segmentos separados, enquanto os arquivos .EXE podem acomodar aplicaes muito maiores. 45

Laboratrio de Microprocessadores

Wilson Ruiz

3.2 Diretivas Conceitos bsicos. Para construirmos os programas com o TASM, devemos estruturar o fonte de uma forma diferenciada da empregada no programa DEBUG. Para isso usamos pseudoinstrues ou diretivas que a princpio so instrues utilizadas pelo compilador e linker e no so executadas pelo processador do sistema. As diretivas assembly mais importantes usadas no TASM so: DOSSEG Informa ao linker (ligador) que os segmentos devem ser agrupados seguindo a mesma ordem adotada pelo sistema operacional. .MODEL SMALL Define o meio de memria a usar em nosso programa. Todo o cdigo estar em um segmento, enquanto os dados estaro em outro. Todos os desvios e referncias memria so do tipo Near (dentro do segmento) isto , afetaro apenas o IP. .DATA Marca o incio do segmento de dados, onde todas as variveis, tabelas e mensagens do programa devem ser colocadas. .CODE Marca o incio do segmento de cdigo do programa. No caso de o programa ter mais de um segmento de cdigo, deve-se especificar um nome. Essa diretiva pode aparecer diversas vezes no programa, pois o montador unir todos os diferente blocos com o mesmo nome para formar um nico segmento de cdigo. .STACK Reserva espao de memria para as instrues de programa na pilha. Concatena todos os segmentos com o mesmo nome para formar o segmento de pilha. Na carga do programa, o registrador SS estar automaticamente apontando para esse segmento, e o SP estar posicionado no fim. PUBLIC Concatena todos os segmentos com o mesmo nome para formar um nico segmento contnuo. PROC Declarao usada para definir um bloco de instrues. ENDP Declarao que termina o bloco de instrues definido por PROC.

46

Laboratrio de Microprocessadores

Wilson Ruiz

END Marca o fim do programa-fonte. Tudo o que for colocado aps esse ponto ser ignorado pelo mont ador. EQU Usada para criar equivalncias, atribuindo valores a smbolos DB Usada para dados, aloca espao do tamanho de um byte para cada elemento definido. Pode ser usada para criar variveis, tabelas e mensagens. DW Usada para dados, aloca espao do tamanho de dois para cada elemento definido. Pode ser usada para criar variveis, tabelas e mensagens. 3.3 Segmentos A arquitetura dos processadores das famlias Intel 80x86, 80x88 e Pentium, foranos a usar segmentos de memria para gerenciar a informao sendo o tamanho destes segmentos de 64Kbytes. A justificativa do uso destes segmentos est relacionada ao fato do maior valor numrico possvel de ser diretamente processado, (limitado a capacidade dos registradores de 16 bits - caracterstica original dos processadores de terceira gerao) ser uma palavra de 16 bits (tamanho dos registradores); no sendo assim possvel, o acesso a mais de 65536 endereos (64 Kbytes) da memria, usando-se para endereamento, apenas um destes registradores internos. Sendo a memria do PC dividida em grupos de segmentos, cada qual com no mximo, 65536 endereos (64 Kbytes), assim podemos usar um registrador exclusivo para enderear o incio de um determinado segmento, e ainda acessar uma posio desejada dentro desse, usando-se outro registrador, possibilitando dessa maneira, o acesso a quantidades muito maiores de memria. Desta forma, para que o montador seja capaz de gerenciar os dados, se faz necessrio que cada informao ou instruo se encontre na rea correspondente ao seu segmento. O endereo do segmento fornecido ao montador pelos registradores DS, ES, SS e CS escolhidos conforme o tipo da informao. Observando como uma instruo apresentada no DEBUG: 1CB0:0102 MOV AX,BX O primeiro nmero 1CB0, corresponde ao segmento de memria que est sendo usado, o segundo uma referncia ao endereo no interior do segmento, um deslocamento dentro deste, chamado offset. 47

Laboratrio de Microprocessadores

Wilson Ruiz

O modo usado para indicar ao montador quais segmentos so usados empregando as diretivas .CODE, .DATA e .STACK. O montador ajusta o tamanho dos segmentos (mximo de 64 Kbytes) tomando como base o nmero de bytes que cada instruo assembly precisa, pois seria um desperdcio de memria, usar segmentos inteiros para armazenar pequenos programas. Por exemplo, se um programa necessita de apenas 10Kbytes para armazenar dados, o segmento de dados ser apenas de 10Kbytes e no de 64Kbytes. 3.4 Construo de um programa passo-a-passo em assembly. Leia atentamente todas as explicaes. Primeiro passo: Use qualquer editor de texto para criar o programa fonte. Entre com as seguintes linhas do exemplo1.asm (nome com no mximo 8 caracteres e sem espao). ;Ateno: use ; para fazer comentrios em programas assembly. ;Para o compilador indiferente o uso de letras maisculas ou minsculas na escrita ;das instrues. ; muito importante manter uma boa esttica durante a digitao do programa ;fonte, pois assim ficar mais fcil o seu futuro estudo e/ou a procura de eventuais ;erros. Normalmente emprega-se um tab entre o primeiro e o segundo token ;(smbolo) de cada instruo e digita-se o texto com as instrues alinhadas linha;a-linha, a uma certa distncia do lado esquerdo da tela (o que facilita a colocao ;dos labels para os desvios). ;O TASM possibilita a manipulao de valores numricos das formas mostradas nos ;exemplos seguintes: ; ; ; ; ; ; ; ; ; ; MOV AL, 55 MOV AL, 55h MOV AL, 5Fh MOV AL, 0F5h ;o valor 55 est em decimal. ;o valor 55h est em hexadecimal. ;o valor 5F est em hexadecimal (a ausncia do h no ;token, leva a um erro de compilao). ;o valor F5h est em hexadecimal ms s ;reconhecido como um valor numrico se iniciar-se ;com um caractere numrico (a ausncia do 0 no ;token, leva a um erro de compilao). ;o token @ refere-se ao cdigo ASCII do caractere ;@ isto 40h (vide tabela).

MOV AL, @

48

Laboratrio de Microprocessadores

Wilson Ruiz

;exemplo1.asm .MODEL SMALL .STACK .CODE MOV MOV INT MOV INT END AH, 01h CX, 07h 10h AH,4Ch 21h ;modelo de memria escolhido ;espao de memria para instrues do programa na pilha ;as linhas seguintes so instrues do programa ;move o valor 01h para o registrador ah ;move o valor 07h para o registrador cx ;interrupo 10h ;move o valor 4ch para o registrador ah ;interrupo 21h ;finaliza o cdigo do programa

Segundo passo: Salvar o arquivo com o seguinte nome: exemplo1.asm ( necessrio a extenso .asm). No esquecer de salv-lo no formato ASCII (caso exista essa opo no editor de texto utilizado). Terceiro passo: Usar o programa TASM para construir o programa objeto, digitando no sinal de prompt do DOS o seguinte comando: C:\>tasm exemplo1.asm Caso no existam erros na compilao, so exibidas na tela, as seguintes mensagens: Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland International Assembling file: exemplo1.asm Error messages: None Warning messages: None Passes: 1 Remaining memory: 471k C:\> Observao: O TASM s pode criar programas no formato .OBJ, que ainda no podem ser executados. 49

Laboratrio de Microprocessadores

Wilson Ruiz

Quarto passo: Usar o programa TLINK para criar o programa executvel digitando no sinal de prompt do DOS o seguinte comando: C:\>tlink exemplo1.obj Onde, exemplo1.obj o nome do programa intermedirio, .OBJ. O comando acima gera diretamente o arquivo com o nome do programa intermedirio e a extenso .EXE. opcional a colocao da extenso .OBJ no comando. Caso no existam erros durante o processo de linker, exibida na tela a seguinte mensagem: Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International C:\> Quinto passo: Executar o programa criado digitando seu nome (no necessria a extenso) diretamente no sinal de prompt do DOS: C:\>exemplo1 Este programa assembly muda o tamanho do cursor no DOS. Para voltar ao cursor normal, retorne ao windows e aps novamente ao DOS. 3.5 Exemplos de programas. Nesta seo so mostrados vrios exemplos de programas para serem montados e ligados com o TASM e o TLINK da Borland, com o objetivo de familiarizar o leitor/aluno com as caractersticas mais usuais desse ambiente de programao. Leia atentamente as explicaes fornecidas, analise o funcionamento de todos os programas, principalmente os detalhes relacionados as diferenas estruturais e diretivas empregadas. Digite, salve, compile ligue e execute alguns dos programas fornecidos, lembrando que muitos so parecidos com os executados via DEBUG. Por uma questo de tempo fica opcional, a digitao das explicaes que acompanham os cabealhos e instrues dos exemplos sendo estas porm, importantes para a documentao dos programas criados nos projetos propostos.

50

Laboratrio de Microprocessadores

Wilson Ruiz

;exemplo2.asm .MODEL SMALL .STACK .CODE MOV AH, 2h MOV DL, 2Ah INT 21h MOV AH, 4ch INT 21h END ;move o valor 2h para o registrador ah ;move o valor 2ah para o registrador dl ;( o valor ASCII do caractere *) ;interrupo 21h ;funo 4ch, sai para o sistema operacional ;interrupo 21h ;finaliza o programa

Este programa imprime o caractere * na tela. ;exemplo3.asm ;Ateno para o uso de LABELs seguidos de : (dois pontos) para indicar os ;endereos de desvios. .MODEL SMALL .STACK .CODE MOV INT MOV SUB CMP JLE SUB digit1: MOV SHL INT SUB CMP JLE SUB digit2: ADD MOV INT END AH, 1h 21h DL, AL DL, 30h DL, 9h digit1 DL, 7h CL, 4h DL, CL 21h AL, 30h AL, 9h digit2 AL, 7h DL, AL AH, 4Ch 21h ;Funo 1 do DOS ;l o caractere e retorna o cdigo ASCII ao registrador AL ;move o cdigo ASCII para o registrador DL ;subtrai de 30h para converter a um dgito de 0 a 9 ;compara se o dgito est entre 0 e 9 ;se verdadeiro obtm o primeiro nmero (4 bits) ;se falso, subtrai de 7h para converter a uma letra (A a F) ;prepara para multiplicar por 16 ;multiplica para converter dentro dos 4 bits mais altos ;obtm o prximo caractere ;repete a operao de converso ;compara o valor 9h com o contedo do registrador AL ;se verdadeiro, obtm o segundo dgito ;se falso, subtrai de 7h ;adiciona o segundo dgito ;funo 4Ch do DOS (exit) ;interrupo 21h ;finaliza o programa 51

Laboratrio de Microprocessadores

Wilson Ruiz

Este programa l dois caracteres e os imprime na tela ;exemplo4.asm ;Ateno para o uso de caracteres em decimal (sem h acompanhando o nmero), e ;caracteres ASCII (entre aspas) representando o cdigo correspondente. ;Ateno para o uso obrigatrio das diretivas PROC e ENDP para iniciar e finalizar ;um procedimento ou sub-rotina. ;Ateno para o uso do caractere _ (underline) para o nome de procedimentos; ;no permitido o uso de espao para tal. .MODEL SMALL .STACK .CODE PRINT_A_J PROC ;move o cdigo ASCII (byte) do caractere A para o ;registrador DL ;move o valor decimal 10 para o registrador CX ;este valor usado para fazer lao com 10 interaes ;Imprime o caractere em DL ;Incrementa o valor do registrador DL ;Lao para imprimir 10 caracteres ;Funo 4Ch, para sair ao DOS ;Interrupo 21h ;Finaliza o procedimento

MOV DL, 'A' MOV CX, 10 PRINT_LOOP: CALL WRITE_CHAR INC DL LOOP PRINT_LOOP MOV AH, 4Ch INT 21h PRINT_A_J WRITE_CHAR MOV AH, 2h INT 21h RET WRITE_CHAR END PRINT_A_J ENDP ENDP PROC

;Funo 2h, imprime caractere ;Imprime o caractere que est em DL ;Retorna o controle ao procedimento que chamou ;Finaliza o procedimento ;Finaliza o programa

Este programa mostra os caracteres ABCDEFGHIJ na tela.

52

Laboratrio de Microprocessadores

Wilson Ruiz

;.................................................................................................................................................. ; exemplo5.asm ; Ateno para os cabealhos ; Ateno para o uso da diretiva PUBLIC ;.................................................................................................................................................. .MODEL SMALL .STACK .CODE TEST_WRITE_HEX PROC MOV CALL MOV INT DL, 3Fh WRITE_HEX AH, 4CH 21h ;Move o valor 3Fh para o registrador DL ;Chama a sub-rotina ;Funo 4Ch ;Retorna o controle ao DOS ;Finaliza o procedimento

TEST_WRITE_HEX ENDP

PUBLIC WRITE_HEX ;.................................................................................................................................................. ; Este procedimento converte para hexadecimal o byte ; armazenado no registrador DL e mostra o dgito ; Use:WRITE_HEX_DIGIT ;.................................................................................................................................................. WRITE_HEX PROC PUSH CX PUSH DX MOV DH, DL MOV SHR CALL MOV AND CALL POP POP RET CX, 4 DL, CL WRITE_HEX_DIGIT DL, DH DL, 0Fh WRITE_HEX_DIGIT DX CX ;envia para pilha o valor do registrador CX ;envia para pilha o valor do registrador DX ;move o valor do registrador DL para o ;registrador DH ;move o valor 4 para o registrador CX ;mostra na tela o primeiro nmero hexadecimal ;move o valor do registrador DH para o ;registrador DL ;mostra na tela o segundo nmero hexadecimal ;retorna da pilha o valor do registrador DX ;retorna da pilha o valor do registrador CX ;retorna o controle ao procedimento que ;chamou

WRITE_HEX ENDP PUBLIC WRITE_HEX_DIGIT 53

Laboratrio de Microprocessadores

Wilson Ruiz

;.................................................................................................................................................. ; Este procedimento converte os 4 bits mais baixos do registrador DL ; para um nmero hexadecimal e o mostra na tela do computador ; Use: WRITE_CHAR ;.................................................................................................................................................. WRITE_HEX_DIGIT PROC PUSH DX CMP DL, 10 JAE HEX_LETTER ADD DL, "0" JMP Short WRITE_DIGIT HEX_LETTER: ADD DL, "A"-10 WRITE_DIGIT: CALL WRITE_CHAR POP DX RET WRITE_HEX_DIGIT ENDP PUBLIC WRITE_CHAR ;.................................................................................................................................................. ; Este procedimento imprime um caractere na tela usando o DOS ;.................................................................................................................................................. WRITE_CHAR PROC PUSH MOV INT POP RET AX AH, 2h 21h AX ;Envia para pilha o valor do registrador AX ;Funo 2h ;Interrupo 21h ;Extrai da pilha o valor de AX ;Retorna o controle ao procedimento que ;chamou ;envia para pilha o valor de DX ;compara se o nmero de bits menor ;do que 10 ;se no, salta para HEX_LETER ;se sim, converte para nmero ;escreve o caractere ;converte um caractere para hexadecimal ;imprime o caractere na tela ;Retorna o valor inicial do registrador DX ;para o registrador DL ;Retorna o controle ao procedimento que ;chamou

WRITE_CHAR ENDP END TEST_WRITE_HEX ;Finaliza o programa

Este programa faz a converso de bytes em caracteres correspondentes impressos na tela do monitor.

54

Laboratrio de Microprocessadores

Wilson Ruiz

;.................................................................................................................................................. ; exemplo6.asm ;.................................................................................................................................................. .MODEL SMALL .STACK .CODE TEST_WRITE_DECIMAL PROC MOV DX, 12345 CALL WRITE_DECIMAL MOV AH, 4CH INT 21h ;Move o valor decimal 12345 para o ;registrador DX ;Chama o procedimento ;Funo 4Ch ;Interrupo 21h

TEST_WRITE_DECIMAL ENDP ;Finaliza o procedimento PUBLIC WRITE_DECIMAL ;.................................................................................................................................................. ; Este procedimento escreve um nmero de 16 bits como um nmero ; sem sinal em notao decimal ; Use: WRITE_HEX_DIGIT ;.................................................................................................................................................. WRITE_DECIMAL PROC PUSH AX PUSH CX PUSH DX PUSH SI MOV AX, DX MOV SI, 10 XOR CX, CX NON_ZERO: XOR DX, DX DIV SI PUSH DX INC CX OR AX, AX JNE NON_ZERO WRITE_DIGIT_LOOP: POP DX CALL WRITE_HEX_DIGIT LOOP WRITE_DIGIT_LOOP END_DECIMAL: POP SI ;Envia para pilha o valor do registrador AX ;Envia para pilha o valor do registrador CX ;Envia para pilha o valor do registrador DX ;Envia para pilha o valor do registrador SI ;move o valor do registrador DX para AX ;move o valor 10 para o registrador SI ;zera o registrador CX ;zera o registrador DX ;diviso entre SI ;Envia para a pilha o valor do registrador DX ;incrementa CX ;no zero ;salta para NON_ZERO ;Retorna o valor em modo reverso ;Chama o procedimento ;loop ;retorna da pilha o valor do registrador SI 55

Laboratrio de Microprocessadores

Wilson Ruiz

POP POP POP RET

DX CX AX

;retorna da pilha o valor do registrador DX ;retorna da pilha o valor do registrador CX ;retorna da pilha o valor do registrador AX ;retorna o controle ao procedimento que ;chamou ;Finaliza o procedimento

WRITE_DECIMAL ENDP

PUBLIC WRITE_HEX_DIGIT ;................................................................................................................................................., ; Este procedimento converte os 4 bits mais baixos do registrador DL ; num nmero hexadecimal e os imprime ; Use: WRITE_CHAR ;.................................................................................................................................................. WRITE_HEX_DIGIT PROC PUSH DX CMP DL, 10 JAE HEX_LETTER ADD DL, "0" JMP Short WRITE_DIGIT HEX_LETTER: ADD DL, "A"-10 WRITE_DIGIT: CALL WRITE_CHAR POP DX RET WRITE_HEX_DIGIT ENDP PUBLIC WRITE_CHAR ;.................................................................................................................................................. ; Este procedimento imprime um caractere na tela usando uma funo DOS ;.................................................................................................................................................. WRITE_CHAR PROC PUSH MOV INT POP RET AX AH, 2h 21h AX ;Envia para pilha o valor do registrador AX ;Funo 2h ;Interrupo 21h ;Retorna da pilha o valor inicial do registrador ;AX ;Retorna o controle ao procedimento que ;chamou 56 ;Envia para pilha o valor do registrador DX ;Compara o valor 10 com o valor do ;registrador DL ;se no, salta para HEX_LETER ;se sim, converte em dgito numrico ;escreve o caractere ;converte um caractere para um nmero ;hexadecimal ;mostra o caractere na tela ;Retorna o valor inicial para o registrador DL ;Retorna o controle ao procedimento que ;chamou

Laboratrio de Microprocessadores

Wilson Ruiz

WRITE_CHAR ENDP END TEST_WRITE_DECIMAL ;finaliza o programa

Este programa mostra na tela os nmeros 12345 ;.................................................................................................................................................. ; exemplo7.asm ;.................................................................................................................................................. .MODEL SMALL .STACK .CODE PRINT_ASCII MOV DL, 00h MOV CX, 255 PRINT_LOOP: CALL WRITE_CHAR INC DL LOOP PRINT_LOOP MOV AH, 4Ch INT 21h PRINT_ASCII WRITE_CHAR MOV AH, 2h INT 21h RET WRITE_CHAR ENDP ENDP PROC ;Funo 2h para imprimir um caractere ;Imprime o caractere que est em DL ;Retorna o controle ao procedimento que ;chamou ;Finaliza o procedimento ;Finaliza o programa PROC ;move o valor 00h para o registrador DL ;move o valor decimal 255 para o registrador ;CX usado para fazer um lao com 255 ;interaes ;Chama o procedimento que imprime ;Incrementa o valor do registrador DL ;Loop para imprimir 10 caracteres ;Funo 4Ch ;Interrupo 21h ;Finaliza o procedimento

END PRINT_ASCII

Este programa mostra na tela o valor dos 256 caracteres do cdigo ASCII.

57

Laboratrio de Microprocessadores

Wilson Ruiz

;************************************************************************* ; exemplo8.asm ; Descrio: Exemplo do uso do TASM com mensagens na tela e aplicao ; das diretivas: .DATA, EQU, DB e DW ;************************************************************************* ;nome do programa: exemplo8.asm CR EQU 13 LF EQU 10 DOSSEG .MODEL SMALL .STACK .DATA ;ASCII Carriage Return ;ASCII Line Feed

;************************************************************************* ; REGIO DE DEFINIO DE VARIVEIS ;************************************************************************* CONTADOR DB 00H ;estabelece o valor inicial do contador de ;nmero de vezes que a tecla pressionada ;************************************************************************* ; REGIO DE DEFINIO DE CONSTANTES ;************************************************************************* MENS_INICIAL DB cr,lf,lf,'>> PROGRAMA EXEMPLO 8 << ' DB cr,lf,lf,'Tecla a (minuscula) para prosseguir' DB cr,lf,lf,'tecla s (minuscula) para sair$' MENS_FINAL DB cr,lf,lf,'>> PROGRAMA FINALIZADO <<' DB cr,lf,lf,'------- TCHAU!! -------$' MENS_1 MENS_2 MENS_3 DB cr,lf,lf,'Voce pessionou "a" pela primeira vez$' DB cr,lf,lf,'Voce pressionou "a" pela segunda vez$' DB cr,lf,lf,'Voce pressionou "a" pela terceira e ultima vez$'

.CODE EXEMPLO_8 PROC mov ax, @data mov ds, ax mov es, ax cld call L2: mov int ESCREVE_INICIO ah, 08h 21h

;seqncia necessria para mensagens na tela ;inicializa o registradores de segmento ;DS e CS ;reseta flag de direo

;leitura de teclado sem eco 58

Laboratrio de Microprocessadores

Wilson Ruiz

cmp jnz call jmp L1: cmp jz jmp L3: call mov int EXEMPLO_8

al, 61h L1 MENSAGENS L2 al, 73h L3 L2 ESCREVE_FINAL ah, 4ch 21h ENDP

;verifica tecla "A" minscula

;verifica tecla "S" minscula

;************************************************************************* ; subrotina: ESCREVE_INICIO ; Escreve mensagem inicial ;************************************************************************* PUBLIC ESCREVE_INICIO ESCREVE_INICIO PROC push ax push dx mov ah, 09h lea dx, MENS_INICIAL ;carregar o endereo externo int 21h ;(EA=endereo inicial da mensagem) pop dx ;para o registrador pop ax ret ESCREVE_INICIO ENDP ;*********************************************************** ; subrotina: ESCREVE_FINAL ; Escreve mensagem final ;*********************************************************** PUBLIC ESCREVE_FINAL ESCREVE_FINAL PROC push ax push dx mov ah, 09h lea dx, MENS_FINAL ;carregar o endereo externo int 21h ;(EA=endereo inicial da mensgem) pop dx ;para o registrador pop ax ret ESCREVE_FINAL ENDP

59

Laboratrio de Microprocessadores

Wilson Ruiz

;*********************************************************** ; subrotina: MENSAGENS ; Escreve mensagem correspondente ao nmero de vezes ; que a tecla a pressionada. ;*********************************************************** PUBLIC MENSAGENS MENSAGENS PROC push ax push dx cmp CONTADOR, 00h jnz L10 mov ah, 09h lea dx, MENS_1 ;carregar o endereo externo int 21h ;(EA=endereo inicial da mensagem) ;para o registrador inc CONTADOR pop dx pop ax ret L10: cmp jnz mov lea int inc pop pop ret L11: cmp jnz mov lea int inc call mov int L12: CONTADOR, 01h L11 ah, 09h dx, MENS_2 21h CONTADOR dx ax CONTADOR, 02h L12 ah, 09h dx, MENS_3 21h CONTADOR ESCREVE_FINAL ah, 4ch 21h

;carregar o endereo externo ;(EA=endereo inicial da mensagem) ;para o registrador

;carregar o endereo externo ;(EA=endereo inicial da mensagem) ;para o registrador

pop dx pop ax ret MENSAGENS ENDP END 60

Laboratrio de Microprocessadores

Wilson Ruiz

3.6 Projetos com TASM Escrever novamente alguns dos programas referentes aos projetos (realizados anteriormente no DEBUG) listados a seguir, agora utilizando o TASM como ambiente de programao. Para conseguir enviar mensagens na tela nos projetos propostos, estudar o exemplo 8 anterior e outro fornecido no captulo 5 (programa ANA14.ASM) um projeto completo que trabalha com diversas telas, menus etc, concentrando sua ateno no emprego das diretivas EQU, DB e DW. Projeto 1 Projeto 2 Projeto 3 Projeto 4 Projeto 5 Projeto 6 Projeto 7 (item 2.56) (item 2.57) (item 2.58) (item 2.59) (item 2.63) (item 2.64) (item 2.65)

61

Laboratrio de Microprocessadores

Wilson Ruiz

CAPITULO 4 PROJETO DE UMA INTERFACE

4.1 Introduo: A participao em um projeto (mesmo de pequeno porte e com apenas uma finalidade didtica) muito importante para o aprendizado do aluno, pois somente atravs da montagem e da utilizao prtica de uma interface montada, ganha-se uma real experincia sobre as dificuldades envolvidas no projeto e na aplicao de um circuito para computador. Com o objetivo de iniciar os alunos nesta rea e com as dificuldades didticas inerentes da baixa carga horria dos cursos atuais que, inevitavelmente leva-nos a formas mais objetivas de ensinar, apresentado neste captulo, o projeto completo de uma placa de interface multi-uso ou multi I/O, que poder ser totalmente utilizado ou adaptado com facilidade, s necessidades e interesse do(s) aluno(s). Este contedo tem o objetivo de apenas iniciar o aluno e no portanto a pretenso de tentar esgotar to vasto assunto. Inicialmente so apresentadas caractersticas de hardware do PC relevantes ao projeto, seguido de informaes sobre os CIs mais importantes envolvidos e finalmente o esquema eletrnico. Para aplicaes que necessitem de mais informaes tcnicas sobre o hardware do PC, torna-se indispensvel consultar publicaes especializadas no assunto. 4.2 Mapa de endereamento de I/O O conhecimento do mapa de I/O parte fundamental que qualquer projeto de interface para o microcomputador padro IBM-PC. A figura seguinte apresenta as diversas faixas de endereos de I/O e seus respectivos dispositivos. OBS: A rapidez com que se oferecem placas de expanso para o PC implica na necessidade de uma constante atualizao dessa tabela.

62

Laboratrio de Microprocessadores

Wilson Ruiz

Endereos de 0000h a 000Fh de 0020h a 0021h de 0040h a 0043h de 0060h a 0063h de 0060h a 0064h de 0070h a 0071h de 0080h a 008Fh de 00A0h a 00A1h de 00C0h a 00DFh de 00F0h a 00FFh de 01F0h a 01FFh de 0200h a 020Fh de 0238h a 023Bh de 0278h a 027Fh de 02B0h a 02BFh de 02C0h a 02CFh de 02D0h a 02DFh de 02E8h a 02EFh de 02F8h a 02FFh de 0300h a 031Fh de 0320h a 032Fh de 0378h a 037Fh de 03C0h a 03CFh de 03D0h a 03DFh de 03E8h a 03EFh de 03F0h a 03F7h de 03F8h a 03FFh Acima de 0400h

Dispositivo Primeiro controlador de DMA (8237) Primeiro controlador de interrupes (8259) Temporizador programvel (8253) Interface paralela 8255 (XT) Controlador 8742 (AT) RAM CMOS e registrador de mscara NMI (AT) Registradores de paginao para DMA Segundo controlador de interrupes (AT) Segundo controlador de DMA (AT) Co-processador aritmtico (AT) Disco rgido (AT) Porta de jogos Mouse de barramento LPT2 Vdeo (EGA-VGA) Vdeo (EGA-VGA) Vdeo (EGA-VGA) COM4 COM2 Reservado para prottipos Disco rgido (XT) LPT1 Vdeo (EGA-VGA) Vdeo (CGA) COM3 Disco flexvel COM1 Projetos PCI

4.3 O SLOT ISA (Industry Standard Architecture) Apresentao: Os Slots padro ISA, so conectores de expanso do busde dados, busde endereos, busde controle e alimentao, que permitem a ligao de vrios tipos de perifricos placa da CPU, atravs de um conector de 62 pinos divididos em dois lados com 31 pinos cada e de outro com 36 pinos, divididos em dois lados com 18 pinos cada. As placas de perifricos que so ligadas nos slots so acessadas atravs do uso dos endereos reservados para esse fim no mapa de I/O. Esses sinais possuem nveis de tenso compatveis com TTL (com exceo para as tenses de alimentao) e quando sada capacidade de ativar at duas cargas TTL LOW SCHOTTKY (74LS ...). 63

Laboratrio de Microprocessadores

Wilson Ruiz

PINAGEM DO SLOT ISA IBM PC OBS: - Os sinais marcados com ( ) so ativos em 0. - O simbolo quando direcionado para o retngulo, que representa o SLOT, indica sada, no sentido inverso indica entrada, e o sinal indica linha bidirecional. - Os pinos com nmeros iniciados por A... e C... referem-se ao conhecido lado dos componentes da placa e os com nmeros iniciados por B... e D... ao lado da solda, sendo sua contagem iniciada sempre em relao ao painel traseiro do computador. O SLOT original do PC XT Sinal GND RESET DRV +5V IRQ2 -5V DRQ2 -12V reservado +12V GND (MEMW) (MEMR) (IOW) (IOR) (DACK3) DRQ3 (DACK1) DRQ1 (DACK0) CLOCK IRQ7 IRQ6 IRQ5 IRQ4 IRQ3 (DACK2) TC ALE +5V OSC GND pino B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 B18 B19 B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 pino A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A24 A26 A27 A28 A29 A30 A31 Sinal (I/O CH CK) D7 D6 D5 D4 D3 D2 D1 D0 I/O CH RDY AEN A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 64

Laboratrio de Microprocessadores

Wilson Ruiz

O SLOT ISA para 286, 386, 486 e Pentium OBS: Notar as diferenas nos pinos B4, B8, B11 e B12. Sinal GND RESET DRV +5V IRQ9 -5V DRQ2 -12V (OWS) +12V GND (SMEMW) (SMEMR) (IOW) (IOR) (DACK3) DRQ3 (DACK1) DRQ1 (DACK0) CLOCK IRQ7 IRQ6 IRQ5 IRQ4 IRQ3 (DACK2) TC ALE +5V OSC GND pino B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 B18 B19 B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 pino A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A24 A26 A27 A28 A29 A30 A31 Sinal (I/O CH CK) D7 D6 D5 D4 D3 D2 D1 D0 I/O CH RDY AEN A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0

65

Laboratrio de Microprocessadores

Wilson Ruiz

Sinal (MEM CS 16) (I/O CS 16) IRQ10 IRQ11 IRQ12 IRQ15 IRQ14 (DACK0) DRQ0 (DACK5) DRQ5 (DACK6) DRQ6 (DACK7) DRQ7 +5V (MASTER) GND

pino D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18

pino C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18

Sinal (SBHE) LA23 LA22 LA21 LA20 LA19 LA18 LA17 (MEMR) (MEMW) D8 D9 D10 D11 D12 D13 D14 D15

Descrio dos sinais usados no projeto exemplo: OBS: Descries mais detalhadas destes sinais e informaes adicionais sobre os outros so encontradas nas literaturas especializadas. RESET DRV ("Reset Drive"), sada: Este sinal mantido ativo durante a seqncia de energizao do sistema, por aproximadamente 2 segundos. Alm disso, automaticamente ativado se alguma das fontes sair fora das especificaes. usado para inicializar todos os dispositivos conectados ao barramento de expanso, sendo sincronizado pelo 8284 (ou compatvel). AO-A19, (endereos) sadas: Estes so os bits usados para enderear a memria do sistema e os dispositivos de I/O. Eles so gerados pela CPU durante acessos memria e aos dispositivos de I/O. Durante os ciclos de DMA, eles s gerados pelo controlador de DMA. Com 20 linhas de o endereo, pode-se acessar at 1 Mbyte de memria ou, atravs de instrues de IN e OUT, at 1 K dispositivos de I/O, pois essas instrues emitem endereos pelas linhas A0 at A15. As linhas A16 at A19 no so ativadas durante as operaes de I/O. DO-D7, (dados) bidirecional: Estas linhas so usadas para transmitir dados entre a CPU e a memria ou dispositivos de I/O. Elas estaro vlidas um pouco antes do flanco ascendente (T) dos sinais ((S)MEMW) e (IOW). Normalmente, usam-se o (IOW) como "strobe" para escrita nos dispositivos de I/O e a linha ((S)MEMW) como "strobe" de escrita na memria. Durante 66

Laboratrio de Microprocessadores

Wilson Ruiz

as operaes de leitura ((IOR) ou ((S)MEMR))), os dados devem estar vlidos um pouco antes do flanco ascendente (T) de (IOR) ou ((S)MEMR). Nas operaes de DMA, essas linhas permitem que o dado trafegue diretamente entre a memria e o dispositivo de I/O. (IOR) (" I/O Read), sada: Este um sinal gerado pelo Controlador de Barramento e indica aos dispositivos de I/O que o atual ciclo de barramento um ciclo de leitura de I/O. O dispositivo endereado deve responder colocando o dado no barramento pouco antes da subida do sinal (IOR). Durante os ciclos de DMA, o sinal (IOR) gerado pelo Controlador de DMA. Nestes casos, o endereo presente no barramento diz respeito a uma posio de memria e no a um dispositivo de I/O e o dispositivo de I/O selecionado no por endereo, mas sim pelo sinal (DACK). (IOW) (" I/O Write"), sada: Este um sinal semelhante ao anterior, exceto por servir para escritas em um dispositivo de I/O. O dispositivo endereado deve capturar (fazer um latch) o barramento de dados com o flanco ascendente (T) desse sinal. A mesma afirmao vlida para os ciclos de DMA. AEN (" Address Enable"), sada: gerado pela lgica de controle de DMA e serve para indicar que se est executando um ciclo de DMA. De forma mais precisa, desabilita o barramento que estava de posse da CPU para coloc-lo disposio do controlador de DMA. Para os dispositivos de I/O conectados ao barramento de expanso, este sinal deve ser usado para desabilitar os decodificadores. Isto impede que um I/O responda erroneamente ao endereo de DMA (pois diz respeito memria), j que vai estar presente um (IOR) ou (IOW). +5 VDC: Regulagem de 5%, est presente em dois pinos. Alimenta os circuitos lgicos. +12 VDC: Regulado para 5%. Alimenta motor dos acionadores de disco e tambm a porta serial. -5 VDC: Regulado para 10%. Alimentava memrias antigas que tambm precisavam de -5V para operarem. -12 VDC: Regulado para 10%. Alimenta porta serial. GND: Referncia de terra, presente em 3 pinos.

67

Laboratrio de Microprocessadores

Wilson Ruiz

4.4 Principais C.I.s A Interface de Comunicao Paralela Programvel 8255 (PPI): A interface paralela 8255A possui trs portas, de 8 bits cada, (chamadas A, B e C), que podem ser programadas independentemente como entradas ou sadas. A porta C pode ser programada para se tornar duas portas de 4 bits cada (independentes), formando assim, os chamados GRUPO A (porta A + 4 bits superiores da porta C) e o GRUPO B (porta B + 4 bits inferiores da porta C). Nas figuras seguintes so apresentadas a sua pinagem, a arquitetura interna e os respectivos bytes de programao.

68

Laboratrio de Microprocessadores

Wilson Ruiz

69

Laboratrio de Microprocessadores

Wilson Ruiz

70

Laboratrio de Microprocessadores

Wilson Ruiz

Resumo dos bytes de programao da 8255 PPI 80h 8 | PA 2 | PC+ 5 | PC5 | PB 8Ah 8 | PA 2 | PC+ 5 | PC5 | PB 98h 8 | PA 2 | PC+ 5 | PC5 | PB 81h 8 | PA 2 | PC+ 5 | PC5 | PB 8Bh 8 | PA 2 | PC+ 5 | PC5 | PB 99h 8 | PA 2 | PC+ 5 | PC5 | PB 82h 8 | PA 2 | PC+ 5 | PC5 | PB 90h 8 | PA 2 | PC+ 5 | PC5 | PB 9Ah 8 | PA 2 | PC+ 5 | PC5 | PB 83h 8 | PA 2 | PC+ 5 | PC5 | PB 91h 8 | PA 2 | PC+ 5 | PC5 | PB 9Bh 8 | PA 2 | PC+ 5 | PC5 | PB 71 88h 8 | PA 2 | PC+ 5 | PC5 | PB 92h 8 | PA 2 | PC+ 5 | PC5 | PB 89h 8 | PA 2 | PC+ 5 | PC5 | PB 93h 8 | PA 2 | PC+ 5 | PC5 | PB

Laboratrio de Microprocessadores

Wilson Ruiz

O 74LS138: O C.I. 74LS138 um decodificador de trs entradas para oito sadas, com trs entradas de controle. Duas dessas trs entradas so ativas em nvel 0 (G2A e G2B), enquanto a terceira (G1) ativa em nvel 1. O funcionamento consiste em levar apenas uma das oito sadas para o nvel 0, de acordo com a combinao das outras trs entradas de seleo (A B C). Se pelo menos uma das entradas de controle estiver desabilitada, todas as sadas permanecero em nvel 1. No circuito da interface, a sada Y0 empregada para ativar a 8255 mostrada, porm as sete sadas restantes podem ser usadas para expanso do sistema isto , para ativar outros perifricos conforme necessidade. Tabela verdade do 74LS138: G1 0 X X 1 1 1 1 1 1 1 1 G2A G2B X X 1 X X 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 C X X X 0 0 0 0 1 1 1 1 B X X X 0 0 1 1 0 0 1 1 A X X X 0 1 0 1 0 1 0 1 Y0 1 1 1 0 1 1 1 1 1 1 1 Y1 1 1 1 1 0 1 1 1 1 1 1 Y2 1 1 1 1 1 0 1 1 1 1 1 Y3 1 1 1 1 1 1 0 1 1 1 1 Y4 1 1 1 1 1 1 1 0 1 1 1 Y5 1 1 1 1 1 1 1 1 0 1 1 Y6 1 1 1 1 1 1 1 1 1 0 1 Y7 1 1 1 1 1 1 1 1 1 1 0

O smbolo do 74LS138:

72

Laboratrio de Microprocessadores

Wilson Ruiz

O Foto-acoplador: A figura seguinte representa um foto-acoplador (ptico-isolador, ptico-acoplador ou acoplador ptico) mostrando um LED acionando um fototransistor em um nico encapsulamento. O funcionamento desta configurao, numa aplicao digital, consiste em acender ou apagar o LED de acordo com os nveis lgicos do sinal aplicado na entrada e assim, cortar ou saturar o fototransistor associado.

A forma de ligao desse componente deve ser adaptada a cada aplicao bem como, o valor do resistor ligado em srie com o LED e do resistor ligado no coletor (ou emissor) do fototransistor escolhidos em funo das tenses envolvidas. A grande vantagem do emprego de um foto-acoplador a isolao eltrica entre os circuitos de entrada e sada (ou do computador e da etapa de potncia da aplicao), pois separados os terras da entrada e da sada, no existe nenhum caminho condutivo entre os dois circuitos ficando estes ento, eletricamente isolados e opticamente acoplados. Existem vrios tipos de foto-acopladores que, estruturalmente diferem no elemento de sada, podendo este ser um fotodiodo, um fototransistor, um fototransistor darlington ou um fototiristor, todos com caractersticas de isolao a partir de centenas de megaohms. Circuitos: Os esquemas dos circuitos sugeridos para a interface e para o uso dos fotoacopladores so mostrados a seguir.

73

Laboratrio de Microprocessadores

Wilson Ruiz

SUGESTOES PARA O USO DOS FOTO-ACLOPADORES:

74

Laboratrio de Microprocessadores

Wilson Ruiz

INTERFACE PARALELA PROGRAMVEL PARA PC

75

Laboratrio de Microprocessadores

Wilson Ruiz

4.5 Normas para o projeto da disciplina: Informaes iniciais: Projeto realizado por um grupo constitudo de preferencialmente 3 alunos. O trabalho tem como objetivo a elaborao completa de um pequeno sistema controlado por um microcomputador. Apresentao dividida em duas etapas: Placa de interface conectada a um slot ISA para PC funcionando. Utilizao do circuito montado para o controle do sistema previamente definido pelo grupo. Metodologia de trabalho: O grupo deve inicialmente cadastrar-se com o Professor. Esse grupo tambm deve apresentar propostas de sistemas ao Professor, at a data marcada e escolher, dentre as aprovadas, a que se constituir no trabalho (estas propostas podem conter partes das sugestes apresentadas pelo Professor). Sero antecipadamente marcados dias de desenvolvimento onde os grupos devero trazer seus respectivos projetos, para testes no laboratrio (uma data para cada etapa descrita anteriormente). O exemplo de projeto de interface fornecido poder ser usado integralmente ou adaptado para as necessidades do grupo. Outros circuitos envolvendo I/Os programveis ou no, CIs TTL e/ou CMOS tambm sero aceitos. Para projetos que envolvam sistemas de potncia elevada ou acionamento eletromecnico" obrigatrio o uso de foto-acopladores, ligados como no esquema exemplo fornecido. So aceitos projetos com temas semelhantes porm, totalmente proibidos, projetos iguais (exceto na topologia usada para a interface). Produto final esperado: O grupo deve apresentar a placa de interface, na forma de um prottipo, constitudo por uma PCI com pente ISA (necessria para a conexo ao microcomputador) ligada, atravs de uma cabo, a outra tipo padro e/ou montagem em wire-wrap e/ou proto-board. O sistema controlado. Um manual do projeto contendo: - Diagrama de blocos completo. - Esquema eletrnico completo (que dever incluir a interface apenas quando o projeto exemplo for alterado). - Explicao detalhada do funcionamento. - Listagem do software de controle (em Assembly) comentada.

76

Laboratrio de Microprocessadores

Wilson Ruiz

Avaliao: As apresentaes devero ser feitas exclusivamente nas datas marcadas e na ordem definida anteriormente por sorteio (atravs do nmero do grupo). A NOTA INDIVIDUAL, ser composta por fatores correspondentes a: -Efetiva participao do aluno nas datas marcadas para desenvolvimento. -Avaliao do funcionamento do Projeto. -Documentao entregue. -Argio, feita pelo Professor, individualmente cada aluno do grupo. Observao: Eventuais situaes no contempladas por este texto, sero julgadas pelo Professor da disciplina. Calendrio de desenvolvimento (para controle dos alunos): Cadastramento dos grupos de trabalho: ___________________________ Apresentao e anlise da proposta de projeto: _____________________ Data reservada para o desenvolvimento da interface: ________________ Apresentao da interface: _____________________________________ Data reservada para o desenvolvimento do sistema:_________________ Apresentao final e entrega da documentao: ____________________ Grupo de trabalho: Nome: ___________________________________________________ ___________________________________________________ ___________________________________________________ No: ______ ______ ______

77

Laboratrio de Microprocessadores

Wilson Ruiz

CAPITULO 5 DIVERSOS

5.1 Exerccios de programao assembly ( para os microprocessadores Intel das famlias: 80X86, 80X88 e Pentium ). O objetivo desta lista (terica) apenas familiarizar o aluno com esta linguagem, enfatizando-se a aplicaes das instrues bsicas, de diferentes modos de endereamento, ms sem o rigor das definies dos mesmos e ainda, no importando-se com o ambiente de usado, assim ela deve ser resolvida seqencialmente e logo no incio da aprendizagem de programao. 1. Escrever um programa, em linguagem Assembly, dos microprocessadores relacionados, que realize as seguintes cpias de dados (contedos dos endereos de off-set): Memria RAM (origem) endereo dado 0150h [ ] 0151h [ ] 0152h [ ] . . . 017Ah [ ] Memria RAM (destino) endereo dado 0200h [ ] 0201h [ ] 0202h [ ] . . .

OBS1: Em todos os enunciados (nos exerccios seguintes) fica subentendido a seguinte frase: Escrever um programa em linguagem Assembly, dos microprocessadores.... OBS2: Por razes didticas, sempre que possvel, tomar como exemplo um programa j resolvido em um exerccio anterior.

2. Idem ao anterior 1, somando o byte 05h, em cada contedo copiado. 3. Idem ao nmero 1, porm pulando-se 4 (quatro) endereos destino a cada cpia. (0150h) (0200h) ; (0151h) (0204h) ; ... 4. Idem ao nmero 1, realizando uma cpia inversa (invertendo os endereos da regio de memria destino). 78

Laboratrio de Microprocessadores

Wilson Ruiz

(0150h) (022Ah) ; (0151h) (0229h) ; ... 5. Idem ao nmero 1, subtraindo cada contedo, antes de ser copiado, do byte 0Eh. 6. Idem ao nmero 1, pulando-se 3 (trs) endereos da memria origem, a cada contedo lido e mantendo-se o mesmo nmero total de bytes copiados. (0150h) (0200h) ; (0153h) (0201h) ; ... 7. Carregar (escrever) o byte 00h na seguinte regio de memria RAM: de 0250h 02BFh (0250h) 00h (0251h) 00h . . . (02BFh) 00h 8. Escrever 00h, 01h, 02h, 03h,..., na seguinte regio de memria RAM: de 0200h 02F9h (0200h) 00h (0201h) 01h . . . (02F9h) F9h 9. Fazer uma operao AND com o byte 55h e depois, com o resultado, uma nova operao OR com o byte 80h, para cada contedo da regio de memria do exerccio anterior e gravar cada resultado, na mesma posio de memria. 10. Contar o nmero de bytes iguais a 55h, que existem na seguinte regio de de 0185h 030Bh Escrever o resultado final da contagem nos endereos 0183h e 0184h. memria:

79

Laboratrio de Microprocessadores

Wilson Ruiz

11. Idem ao anterior porm contando a seguinte seqncia de bytes: AAh, 55h (nessa ordem). 12. Pesquisar na seguinte regio de memria (de 0200h 027Fh), em ordem crescente de endereos e determinar em qual desses endereos encontra-se o primeiro byte 00h. Este endereo deve ficar armazenado no registrador BX, como resultado final. Caso no seja encontrado nenhum byte com esse valor o programa deve carregar FFFFh neste registrador.

5.2 Exemplo de um programa Com o objetivo de ampliar as possibilidades de aplicaes deste estudo, fornecido a seguir a listagem fonte completa de um programa para o controle de um rob, escrito em assembly, no TASM (ANA14.ASM). O hardware utilizado nessa aplicao a placa de interface apresentada no captulo 4. O arquivo fonte est disponvel aos alunos para estudos e testes.

80

Laboratrio de Microprocessadores

Wilson Ruiz

;************************************************************************************************************* ; Projeto: Controle do Rob ANA-2000 verso 1.4 ; ; Autor: Prof. Wilson Ruiz data: 11/2000 ; Descrio: Brao mecnico, com 4 motores e um solenide, controlado por PC, via placa de interface ; conectada em slot padro ISA. ; Operao: A cada uma das teclas abaixo atribui-se as respectivas funes: ; tecla Comando ; (letras minsculas) ; M ................ Inicia modo manual de controle ; A ................ Movimenta M0 no sentido horrio ou para M0 ; S ................ Movimenta M0 no sentido anti-horrio ou para M0 ; D ................ Movimenta M1 no sentido horrio ou para M1 ; F ................ Movimenta M1 no sentido anti-horrio ou para M1 ; G ................ Movimenta M2 no sentido horrio ou para M2 ; H ................ Movimenta M2 no sentido anti-horrio ou para M2 ; J ................ Movimenta M3 no sentido horrio ou para M3 ; K ................ Movimenta M3 no sentido anti-horrio ou para M3 ; L ................ Abre / fecha garra ; X ................ Desliga todos os motores e abre a garra ; I ................ Informa as teclas de comandos ; Z ................ Sai do programa ; 1 ................ Seleciona a velocidade 1 (mais lenta) ; 2 ................ Seleciona a velocidade 2 ; 3 ................ Seleciona a velocidade 3 ; 4 ................ Seleciona a velocidade 4 (mais rpida) ; ligao dos motores: Bobina Bits da ; 8255 ; Motor 0 = M0 (base) ....... A0 ............ PA0 ; A0'............ PA1 ; B0 ............ PA2 ; B0'............ PA3 ; Motor 1 = M1 (ombro)....... A1 ............ PA4 ; A1'............ PA5 ; B1 ............ PA6 ; B1'............ PA7 ; Motor 2 = M2 (cotovelo) .... A2 ............ PB0 ; A2'............ PB1 ; B2 ............ PB2 ; B2'............ PB3 ; Motor 3 = M3 (punho) ....... A3 ............ PB4 ; A3'............ PB5 ; B3 ............ PB6 ; B3'............ PB7 ; LIGACAO DOS SENSORES: ; nome funo bits da 8255 ; S0_MO..... sensor de fim de curso p/ M0 (zero) ........ PC0 ; S1_M0 ..... sensor de fim de curso p/ M0 ............... PC1 ; S0_M1 ..... sensor de fim de curso p/ M0 (zero)......... PC2 ; S1_M1 ..... sensor de fim de curso p/ M0 ............... PC3 ; S0_M2 ..... sensor de fim de curso p/ M0 (zero) ........ PC3 ; S1_M2 ..... sensor de fim de curso p/ M0 ............... PC5 ; S0_M3 ..... sensor de fim de curso p/ M0 (zero) ........ PC6 ; S1_M3 ..... sensor de fim de curso p/ M0 ................ PC7 ; ligao da garra: ; bits do ; 74LS373 ; solenide .................................. D0 ; Programas: ; editor de texto: NE ; Compilador: TASM ; Liker: TLINK ;************************************************************************************************************* ;nome do programa: ana14.asm CR LF EQU 13 EQU 10 DOSSEG .MODEL small .STACK ;ASCII Carriage Return ;ASCII Line Feed

81

Laboratrio de Microprocessadores

Wilson Ruiz

.DATA ;************************************************************************************************************* ; REGIAO DE DEFINICAO DE VARIAVEIS ;************************************************************************************************************* BYTE_M0 DB 11H ;para acionamento inicial do motor 0 BYTE_M1 DB 11H ;para acionamento inicial do motor 1 BYTE_M2 DB 0EEH ;para acionamento inicial do motor 2 BYTE_M3 DB 0EEH ;para acionamento inicial do motor 3 MIRROR_M0 DB 11H ;byte espelho do motor 0 MIRROR_M1 DB 11H ;byte espelho do motor 1 MIRROR_M2 DB 0EEH ;byte espelho do motor 2 MIRROR_M3 DB 0EEH ;byte espelho do motor 3 BYTE_VEL DB 0FFH ;byte de seleo da velocidade ;do motor escolhido MIRROR_GARRA DB 00H ;byte do status da garra ;************************************************************************************************************* ; REGIAO DE DEFINICAO DE CONSTANTES ;************************************************************************************************************* PA DW 0380H ;endereo da porta A da 8255 PB DW 0381H ;endereo da porta B da 8255 PC DW 0382H ;endereo da porta C da 8255 PROG DW 0383H ;endereo de programao da 8255 GARRA DW 0384H ;endereo de acesso a garra MENS_M0_H DB cr,lf,lf,' -> Movimentando motor 0 no sentido horario$' MENS_M0_AH DB cr,lf,lf,' -> Movimentando motor 0 no sentido anti-horario$' MENS_M1_H DB cr,lf,lf,' -> Movimentando motor 1 no sentido horario$' MENS_M1_AH DB cr,lf,lf,' -> Movimentando motor 1 no sentido anti-horario$' MENS_M2_H DB cr,lf,lf,' -> Movimentando motor 2 no sentido horario$' MENS_M2_AH DB cr,lf,lf,' -> Movimentando motor 2 no sentido anti-horario$' MENS_M3_H DB cr,lf,lf,' -> Movimentando motor 3 no sentido horario$' MENS_M3_AH DB cr,lf,lf,' -> Movimentando motor 3 no sentido anti-horario$' MENS_M0_STOPED DB cr,lf,lf,' -> Motor 0 parado$' MENS_M1_STOPED DB cr,lf,lf,' -> Motor 1 parado$' MENS_M2_STOPED DB cr,lf,lf,' -> Motor 2 parado$' MENS_M3_STOPED DB cr,lf,lf,' -> Motor 3 parado$' MENS_V1 DB cr,lf,lf,' # Velocidade 1 selecionada #$' MENS_V2 DB cr,lf,lf,' # Velocidade 2 selecionada #$' MENS_V3 DB cr,lf,lf,' # Velocidade 3 selecionada #$' MENS_V4 DB cr,lf,lf,' # Velocidade 4 selecionada #$' MENS_G_OPENED DB cr,lf,lf,' * Garra aberta *$' MENS_G_CLOSED DB cr,lf,lf,' * Garra fechada *$' MENS_INICIAL DB cr,lf,lf,' > > PROGRAMA DE CONTROLE DO ROBO ANA - 2000 < <$' MENS_M_OFF DB cr,lf,lf,' >>>> Todos os motores desligados <<<$' MENS_FINAL DB cr,lf,lf,lf,lf,lf,' ------ Programa finalizado ------' DB cr,lf,lf,lf,' O ANA - 2000 despede-se: TCHAU!$' MENS_MENU DB cr,lf,lf,lf,lf,' MENU INICIAL - tecle a letra minuscula' DB cr,lf,lf,' M .............Inicia o modo manual de controle' DB cr,lf,lf,' I .............Informa teclas de comando$' MENS_M_MANUAL DB cr,lf,lf,lf,lf,' Selecionado o MODO DE CONTROLE MANUAL!$' MENS_TECLAS DB cr,lf,lf,lf,lf,' TECLAS DE COMANDOS E SUAS FUNCOES:' DB cr,lf,lf,' TECLAS: COMANDOS:' DB cr,lf,' (letras' DB CR,LF,' minusculas' DB cr,lf,' ou numeros)' DB cr,lf,' M ---> Inicia modo manual de controle' DB cr,lf,' A ---> Movimenta M0 no sentido horario ou para M0......(BASE)' DB cr,lf,' S ---> Movimenta M0 no sentido anti-horario ou para M0.(BASE)' DB cr,lf,' D ---> Movimenta M1 no sentido horario ou para M1......(OMBRO)' DB cr,lf,' F ---> Movimenta M1 no sentido anti-horario ou para M1.(OMBRO)' DB cr,lf,' G ---> Movimenta M2 no sentido horario ou para M2......(COTOVELO)' DB cr,lf,' H ---> Movimenta M2 no sentido anti-horario ou para M2.(COTOVELO)' DB cr,lf,' J ---> Movimenta M3 no sentido horario ou para M3......(PUNHO)' DB cr,lf,' K ---> Movimenta M3 no sentido anti-horario ou para M3.(PUNHO)' DB cr,lf,' L ---> Abre / fecha garra' DB cr,lf,' X ---> Desliga todos os motores e abre a garra' DB cr,lf,' I ---> Informa as teclas de comandos' DB cr,lf,' Z ---> Sai do programa' DB cr,lf,' 1 ---> Seleciona a velocidade 1..............(mais lenta)' DB cr,lf,' 2 ---> Seleciona a velocidade 2' DB cr,lf,' 3 ---> Seleciona a velocidade 3'

82

Laboratrio de Microprocessadores

Wilson Ruiz

DB cr,lf,' 4 ---> Seleciona a velocidade 4..............(mais rapida)$' ANA1 .CODE PROC mov mov mov cld push mov mov mov mov int pop mov mov out mov mov out mov mov out call call mov int cmp jnz call jmp cmp jnz call jmp mov int cmp jnz call cmp jnz call cmp jnz call cmp jnz call cmp jnz call cmp jnz call cmp jnz call cmp jnz call cmp jnz call cmp jnz call cmp jnz ;necessrio para enviar mensagens para a tela ;inicializa os registradores de ;segmento DS e ES ;Clear Direction Flag ;moldura ;salva ponteiro de base anterior ;servico 0BH, define cor ;define fundo ;usa cor 01 (azul) ;requisita o servio de vdeo ;recupera o ponteiro de base anterior ;programa 8255 ;PA, PB e PC como sadas ;estabelece status inicial dos ;motores, necessria alterao ;em funo dos drives escolhidos ;para cada motor ;escreve a mensagem inicial ;escreve o menu inicial ;leitura de teclado sem eco ;verifica tecla "M" minscula

ax, @data ds, ax es, ax bp bp, sp ah, 0BH bh, 00H bl, 03H 10H bp dx, PROG al, 89H dx, al dx, PA al, 11H dx, al dx, PB al, 0EEH dx, al ESCREVE_INICIO ESCREVE_MENU ah, 08H 21H al, 6DH L17 ESCREVE_M_MANUAL L16 al, 69H L18 ESCREVE_TECLAS L18 ah, 08H 21H al, 31H L1 VEL_1 al, 32H L2 VEL_2 al, 33H L3 VEL_3 al, 34H L4 VEL_4 al, 61H L5 MOVE_M0_H al, 73H L6 MOVE_M0_AH al, 64H L7 MOVE_M1_H al, 66H L8 MOVE_M1_AH al, 67H L9 MOVE_M2_H al, 68H L10 MOVE_M2_AH al, 6AH L11

L18:

L17:

;verifica tecla "I" minscula ;escreve lista de teclas de comandos ;leitur a de teclado sem eco ;verifica tecla "1" ;seleciona velocidade 1 ;verifica tecla "2" ;seleciona velocidade 2 ;verifica tecla "3" ;seleciona velocidade 3 ;verifica tecla "4" ;seleciona velocidade 4 ;verifica tecla "A" minscula ;movimenta o motor 0, sentido horrio ;verifica tecla "S" minscula ;movimenta o motor 0, sentido anti-horrio ;verifica tecla "D" minscula ;movimenta o motor 1, sentido horrio ;verifica tecla "F" minscula ;movimenta o motor 1, sentido anti-horrio ;verifica tecla "G" minscula ;movimenta o motor 2, sentido horrio ;verifica tecla "H" minsc ula ;movimenta o motor 2, sentido anti-horrio ;verifica tecla "J" minscula

L16:

L1: L2: L3: L4: L5: L6: L7: L8: L9: L10:

83

Laboratrio de Microprocessadores

Wilson Ruiz

L11: L12: L13: L14: L15: ANA1

call cmp jnz call cmp jnz call cmp jnz call cmp jz jmp call mov int ENDP

MOVE_M3_H al, 6BH L12 MOVE_M3_AH al, 6CH L13 COMUTA_GARRA al, 69H L14 ESCREVE_TECLAS al, 7AH L15 L16 ESCREVE_FINAL ah, 4CH 21H

;movimenta o motor 3, sentido horrio ;verifica tecla "K" minscula ;movimenta o motor 3, sentido anti-horrio ;verifica tecla "L" minscula ;comuta a solenide da garra ;verifica tecla "I" minscula ;escreve lista de teclas de comandos ;verifica tecla "Z" minscula ;retorna para ler teclado ;escreve mensagem final ;retorna ao sistema operacional ;finaliza o procedimento

;************************************************************************************************************* ;Subrotina: MOVE_M0_H ; L o byte espelho de movimento do motor 0; MIRROR_M0 ; Move o motor 0 no sentido horrio. Atualiza MIRROR_M0 ; Continua o movimento do motor ate que a tecla correspondente seja acionada pela segunda vez ; Aciona a escrita das mensagens correspondentes ao status do motor selecionado ;************************************************************************************************************* PUBLIC MOVE_M0_H MOVE_M0_H PROC push ax push dx call ESCREVE_M0_H ;mensagem M1: mov dx, PA mov ah, MIRROR_M0 ;l byte espelho rol ah, 1 ;desloca mov MIRROR_M0, ah ;atualiza byte espelho and ah, 0FH in al, dx ;l a porta A and al, 0F0H or al, ah ;mascara out dx, al ;move M0 de um passo call PAUSA_1 ;pausa mov ah, 0BH int 21H ;l buffer do teclado cmp al, 0FFH ;verifica se existe tecla jnz M1 ;se no existe tecla continua movimento mov ah, 07H int 21H ;l teclado cmp al, 61H ;compara com a tecla "A" minscula jnz M1 ;se diferente continua movimento call ESCREVE_M0_STOP ;mensagem pop dx pop ax ret MOVE_M0_H ENDP ;finaliza o procedimento ;************************************************************************************************************* ;Subrotina: MOVE_M0_AH ; L o byte espelho de movimento do motor 0; MIRROR_M0 ; Move o motor 0 no sentido anti -horrio. Atua liza MIRROR_M0 ; Continua o movimento do motor ate que a tecla correspondente seja acionada pela segunda vez ; Aciona a escrita das mensagens correspondentes ao status do motor selecionado ;************************************************************************************************************* PUBLIC MOVE_M0_AH MOVE_M0_AH PROC push ax push dx call ESCREVE_M0_AH ;mensagem M2: mov dx, PA mov ah, MIRROR_M0 ;l byte espelho ror ah, 1 ;desloca mov MIRROR_M0, ah ;atualiza byte espelho

84

Laboratrio de Microprocessadores

Wilson Ruiz

and in and or out call mov int cmp jnz mov int cmp jnz call pop pop ret MOVE_M0_AH

ah, 0FH al, dx al, 0F0H al, ah dx, al PAUSA_1 ah, 0BH 21H al, 0FFH M2 ah, 07H 21H al, 73H M2 ESCREVE_M0_STOP dx ax ENDP

;l a porta A ;mascara ;move M0 de um passo ;pausa ;l buffer do teclado ;verifica se existe tecla ;se n o existe tecla continua movimento ;l teclado ;compara com a tecla "S" minscula ;se diferente continua movimento ;mensagem

;finaliza o procedimento

;************************************************************************************************************* ;Subrotina: MOVE_M1_H ; L o byte espelho de movimento do motor 1; MIRROR_M1 ; Move o motor 1 no sentido horrio. Atualiza MIRROR_M1 ; Continua o movimento do motor ate que a tecla correspondente seja acionada pela segunda vez ; Aciona a escrita das mensagens correspondentes ao status do motor selecionado ;************************************************************************************************************* PUBLIC MOVE_M1_H MOVE_M1_H PROC push ax push dx call ESCREVE_M1_H ;mensagem M3: mov dx, PA mov ah, MIRROR_M1 ;l byte espelho rol ah, 1 ;desloca mov MIRROR_M1, ah ;atualiza byte espelho and ah, 0 F0H in al, dx ;l a porta A and al, 0FH or al, ah ;mascara out dx, al ;move M1 de um passo call PAUSA_1 ;pausa mov ah, 0BH int 21H ;l buffer do teclado cmp al, 0FFH ;verifica se existe tecla jnz M3 ;se no existe tecla continua movimento mov ah, 07H int 21H ;l teclado cmp al, 64H ;compara com a tecla "D" minscula jnz M3 ;se diferente continua movimento call ESCREVE_M1_STOP ;mensagem pop dx pop ax ret MOVE_M1_H ENDP ;finaliza o procedimento ;************************************************************************************************************* ;Subrotina: MOVE_M1_AH ; L o byte espelho de movimento do motor 1; MIRROR_M1 ; Move o motor 1 no sentido anti -horrio. Atualiza MIRROR_M1 ; Continua o movimento do motor ate que a tecla correspondente seja acionada pela segunda vez ; Aciona a escrita das mensagens correspondentes ao status do motor selecionado ;************************************************************************************************************* PUBLIC MOVE_M1_AH MOVE_M1_AH PROC push ax push dx call ESCREVE_M1_AH ;mensagem M4: mov dx, PA mov ah, MIRROR_M1 ;l byte espelho

85

Laboratrio de Microprocessadores

Wilson Ruiz

ror mov and in and or out call mov int cmp jnz mov int cmp jnz call pop pop ret MOVE_M1_AH

ah, 1 MIRROR_M1, ah ah, 0F0H al, dx al, 0FH al, ah dx, al PAUSA_1 ah, 0BH 21H al, 0FFH M4 ah, 07H 21H al, 66H M4 ESCREVE_M1_STOP dx ax ENDP

;desloca ;atualiza byte espelho ;l a porta A ;mascara ;move M1 de um passo ;pausa ;l buffer do teclado ;verifica se existe tecla ;se no existe tecla continua movimento ;l teclado ;compara com a tecla "F" minscula ;se diferente continua movimento ;mensagem

;finaliza o procedimento

;************************************************************************************************************* ;Subrotina: MOVE_M2_H ; L o byte espelho de movimento do motor 2; MIRROR_M2 ; Move o motor 2 no sentido horrio. Atualiza MIRROR_M2 ; Continua o movimento do motor ate que a tecla correspondente seja acionada pela segunda vez ; Aciona a escrita das mensagens correspondentes ao status do motor selecionado ;************************************************************************************************************* PUBLIC MOVE_M2_H MOVE_M2_H PROC push ax push dx call ESCREVE_M2_H ;mensagem M5: mov dx, PB mov ah, MIRROR_M2 ;l byte espelho rol ah, 1 ;desloca mov MIRROR_M2, ah ;atualiza byte espelho and ah, 0FH in al, dx ;l a porta B and al, 0F0H or al, ah ;mascara out dx, al ;move M2 de um passo call PAUSA_1 ;pausa mov ah, 0BH int 21H ;l buffer do teclado cmp al, 0FFH ;verifica se existe tecla jnz M5 ;se no existe tecla continua movimento mov ah, 07H int 21H ;l teclado cmp al, 67H ;compara com a tecla "G" minscula jnz M5 ;se diferente continua movimento call ESCREVE_M2_STOP ;mensagem pop dx pop ax ret MOVE_M2_H ENDP ;finaliza o procedimento ;************************************************************************************************************* ;Subrotina: MOVE_M2_AH ; L o byte espelho de movimento do motor 2; MIRROR_M2 ; Move o motor 2 no sentido anti -horrio. Atualiza MIRROR_M2 ; Continua o movimento do motor ate que a tecla correspondente seja acionada pela segunda vez ; Aciona a escrita das mensagens correspondentes ao status do motor selecionado ;************************************************************************************************************* PUBLIC MOVE_M2_AH MOVE_M2_AH PROC push ax push dx call ESCREVE_M2_AH ;mensagem

86

Laboratrio de Microprocessadores

Wilson Ruiz

M6:

mov mov ror mov and in and or out call mov int cmp jnz mov int cmp jnz call pop pop ret MOVE_M2_AH

dx, PB ah, MIRROR_M2 ah, 1 MIRROR_M2, ah ah, 0FH al, dx al, 0F0H al, ah dx, al PAUSA_1 ah, 0BH 21H al, 0FFH M6 ah, 07H 21H al, 68H M6 ESCREVE_M2_STOP dx ax ENDP

;l byte espelho ;desloca ;atualiza byte espelho ;l a porta B ;mascara ;move M2 de um passo ;pausa ;l buffer do teclado ;verifica se existe tecla ;se no existe tecla continua movimento ;l teclado ;compara com a tecla "H" minscula ;se diferente continua movimento ;mensagem

;finaliza o procedimento

;************************************************************************************************************* ;Subrotina: MOVE_M3_H ; L o byte espelho de movimento do motor 3; MIRROR_M3 ; Move o motor 3 no sentido horrio. Atualiza MIRROR_M3 ; Continua o movimento do motor ate que a tecla correspondente seja acionada pela segunda vez ; Aciona a escrita das mensagens correspondentes ao status do motor selecionado ;************************************************************************************************************* PUBLIC MOVE_M3_H MOVE_M3_H PROC push ax push dx call ESCREVE_M3_H ;mensagem M7: mov dx, PB mov ah, MIRROR_M3 ;l byte espelho rol ah, 1 ;desloca mov MIRROR_M3, ah ;atualiza byte espelho and ah, 0F0H in al, dx ;l a porta B and al, 0FH or al, ah ;mascara out dx, al ;move M3 de um passo call PAUSA_1 ;pausa mov ah, 0BH int 21H ;l buffer do teclado cmp al, 0FFH ;verifica se existe tecla jnz M7 ;se no existe tecla continua movimento mov ah, 07H int 21H ;l teclado cmp al, 6AH ;compara com a tecla "J" minscula jnz M7 ;se diferente continua movimento call ESCREVE_M3_STOP ;mensagem pop dx pop ax ret MOVE_M3_H ENDP ;finaliza o procedimento ;************************************************************************************************************* ;Subrotina: MOVE_M3_AH ; L o byte espelho de movimento do motor 3; MIRROR_M3 ; Move o motor 3 no sentido anti -horrio. Atualiza MIRROR_M3 ; Continua o movimento do motor ate que a tecla correspondente seja acionada pela segunda vez ; Aciona a escrita das mensagens correspondentes ao status do motor selecionado ;************************************************************************************************************* PUBLIC MOVE_M3_AH MOVE_M3_AH PROC push ax

87

Laboratrio de Microprocessadores

Wilson Ruiz

push call M8: mov mov ror mov and in and or out call mov int cmp jnz mov int cmp jnz call pop pop ret MOVE_M3_AH

dx ESCREVE_M3_AH dx, PB ah, MIRROR_M3 ah, 1 MIRROR_M3, ah ah, 0F0H al, dx al, 0FH al, ah dx, al PAUSA_1 ah, 0BH 21H al, 0FFH M8 ah, 07H 21H al, 6BH M8 ESCREVE_M3_STOP dx ax ENDP

;mensagem ;l byte espelho ;desloca ;atualiza byte espelho ;l a porta B ;mascara ;move M3 de um passo ;pausa ;l buffer do teclado ;verifica se existe tecla ;se no existe tecla continua movimento ;l teclado ;compara com a tecla "K" minscula ;se diferente continua movimento ;mensagem

;finaliza o procedimento

;************************************************************************************************************* ;Subrotina: VEL_1 ; Atualiza o byte de velocidade para a velocidade numero 1. Escreve a mensagem correspondente ;************************************************************************************************************* PUBLIC VEL_1 VEL_1 PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov BYTE_VEL, 0FFH ;atualiza byte de velocidade mov ah, 09H lea dx, MENS_V1 int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 83H ;define atributo, cor = azul claro piscando mov cx, 0003H int 10H pop bp pop cx pop bx pop dx pop ax ret VEL_1 ENDP ;finaliza o procedimento ;************************************************************************************************************* ;Subrotina: VEL_2 ; Atualiza o byte de velocidade para a velocidade numero 2. Escreve a mensagem correspondente ;************************************************************************************************************* PUBLIC VEL_2 VEL_2 PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov BYTE_VEL, 7FH ;atualiza byte de velocidade mov ah, 09H lea dx, MENS_V2 int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem

88

Laboratrio de Microprocessadores

Wilson Ruiz

mov mov mov int pop pop pop pop pop ret VEL_2

al, 16H bl, 83H cx, 0006H 10H bp cx bx dx ax ENDP

;define atributo, cor = azul claro piscando

;finaliza o procedimento

;************************************************************************************************************* ;Subrotina: VEL_3 ; Atualiza o byte de velocidade para a velocidade numero 3. Escreve a mensagem correspondente ;************************************************************************************************************* PUBLIC VEL_3 VEL_3 PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov BYTE_VEL, 3FH ;atualiza byte de velocidade mov ah, 09H lea dx, MENS_V3 int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 83H ;define atributo, cor = azul claro piscando mov cx, 0009H int 10H pop bp pop cx pop bx pop dx pop ax ret VEL_3 ENDP ;finaliza o procedimento ;************************************************************************************************************* ;Subrotina: VEL_4 ; Atualiza o byte de velocidade para a velocidade numero 4. Escreve a mensagem correspondente ;************************************************************************************************************* PUBLIC VEL_4 VEL_4 PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov BYTE_VEL, 07H ;atualiza byte de velocidade mov ah, 09H lea dx, MENS_V4 int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 83H ;define atributo, cor = azul claro piscando mov cx, 000CH int 10H pop bp pop cx pop bx pop dx pop ax ret VEL_4 ENDP ;finaliza o procedimento ;************************************************************************************************************* ;Subrotina: COMUTA_GARRA

89

Laboratrio de Microprocessadores

Wilson Ruiz

; L o byte de status da garra: MIRROR_GARRA. Comuta o status da solenide. Atualiza o MIRROR_GARRA ;************************************************************************************************************* PUBLIC GARRA COMUTA_GARRA PROC push ax push dx mov ah, MIRROR_GARRA cmp ah, 00H jz G1 mov dx, GARRA mov al, 00H mov MIRROR_GARRA, al out dx, al call ESCREVE_G_ABERTA jmp G2 G1: mov dx, GARRA mov al, 01H mov MIRROR_GARRA, al out dx, al call ESCREVE_G_FECHADA G2: pop dx pop ax ret COMUTA_GARRA ENDP ;************************************************************************************************************* ;Subrotina: PAUSA_1 ;************************************************************************************************************* PUBLIC PAUSA_1 PAUSA_1 PROC push bx push cx push dx mov bl, BYTE_VEL ;l byte de movimento atual P3: mov cx, 00ffH P2: mov dx, 00ffH P1: dec dx jnz P1 dec cx jnz P2 dec bl jnz P3 pop dx pop cx pop bx ret PAUSA_1 ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_INICIO ; Escreve a mensagem de apresentao inicial ;************************************************************************************************************* PUBLIC ESCREVE_INICIO ESCREVE_INICIO PROC push ax push dx mov ah, 09H lea dx, MENS_INICIAL int 21H ;mensagem pop dx pop ax ret ESCREVE_INICIO ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_M_MANUAL ; Escreve a mensagem de inicio do modo manual ;************************************************************************************************************* PUBLIC ESCREVE_M_MANUAL ESCREVE_M_MANUAL PROC

90

Laboratrio de Microprocessadores

Wilson Ruiz

push ax push dx mov ah, 09H lea dx, MENS_M_MANUAL int 21H pop dx pop ax ret ESCREVE_M_MANUAL ENDP

;mensagem

;************************************************************************************************************* ;Subrotina: ESCREVE_TECLAS ; Escreve a lista de teclas de comandos ;************************************************************************************************************* PUBLIC ESCREVE_TECLAS ESCREVE_TECLASPROC push ax push dx mov ah, 09H lea dx, MENS_TECLAS int 21H ;mensagem pop dx pop ax ret ESCREVE_TECLASENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_MENU ; Escreve o menu inicial ;************************************************************************************************************* PUBLIC ESCREVE_MENU ESCREVE_MENU PROC push ax push dx mov ah, 09H lea dx, MENS_MENU int 21H ;mensagem pop dx pop ax ret ESCREVE_MENU ENDP ;******************************************************************************* ****************************** ;Subrotina: ESCREVE_FINAL ; Escreve a mensagem de despedida ;************************************************************************************************************* PUBLIC ESCREVE_FINAL ESCREVE_FINAL PROC push ax push dx mov ah, 09H lea dx, MENS_FINAL int 21H ;mensagem pop dx pop ax ret ESCREVE_FINAL ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_M0_H ; Escreve a mensagem correspondente ao motor em movimento ;************************************************************************************************************* PUBLIC ESCREVE_M0_H ESCREVE_M0_H PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M0_H

91

Laboratrio de Microprocessadores

Wilson Ruiz

int push mov mov mov mov int pop pop pop pop pop ret ESCREVE_M0_H

21H bp ah, 09H al, 16H bl, 44H cx, 0009H 10H bp cx bx dx ax ENDP

;mensagem ;cria caractere colorido ;no final da mensagem ;define atributo, cor = vermelho

;************************************************************************************************************* ;Subrotina: ESCREVE_M0_AH ; Escreve a mensagem correspondente ao motor em movimento ;************************************************************************************************************* PUBLIC ESCREVE_M0_AH ESCREVE_M0_AH PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M0_AH int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 44H ;define atributo, cor = vermelho mov cx, 0009H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_M0_AH ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_M1_H ; Escreve a mensagem correspondente ao motor em movimento ;************************************************************************************************************* PUBLIC ESCREVE_M1_H ESCREVE_M1_H PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M1_H int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 11H ;define atributo, cor = azul escuro mov cx, 0009H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_M1_H ENDP ;*************************************************************************************************************

92

Laboratrio de Microprocessadores

Wilson Ruiz

;Subrotina: ESCREVE_M1_AH ; Escreve a mensagem correspondente ao motor em movimento ;************************************************************************************************************* PUBLIC ESCREVE_M1_AH ESCREVE_M1_AH PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M1_AH int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 11H ;define atributo, cor = azul escuro mov cx, 0009H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_M1_AH ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_M2_H ; Escreve a mensagem correspondente ao motor em movimento ;************************************************************************************************************* PUBLIC ESCREVE_M2_H ESCREVE_M2_H PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M2_H int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 22H ;define atributo, cor = verde claro mov cx, 0009H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_M2_H ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_M2_AH ; Escreve a mensagem correspondente ao motor em movimento ;*********************************************** ************************************************************** PUBLIC ESCREVE_M2_AH ESCREVE_M2_AH PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M2_AH int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 22H ;define atributo, cor = verde claro

93

Laboratrio de Microprocessadores

Wilson Ruiz

mov int pop pop pop pop pop ret ESCREVE_M2_AH

cx, 0009H 10H bp cx bx dx ax ENDP

;************************************************************************************************************* ;Subrotina: ESCREVE_M3_H ; Escreve a mensagem correspondente ao motor em movimento ;************************************************************************************************************* PUBLIC ESCREVE_M3_H ESCREVE_M3_H PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M3_H int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 55H ;define atributo, cor = rosa mov cx, 0009H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_M3_H ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_M3_AH ; Escreve a mensagem correspondente ao motor em movimento ;************************************************************************************************************* PUBLIC ESCREVE_M3_AH ESCREVE_M3_AH PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M3_AH int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 55H ;define atributo, cor = rosa mov cx, 0009H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_M3_AH ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_M0_STOP ; Escreve a mensagem correspondente ao motor parado ;************************************************************************************************************* PUBLIC ESCREVE_M0_STOP ESCREVE_M0_STOP PROC

94

Laboratrio de Microprocessadores

Wilson Ruiz

push ax push dx push bx push cx mov ah, 09H lea dx, MENS_M0_STOPED int 21H push bp mov ah, 09H mov al, 16H mov bl, 44H mov cx, 0002H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_M0_STOP ENDP

;necessrio pelo caractere colorido ;necessrio pelo caractere colorido ;mensagem ;cria caractere colorido ;no final da mensagem ;define atributo, cor = vermelho

;************************************************************************************************************* ;Subrotina: ESCREVE_M1_STOP ; Escreve a mensagem correspondente ao motor parado ;************************************************************************************************************* PUBLIC ESCREVE_M1_STOP ESCREVE_M1_STOP PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M1_STOPED int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 11H ;define atributo, cor = azul escuro mov cx, 0002H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_M1_STOP ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_M2_STOP ; Escreve a mensagem correspondente ao motor parado ;************************************************************************************************************* PUBLIC ESCREVE_M2_STOP ESCREVE_M2_STOP PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M2_STOPED int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no fi nal da mensagem mov al, 16H mov bl, 22H ;define atributo, cor = verde claro mov cx, 0002H int 10H pop bp pop cx pop bx

95

Laboratrio de Microprocessadores

Wilson Ruiz

pop dx pop ax ret ESCREVE_M2_STOP

ENDP

;************************************************************************************************************* ;Subrotina: ESCREVE_M3_STOP ; Escreve a mensagem correspondente ao motor parado ;************************************************************************************************************* PUBLIC ESCREVE_M3_STOP ESCREVE_M3_STOP PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_M3_STOPED int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 55H ;define atributo, cor = rosa mov cx, 0002H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_M3_STOP ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_G_ABERTA ; Escreve a mensagem correspondente ao status da garra ;************************************************************************************************************* PUBLIC ESCREVE_G_ABERTA ESCREVE_G_ABERTA PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H lea dx, MENS_G_OPENED int 21H ;mensagem push bp ;cria caractere colorido mov ah, 09H ;no final da mensagem mov al, 16H mov bl, 66H ;define atributo, cor = laranja mov cx, 0002H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_G_ABERTA ENDP ;************************************************************************************************************* ;Subrotina: ESCREVE_G_FECHADA ; Escreve a mensagem correspondente ao status da garra ;************************************************************************************************************* PUBLIC ESCREVE_G_FECHADA ESCREVE_G_FECHADA PROC push ax push dx push bx ;necessrio pelo caractere colorido push cx ;necessrio pelo caractere colorido mov ah, 09H

96

Laboratrio de Microprocessadores

Wilson Ruiz

lea dx, MENS_G_CLOSED int 21H push bp mov ah, 09H mov al, 16H mov bl, 66H mov cx, 0009H int 10H pop bp pop cx pop bx pop dx pop ax ret ESCREVE_G_FECHADA ENDP END ANA1

;mensagem ;cria caractere colorido ;no final da mensagem ;define atributo, cor = laranja

;finaliza o programa

97

Laboratrio de Microprocessadores

Wilson Ruiz

5.3 Conjunto de INSTRUES BSICAS d microprocessadores das sub-famlias os Intel 80x86, 80x88 e Pentium Observaes: Para compactar as tabelas apresentadas sem perda de informao adotada a seguinte notao para as instrues: Um valor numrico de 8 bits qualquer chamado byte. Este possui o seu bit +significativo (colocado a esquerda) chamado D7 e o seu bit significativo (colocado a direita) D0. Um valor numrico de 4 bits chamado nibble, existindo assim em um byte, o nibble +significativo (colocado a esquerda) e o nibble significativo (colocado a direita). Um valor numrico de 16 bits qualquer chamado de Word ou dois bytes, existindo assim o byte +significativo e o byte significativo, podendo tambm representar endereos. Os registradores de 8 bit s especificados genericamente nas instrues so: AH, AL, BH, BL, CH, CL, DH, DL, [BX] e [endereo]. Os registradores de 16 bits especificados genericamente nas instrues so: AX, BX, CX e DX. Ao utilizar combinaes de uma determinada instruo lembre-se que nunca pode existir [BX] e [endereo] simultaneamente no mesmo mnemnico.

98

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES PARA ENTRADA DE DADOS EM REGISTRADORES DE 8 BITS


Mnemnico: MOV AL, byte M OV BL, byte Descrio da instruo: AL byte qualquer ; carrega um byte em AL BL byte qualquer ; carrega um byte em BL Demais registradores de 8 bits (...H ou ...L), [BX] ou [endereo] so vlidos

INSTRUES PARA ENTRADA DE DADOS EM REGISTRADORES DE 16 BITS


Mnemnico: MOV AX, dois bytes MOV BX, dois bytes Descrio da instruo: AX Word ou AH (byte +significativo) e AL byte (significativo) BX Word ou BH (byte +significativo) e BL byte (significativo) Demais registradores de 16 bits (...X) so vlidos

INSTRUES DE TRANSFERNCIA DE DADOS ENTRE REGISTRADORES DE 8 BITS


Mnemnico: MOV AL, CL MOV CL, BL Descrio da instruo: AL CL ; carrega o contedo de CL em AL CL BL ; carrega o contedo de BL em CL Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas

INSTRUES DE TRANSFERNCIA DE DADOS ENTRE REGISTRADORES DE 16 BITS


Mnemnico: MOV AX, AX MOV DX, BX Descrio da instruo: AX AX ; carrega o contedo de AX em AX DX BX ; carrega o contedo de BX em DX Demais combinaes entre registradores de 16 bits (...X) so vlidas

INSTRUES DE PERMUTA DE DADOS ENTRE REGISTRADORES DE 8 BITS


Mnemnico: XCHG CL, BH XCHG DL, AL Descrio da instruo: CL BH ; troca os contedos dos registradores AL e AL DL AL ; troca os contedos dos registradores DL e AL Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas

INSTRUES DE PERMUTA DE DADOS ENTRE REGISTRADORES DE 16 BITS


Mnemnico: XCHG AX, DX XCHG BX, CX Descrio da instruo: AX DX ; troca os contedos dos registradores AX e DX BX CX ; troca os contedos dos registradores BX e CX Demais combinaes entre registradores de 16 bits (...X) so vlidas

99

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES ARITMTICAS ENTRE REGISTRADORES DE 8 BITS


Mnemnico: ADD AL, BL ADD DH, AL Descrio da instruo: AL AL + BL DH DH + AL Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas AL AL + AH + carry flag DL DL + CL + carry flag Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas AL AL + BL CL CL + DL Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas AL AL - AH - carry flag DL DL - BL - carry flag Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas AX AL . BL AX AL . CL Demais registradores de 8 bits (...H e ...L) so vlidos para o multiplicador Os registradores AL (multiplicando) e AX (produto) sempre so usados AL AX / DH ; AH resto da diviso AL AX / CL ; AH resto da diviso Demais registradores de 8 bits (...H e ...L) , so vlidos para o divisor Os registradores AX (dividendo) e AL (quociente) e AH (resto) sempre so usados Instruo indefinida para divisor igual a zero

ADC AL, AH ADC DL, CL

SUB AL, BL SUB CL, DL

SBB AL, AH SBB DL, BL

MUL BL MUL CL

DIV DH DIV CL

INSTRUES ARITMTICAS ENTRE REGISTRADORES E DADOS DE 8 BITS


Mnemnico: ADD AL, byte ADC DH, byte Descrio da instruo: AL AL + byte DH DH + byte + carry flag Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas CL CL byte BL BL byte - carry flag Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas

SUB CL, byte SBB BL, byte

100

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES ARITMTICAS SOBRE REGISTRADORES DE 8 BITS


Mnemnico: INC AL Descrio da instruo: AL AL + 1 Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas AL AL 1 Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas CL complemento de dois do valor anterior Torna o contedo de CL negativo Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas

DEC AL

NEG CL

INSTRUES ARITMTICAS ENTRE REGISTRADORES DE 16 BITS


Mnemnico: ADD AX, BX ADD DX, CX Descrio da instruo: AX AX + BX DX DX + CX Demais combinaes entre registradores de 16 bits (...X) so vlidas AX AX + BX + carry flag BX BX + AX + carry flag Demais combinaes entre registradores de 16 bits (...X) so vlidas AX AX - CX BX BX - AX Demais combinaes entre registradores de 16 bits (...X) so vlidas AX AX - DX carry flag BX BX - AX carry flag Demais combinaes entre registradores de 16 bits (...X) so vlidas DX : AX AX . BX DX : AX AX . CX Demais registradores de 16 bits (...X) so vlidos para o multiplicador Os registradores AX (multiplicando) e DX:AX (produto) sempre so usados AX DX:AX / BX; DX resto da diviso AX DX:AX / CX ; DX resto da diviso Demais registradores de 16 bits (...X) so vlidos para o divisor Os registradores DX:AX (dividendo), AX (quociente) e DX (resto) sempre so usados. Instruo indefinida para divisor igual a zero

ADC AX, BX ADC BX, AX

SUB AX, CX SUB BX, AX

SBB AX, DX SBB BX, AX

MUL BX MUL CX

DIV BX DIV CX

101

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES ARITMTICAS ENTRE DADOS E REGISTRADORES DE 16 BITS


Mnemnico: ADD AX, word ADD BX, word Descrio da instruo: AX AX + word BX BX + word Demais registradores de 16 bits (...X) so vlidos BX BX + word + carry flag CX CX + word + carry flag Demais registradores de 16 bits (...X) so vlidos CX CX - word DX DX - word Demais registradores de 16 bits (...X) so vlidos BX BX word carry flag CX CX word carry flag Demais registradores de 16 bits (...X) so vlidos

ADC BX, word ADC CX, word

SUB CX, word SUB DX, word

SBB BX, word SBB CX, word

INSTRUES ARITMTICAS SOBRE REGISTRADORES DE 16 BITS


Mnemnico: INC AX Descrio da instruo: AX AX + 1 Demais registradores de 16 bits (...X) so vlidos BX BX - 1 Demais registradores de 16 bits (...X) so vlidos DX complemento de dois de DX, torna o contedo de DX negativo Demais registradores de 16 bits (...X) so vlidos

DEC BX

NEG DX

INSTRUES LGICAS ENTRE REGISTRADORES DE 8 BITS


Mnemnico: AND AL, BL AND DH, CL Descrio da instruo: AL AL . BL DH DH . CL Demais combinaes entre registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidas BL BL + BH DL DL + AL Demais combinaes entre registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidas AH AH (exclusive or) BH AH AH (exclusive or) CL Demais combinaes entre registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidas DL DL (exclusive or) BH DL DL (exclusive or) CL Demais combinaes entre registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidas AH (AH) ; complementa os bits do registrador BL (BL) ; complementa os bits do registrador Demais registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidos

OR BL, BH OR DL, AL

XOR AH, BH XOR AH, CL

XOR DL, BH XOR DL, CL

NOT AH NOT BL

102

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES LGICAS ENTRE REGISTRADORES E DADOS DE 8 BITS


Mnemnico: AND AL, byte Descrio da instruo: AL AL . byte Demais registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidos BL BL + byte Demais registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidos CL CL (exclusive or) byte Demais registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidos

OR BL, byte

XOR CL, byte

INSTRUES LGICAS ENTRE REGISTRADORES DE 16 BITS


Mnemnico: AND AX, BX Descrio da instruo: AX AX . BX Demais combinaes entre registradores de 16 bits (...X) so vlidas BX BX . CX Demais combinaes entre registradores de 16 bits (...X) so vlidas BX BX + CX Demais combinaes entre registradores de 16 bits (...X) so vlidas CX CX (exclusive or) AX Demais combinaes entre registradores de 16 bits (...X) so vlidas DX (DX) ; complementa os bits do registrador Demais registradores de 16 bits (...X) so vlidos

AND BX, CX

OR BX, CX

XOR CX, AX

NOT DX

INSTRUES LGICAS ENTRE REGISTRADORES E DADOS DE 16 BITS


Mnemnico: AND AX, word Descrio da instruo: AX AX . word Demais registradores de 16 bits (...X) so vlidos BX BX + word Demais registradores de 16 bits (...X) so vlidos DX DX (exclusive or) word Demais registradores de 16 bits (...X) so vlidos

OR BX, word XOR DX, word

103

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES DE TRANSFERNCIA DE DADOS ENTRE REGISTRADORES E MEMRIA


Mnemnico: MOV AL, [endereo] MOV BH, [endereo] Descrio da instruo: AL [endereo] ; carrega o contedo do endereo em AL BH [endereo] ; carrega o contedo do endereo em BH Demais registradores de 8 bits (...H ou ...L) so vlidos [endereo] AH ; carrega o contedo de AH no endereo [endereo] BL ; carrega o contedo de BL no endereo Demais registradores de 8 bits (...H ou ...L) so vlidos AL [endereo] e AH [endereo + 1] BL [endereo] e BH [endereo + 1] Demais registradores de 16 bits (...X ) so vlidos [endereo] BL e [endereo + 1] BH [endereo] CL e [endereo + 1] CH Demais registradores de 16 bits (...X ) so vlidos AL [BX] ; carrega em AL o contedo endereado por BX CH [BX] ; carrega em CH o contedo endereado por BX Demais registradores de 8 bits (...H ou ...L ) so vlidos Somente [BX] vlido [BX] AL ; carrega AL no endereo indicado por BX [BX] CH ; carrega CH no endereo indicado por BX Demais registradores de 8 bits (...H ou ...L ) so vlidos Somente [BX] vlido

MOV [endereo], AH MOV [endereo], BL

MOV AX, [endereo] MOV BX, [endereo]

MOV [endereo], BX MOV [endereo], CX

MOV AL, [BX] MOV CH, [BX]

MOV [BX], AL MOV [BX], CH

INSTRUES DE ROTAO DE UM BIT, EM REGISTRADORES DE 8 BITS


Mnemnico: ROL AL, 1 ROL BL, 1 Descrio da instruo: Rotao de AL, para a esquerda de um bit, copiando b7 na carry flag b7b6b5b4b3b2b1b0b7 e carry flag b7 Rotao de BL, para a esquerda de um bit, copiando b7 na carry flag b7b6b5b4b3b2b1b0b7 e carry flag b7 Demais registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidos Rotao de AH, para a direita de um bit, copiando b 0 na carry flag b7b6b5b4b3b2b1b0b7 e carry flag b0 Rotao de CL, para a direita de um bit, copiando b0 na carry flag b7b6b5b4b3b2b1b0b7 e carry flag b0 Demais registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidos Rotao de AL, para a esquerda de um bit, atravs da carry flag b7b6b5b4b3b2b1b0 carry flag b7 Rotao de BH, para a esquerda de um bit, atravs da carry flag b7b6b5b4b3b2b1b0 carry flag b7 Demais registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidos Rotao de AH, para a direita de um bit, atravs da carry flag b7b6b5b4b3b2b1b0 carry flag b7 Rotao de BL, para a direita de um bit, atravs da carry flag b7b6b5b4b3b2b1b0 carry flag b7 Demais registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidos

ROR AH, 1 ROR CL, 1

RCL AL, 1 RCL BH, 1

RCR AH, 1 RCR BL, 1

104

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES DE ROTAO DE N BITS, EM REGISTRADORES DE 8 BITS


Mnemnico: ROL AL, CL ROL BH, CL Descrio da instruo: Rotao de AL, para a esquerda de um nmero de bits indicado em CL e copiando b7 na carry flag Rotao de BH, para a esquerda de um nmero de bits indicado em CL e copiando b7 na carry flag Demais registradores de 8 bits (...H ou ...L) so vlidos, [BX] ou [endereo] O nmero de bits rotacionados sempre deve ficar em CL Rotao de AH, para a direita de um nmero de bits indicado em CL e copiando b0 na carry flag Rotao de BL, para a direita de um nmero de bits indicado em CL e copiando b0 na carry flag Demais registradores de 8 bits (...H ou ...L) so vlidos, [BX] ou [endereo] O nmero de bits rotacionados sempre deve ficar em CL Rotao de BL, para a esquerda de um nmero de bits indicado em CL Atravs da carry flag Rotao de BH, para a esquerda de um nmero de bits indicado em CL Atravs da carry flag Demais registradores de 8 bits (...H ou ...L) so vlidos, [BX] ou [endereo] O nmero de bits rotacionados sempre deve ficar em CL Rotao de AH, para a direita de um nmero de bits indicado em CL Atravs da carry flag Rotao de BL, para a direita de um nmero de bits indicado em CL Atravs da carry flag Demais registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidos O nmero de bits rotacionados sempre deve ficar em CL

ROR AH, CL ROR BL, CL

RCL BL, CL RCL BH, CL

RCR AH, CL RCR BL, CL

105

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES DE ROTAO DE UM BIT, EM REGISTRADORES DE 16 BITS


Mnemnico: ROL AX, 1 Descrio da instruo: Rotao de AX, para a esquerda de um bit, copiando b15 na carry flag; b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0b15 e carry flag b15 Rotao de BX, para a esquerda de um bit, copiando b15 na carry flag; b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0b15 e carry flag b15 Demais registradores de 16 bits (...X) so vlidos e

ROL BX, 1

ROR CX, 1

ROR DX, 1

Rotao de CX, para a direita de um bit, copiando b 0 na carry flag; B15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0b15 e e carry flag b0 Rotao de DX, para a direita de um bit, copiando b 0 na carry flag; B15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0b15 e e carry flag b0 Demais registradores de 16 bits (...X) so vlidos Rotao de AX, para a esquerda de um bit, atravs da carry flag; b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0 e b0carry flag b15 Rotao de BX, para a esquerda de um bit, atravs da carry flag; b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0 e b0carry flag b15 Demais registradores de 16 bits (...X) so vlidos Rotao de BX, para a direita de um bit, atravs da carry flag; b15b14b13b12b11b10b9b8 b7b6b5b4b3b2b1b0 e b0 carry flag b15 Rotao de CX, para a direita de um bit, atravs da carry flag; b15b14b13b12b11b10b9b8 b7b6b5b4b3b2b1b0 e b0 carry flag b15 Demais registradores de 16 bits (...X) so vlidos

RCL AX, 1 RCL BX, 1

RCR BX, 1

RCR CX, 1

106

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES DE ROTAO DE N BITS, EM REGISTRADORES DE 16 BITS


Mnemnico: ROL AX, CL ROL BX, CL Descrio da instruo: Rotao de AX, para a esquerda de um nmero de bits indicado em CL e copiando b15 na carry flag Rotao de BX, para a esquerda de um nmero de bits indicado em CL e copiando b15 na carry flag Demais registradores de 16 bits (...X) so vlidos O nmero de bits rotacionados sempre deve ficar em CL Rotao de AX, para a direita de um nmero de bits indicado em CL e copiando b0 na carry flag Rotao de BX, para a direita de um nmero de bits indicado em CL e copiando b0 na carry flag Demais registradores de 16 bits (...X) so vlidos O nmero de bits rotacionados sempre deve ficar em CL Rotao de BX, para a esquerda de um nmero de bits indicado em CL Atravs da carry flag Rotao de CX, para a esquerda de um nmero de bits indicado em CL Atravs da carry flag Demais registradores de 16 bits (...X) so vlidos O nmero de bits rotacionados sempre deve ficar em CL Rotao de AX, para a direita de um nmero de bits indicado em CL Atravs da carry flag Rotao de BX, para a direita de um nmero de bits indicado em CL Atravs da carry flag Demais registradores de 16 bits (...X) so vlidos O nmero de bits rotacionados sempre deve ficar em CL

ROR AX, CL ROR BX, CL

RCL BX, CL RCL CX, CL

RCR AX, CL RCR BX, CL

INSTRUES DE SADA DE DADOS


Mnemnico OUT porta, AL OUT DX, AL OUT porta, AX OUT DX, AX Descrio da instruo: (porta ) AL ; sada de dados, envia o contedo de AL para a porta cujo endereo fornecido (endereo de 8 bits) (DX) AL ; envia o contedo de AL para a porta cujo endereo especificado em DX (endereo de 16 bits) (porta ) AX ; sada de dados, envia o contedo de AX para a porta cujo endereo fornecido (endereo de 8 bits) (DX) AX ; envia o contedo de AX para a porta cujo endereo especificado em DX (endereo de 16 bits)

INSTRUES DE ENTRADA DE DADOS


Mnemnico IN AL, porta IN AL, DX IN AX, porta IN AX, DX Descrio da instruo: AL (porta) ; entrada de dados; L o byte presente na porta cujo endereo fornecido, e o carrega em AL (endereo de 8 bits) AL (DX) ; L o byte presente na porta cujo endereo especificado em DX e o carrega em AL (endereo de 16 bits) AX (porta) ; entrada de dados; L o byte presente na porta cujo endereo fornecido, e o carrega em AX (endereo de 8 bits) AX (DX) ; L o byte presente na porta cujo endereo especificado em DX e o carrega em AX (endereo de 16 bits)

107

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES PARA COMPARAES ENTRE REGISTRADORES DE 8 BITS


Mnemnico: CMP AL, AH CMP BL, CL Descrio da instruo: (flags) (status da comparao de AL com AH) (flags) (status da comparao de BL com CL) Demais combinaes entre registradores de 8 bits (...H e ...L) , [BX] ou [endereo] so vlidas

INSTRUES PARA COMPARAES ENTRE REGISTRADORES E DADOS DE 8 BITS


Mnemnico: CMP AL, byte CMP BL, byte Descrio da instruo: (flags) (status da comparao de AL com byte) (flags) (status da comparao de BL com byte) Demais registradores de 8 bits (...H ou ...L) , [BX] ou [endereo] so vlidos

INSTRUES PARA COMPARAES ENTRE REGISTRADORES DE 16 BITS


Mnemnico: CMP AX, BX CMP BX, DX Descrio da instruo: (flags) (status da comparao de AX com BX) (flags) (status da comparao de BX com DX) Demais combinaes entre registradores de 16 bits (...X) so vlidas

INSTRUES PARA COMPARAES ENTRE REGISTRADORES E DADOS DE 16 BITS


Mnemnico: CMP AX, word CMP BX, word Descrio da instruo: (flags) (status da comparao de AX com word) (flags) (status da comparao de BX com word) Demais registradores de 16 bits (...X) so vlidos

INSTRUES PARA DESVIO INCONDICIONAL


Mnemnico: JMP endereo Descrio da instruo: IP endereo fornecido (salto dentro do segmento indicado por CS)

INSTRUES PARA DESVIO CONDICIONAL


Mnemnico: JZ endereo JNZ endereo JC endereo JNC endereo Descrio da instruo: Se a flag zero indicar resultado igual a zero, IP endereo Se a flag zero indicar resultado diferente de zero, no h desvio Se a flag zero indicar resultado igual a zero, no h desvio Se a flag zero indicar resultado diferente de zero, IP endereo Se a flag carry indicar que houve um overflow, IP endereo Se a flag carry indicar que no houve um overflow, no h desvio Se a flag carry indicar que houve um overflow, no h desvio Se a flag carry indicar que no houve um overflow, IP endereo

INSTRUES PARA USO DE SUB-ROTINAS


Mnemnico: CALL endereo Descrio da instruo: Chamada de subprotina IP endereo e Pilha Operacional ( IP anterior + 2 ) Retorno de sub-rotina IP (dois bytes do topo da Pilha Operacional)

RET

108

Laboratrio de Microprocessadores

Wilson Ruiz

INSTRUES PARA USO DA PILHA OPERACIONAL


Mnemnico: PUSH AX PUSH BX PUSH CX PUSH DX PUSHF POP AX POP BX POP CX POP DX POPF Descrio da instruo: Pilha Operacional AX Pilha Operacional BX Pilha Operacional CX Pilha Operacional DX Pilha Operacional Registrador de flags AX Topo da Pilha Operacional BX Topo da Pilha Operacional CX Topo da Pilha Operacional DX Topo da Pilha Operacional Registrador de flags Topo da Pilha Operacional

INSTRUO PARA REPETIO CCLICA


Mnemnico: LOOP endereo Descrio da instruo: IP endereo (salto dentro do segmento indicado por CS) O desvio realizado enquanto o contedo de CX for maior que zero Caso contrrio a prxima instruo do programa executada CX o contador de repeties

INSTRUO SEM OPERAO


Mnemnico: NOP Descrio da instruo: No realiza operao alguma

INSTRUO DE PARADA
Mnemnico: HLT Descrio da instruo: Produz a parada do processador, usada para a finalizao de um processamento cclico.

109

Laboratrio de Microprocessadores

Wilson Ruiz

5.4 Bibliografia Linguagem Assembly para IBM PC Peter Norton e John Socha Editora Campus Guia do Programador para IBM PC Peter Norton Editora Campus Desvendando o PC Peter Norton Editora Campus PC Assembler usando DOS Daniel G. A. Quadros Editora Campus Turbo Assembler e Macro Assembler Guia do Usurio Jeremias Pereira dos Santos Mc Graw Hill 8086 e 8088 Hardware, Software, Aplicaes e Projetos Wilson Alonso Dias Jr. Mc Graw Hill The 8088 Project Book Robert Grossblatt Tab Books Inc The 8088 and 8086 Microprocessors W. Triebel, A. Singh Prentice-Hall International Editions The 8086/8088 Family: Design, Programming, and Interfacing John Uffenbeck Prentice-Hall International Editions PC: um Guia Prtico de Hardware e Interfaceamento - 2a Edio Ricardo Zelenovsky e Alexandre Mendona MZ Editora Ltda. Interrupes do MS-DOS - Guia de Consulta Rpida Adlich Novatec Editora Notas de aulas diversas 2002/W.R. 110