sap-2.pdf
Short Description
Download sap-2.pdf...
Description
CONTEÚDO DO CAPÍTULO 11 –(SAP-2) 11.0
Introdução ........................... ......................................... ............................ ............................ ........................... ..................... ........ 03
11.1
......................................... ............................ ..................... ....... 03 Registradores Bidirecionais...........................
11.2
........................................ ............................ ............................ ............................ ..................... ....... 03 Arquitetura .......................... • • • • • • • • •
•
11.3
......................................... ................... ..... 06 Instruções com Referência à Memória........................... • • •
11.4
•
•
• • • • •
JMP,12 JM,12 JZ,13 JNZ,13 CALL e RET,14 Mais sobre Flags,15
........................................ ............................ ............................ ........................ .......... 20 Instruções Lógicas.......................... • • • • • • •
11.7
MOV,09 ADD e SUB,10 SUB,10 INR e DCR,10
Instruções JUMP e CALL.......................... ........................................ ............................ ............................ .............. 12 •
11.6
LDA eSTA,06 MVI,07 Códigos de Operação,07
Instruções de registradores........................... ......................................... ............................ ...................... ........ 09 •
11.5
Portas de Entrada,03 Contador de Programa,03 REM e Memória,04 Registrador de Dados de Memória,04 Registrador de Instrução,04 Controlador-sequencializador,05 Acumulador,05 ULA e Flags,06 Registradores TMP,B e C,06 Portas de Saída,06
CMA,20 ANA,20 ORA,21 XRA,21 ANI,21 ORI,21 XRI,22
......................................... ............................ ............................ ......................... ........... 22 Outras Instruções........................... • • • • •
NOP,22 HLT,22 OUT,22 RAL,23 RAR ,23
1
11.8
Resumo do SAP-2........................... ......................................... ........................... ........................... ......................... ........... 25 • • • • •
Estados T,25 Flags(Bandeiras),26 Saltos Condicionais,26 Modos de Endereçamento,27 Bytes,28
......................................... ............................ ............................ ............................ ........................... ....................... .......... 36 Glossário........................... ........................................ ............................ ............................ ............................ ................. ... 36 Exercícios de Fixação..........................
Problemas.......................... ........................................ ............................ ............................ ............................ ............................ ...................... ........ 37
2
11.8
Resumo do SAP-2........................... ......................................... ........................... ........................... ......................... ........... 25 • • • • •
Estados T,25 Flags(Bandeiras),26 Saltos Condicionais,26 Modos de Endereçamento,27 Bytes,28
......................................... ............................ ............................ ............................ ........................... ....................... .......... 36 Glossário........................... ........................................ ............................ ............................ ............................ ................. ... 36 Exercícios de Fixação..........................
Problemas.......................... ........................................ ............................ ............................ ............................ ............................ ...................... ........ 37
2
SAP-2 O SAP-1 é um computador porque ele, primeiramente, armazena um programa e os dados antes de começar os cálculos e, então, executa automaticamente as instruções do programa sem a intervenção humana. E, também, o SAP-1 é uma máquina primitiva. Ele se compara com o computador moderno da mesma forma que o homem das cavernas de compara com o homem moderno.Algo está ausente nele, algo que pode ser encontrado em qualquer computador moderno. O SAP-2 é o próximo passo da evolução em direção ao computador moderno porque inclui instruções de salto. Estas novas instruções obrigam o computador a repetir ou omitir partes de um programa. Como você verá, as instruções de salto abrem as portas para toda uma nova capacidade computacional.
11-1 REGISTRADORES BIDlRECIONAlS Para reduzir a capacitância da fiação do SAP-2, usaremos apenas um conjunto de fios entre cada registrador e o barramento. A Fig. 11-1a mostra a idéia. Os pinos de entrada e saída são ligados entre si; apenas um grupo de fios é conectado ao barramento. Esta sobreposição de pinos causa problemas? Não. Durante o funcionamento do computador, tanto LOAD como HABILITA podem estar ativos, mas nunca ao mesmo tempo. Um LOAD ativo significa que uma palavra binária flui do barramento para a entrada do registrador; durante uma operação de carga, as linhas de saída estão flutuando. Por outro lado, um HABILITA ativo significa que os dados estão fluindo do registrador para o barramento e, neste caso, as linhas de entrada estão flutuando. O fabricante do CI pode ligar internamente os pinos de entrada e de saída de um registrador de três estados. Além de diminuir a capacitância de fiação, isto diminui o número de pinos de E/S. Por exemplo, a Fig. 11-1b mostra quatro pinos de E/S em vez de oito. A Fig. 11.1c é o símbolo de um registrador registrador de três estados com os pinos de entrada e saída interconectados internamente. As setas duplas lembram-nos que o caminho é bidirecional ;os ;os dados movem-se nos dois sentidos.
11-2 ARQUITETURA A Fig. 11-2 mostra a arquitetura arquitetura do SAP-2. Todos Todos os registradores ligados ligados ao barramento W são de três estados; os demais são de dois estados. Como antes, o controlador-sequencidor envia sinais de controle (não ilustrados) para cada registrador. Estes sinais de controle carregam, habilitam ou de alguma outra forma preparam o registrador para a próxima borda positiva do sinal de relógio. A seguir, dar-se-á uma breve descrição de cada caixa.
Portas de Entrada O SAP-2 tem duas portas de entrada, numeradas com 1 e 2. Um codificador hexadecimal de teclado está ligado à porta 1. Ele nos permite dar entrada a dados e instruções hexadecimais através da porta 1. Observe que o codificador do teclado envia um sinal de READY (pronto) para o bit 0 da porta 2, Este sinal indica quando o dado da porta 1 está válido. Observe também o sinal SERlAL IN indo para o pino 7 da porta 2. Um exemplo posterior mostrará como converter dados seriados de entrada em dados paralelos.
Contador de Programa Desta vez o contador de programa tem 16 bits. Portanto, ele pode contar de
PC = 0000 0000 0000 0000 Até
PC = 1111 1111 1111 1111
3
Isto equivale a contar de 0000H a FFFFH ou em decimal de O a 65.535. Um sinal baixo CLR zera o PC (contador de programa) antes do computador começar a executar um programa; assim, a primeira instrução a ser executada é a armazenada na posição 0000H memória.
REM e Memória Durante o ciclo de busca, o REM (registrador de endereço de memória) recebe endereços de 16 bits do contador de programa. Então, a saída de dois estados do REM indica a posição desejada de memória. A memória tem uma ROM de 2K com endereços de 0000H a 07FFH. Esta ROM contém um programa, o monitor , que inicializa o computador ao ser ligado; interpreta as entradas do teclado e assim por diante. O restante da memória é uma RAM de 62K com endereços de 0800H a FFFFH.
Registrador de Dados de Memória O registrador de dados de memória ( DMR) é um registrador buffer de 8 bits. A sua da saída alimenta a RAM, O registrador de dados de memória recebe dados do barramento antes de uma operação de escrita e envia dados para o barramento depois de uma operação de leitura.
Registrador de Instrução Como o SAP-2 tem mais instruções que o SAP-1, usaremos 8 bits em vez de 4, para o código de operação. Um código de operação de 8 bits pode acomodar 256 instruções. Como o SAP-2 tem apenas 42 instruções, não haverá problemas com a codificação das instruções. O uso de um código de operação de 8 bits também permitirá posterior compatibilização com o conjunto de instruções do 8080/8085 que se baseia também em 8 bits. Como foi mencionado anteriormente, todas as instruções SAP são idênticas às instruções do 8080/8085.
Fig. 11-1 Registrador bidirecional.
4
Controlador-Sequencializador O controlador-sequencializador produz as palavras de controle ou microinstruções que coordenam e dirigem o restante do computador. Como o SAP-2 tem um repertório de instruções maior, o controlador-sequencializador tem mais hardware. Apesar da palavra CON ser maior, a idéia é a mesma: a palavra de controle ou microinstrução determina como os registradores devem reagir à próxima borda positiva de relógio.
Acumulador Enquanto a saída de dois estados do acumulador vai para a ULA, a saída de três estados vai para o barramento W. Assim, a palavra de 8 bits do acumulador alimenta continuamente a ULA. Entretanto, esta mesma palavra aparece no barramento apenas quando E A está ativo.
Fig. 11-1 Registrador bidirecional.
5
ULA e Flags As ULAs estão comercialmente disponíveis como circuitos integrados. Elas têm 4 ou mais bits de controle que determinam a operação lógica ou aritmética a ser executada com as palavras A e B. A ULA usada no SAP-2 inclui operações lógicas e aritméticas. Neste livro, um flag (bandeira) é um flip-flop que informa sobre uma condição variável durante a execução de um programa. O SAP-2 tem 2 flags. O flag de sinal é setado quando o conteúdo do acumulador torna-se negativo durante a execução de algumas instruções. O flag de zero é setado quando o conteúdo do acumulador toma-se zero.
Registradores TMP , B e C Em vez de usar o registrador B para guardar o dado que está sendo adicionado ou subtraído do acumulador, usa-se um registrador temporário (TMP). Isto nos traz maior liberdade ao usar o registrador B. Além dos registradores TMP e B, o SAP-2 tem também um registrador C. Isto nos dá maior flexibilidade ao mover dados durante uma "rodada" de computador.
Portas de Saída O SAP-2 tem duas portas de saída, numeradas 3 e 4. O conteúdo do acumulador pode ser carregado na porta 3 que alimenta um display hexadecimal. Isto nos permite ver os dados processados. O conteúdo do acumulador também pode ser enviado para a porta 4. Observe que o pino 7 da porta 4 envia um sinal de ACKNOWLEDGE (reconhecimento) para o codificador hexadecimal. Este sinal de ACKNOWLEDGE e o sinal de READY fazem parte de um conceito chamado handshaking ("aperto de mãos") a ser discutido posteriormente. Observe também o sinal de SERIAL OUT (saída em série) que sai do pino 0 da porta 4. Um dos exemplos nos mostrará como converter os dados paralelos do acumulador em dados seriados de saída.
11-3 INSTRUÇÕES COM REFERÊNCIA À MEMÓRIA O ciclo de busca do SAP-2 é o mesmo de antes. T1 é o estado de endereço, T2 é o estado de incremento e T3 é o estado de memória: Portanto, todas as instruções do SAP-2 usam memória durante o ciclo de busca porque toda instrução de programa é transferida da memória para o registrador de instrução. Durante o ciclo de execução, entretanto, a memória pode ou não ser usada dependendo do tipo de instrução que foi buscada. Uma instrução com referência à memória ( IRM) é aqueIa que usa a memória durante o ciclo de execução. O conjunto de instruções do SAP-2 apresenta 42 instruções, O que se expõe a seguir é uma descrição das instruções com referência à memória.
LDA e STA LDA (load accumulator) tem o mesmo significado de antes: carregar o acumulado com o dado endereçado na memória. A única diferença é que mais posições de memória podem ser acessadas no SAP-2 porque os endereços vão de 0000H até FFFFH. Por exemplo, LDA 2000H significa carregar o acumulador com o conteúdo da posição 2000H na memória. Para se distinguir as diferenças de uma instrução,o mnemônico e chamado algumas vezes de código de operação e o restante da instrução é conhecido como operando. Em LDA 2000H, LDA é o código de operação e 2000H é o operando Assim, "código de operação" pode significar duas coisas na área de rnicrocomputadores: pode significar o mnemônico ou o código binário utilizado para representar o mnemônico. O significado pretendido torna-se claro a partir do contexto. STA (store accumulator) é um mnemônico para armazenar o acumulador . Todas as instruções STA necessitam de um endereço. STA 7FFFH significa armazenar o conteúdo do acumulador na posição 7FFFH da memória. Se
6
A= 8AH a execução de STA 7FFFH armazena 8AH no endereço 7FFFH.
MVI MVI (move immediate) é o mnemônico para mova imediato. Esta instrução diz para o computador carregar um registrador indicado com o byte que sucede imediatamente o código de operação. Por exemplo, MVI A,37H diz para o computador carregar o acumulador com 37H. Depois da execução desta instrução, o conteúdo do acumulador será
A= 0011 0111 Você pode usar a instrução MVI com os registradores A, B e C. Os formatos destas instruções são
MVI A,byte MVI-B,byte MVI C,byte Códigos de Operação A Tabela 11-1 mostra os códigos de operação do conjunto de instruções do SAP-2. Estes são códigos de operação do 8080/8085. Como você pode ver, 3A é o código de operação para LDA, 32 é o código de operação para STA etc. Refira-se a esta tabela no restante deste capítulo. EXEMPLO 11-1 Mostre os mnemônicos de um programa que carrega o acumulador com 49H, o registrador B com 4H e o registrador C com 4BH. A seguir o programa armazena o conteúdo do acumulador na posição 6285H da memória.
SOLUÇÃO Aqui está um programa que funcionará:
Mnemônicos MVI A,49H MVI B,4AH MVI C,4BH STA 6285H HLT As três primeiras instruções carregam 49H, 4AH e 4BH nos registradores A, B e C. STA 6285H armazena o conteúdo do acumulador em 6285H. Observe o uso de HLT neste programa. Ele tem o mesmo significado de antes: parar o processamento dos dados.
7
EXEMPLO 11-2 Converta o programa anterior para a linguagem de máquina do 8080/8085 usando os códigos de operação da Tabela 11-1 .Comece no endereço 2000H. SOLUÇÃO
Há duas novas idéias neste programa em linguagem de máquina. Com a instrução
MVI A,49H observe que o código de operação vai no primeiro endereço e o byte vai no segundo endereço.Isto é válido para todas as instruções de dois bytes: o código de operação na primeira posição disponível de memória e o byte na seguinte. A instrução STA 6285H é uma instrução de três bytes (1 byte para o código de operação e 2 bytes para o endereço). O código de operação de STA é 32H. Este byte vai na primeira posição disponível de memória, que é 2006H. O endereço 6285H tem dois bytes. O byte inferior 85H vai na próxima posição de memória e o byte superior 62H na seguinte. Por que o endereço é programado com o byte inferior primeiro e o byte superior depois? Isto é uma peculiaridade do projeto original do 8080. Para manter a compatibilidade, o 8085 e outros microprocessadores seguiram esta mesma disposição dos bytes de endereço na memória de programa. A última instrução HLT tem um código de operação de 76H armazenado na posição 2009H da memória. Em resumo, as instruções MVI são de 2 bytes, a STA é uma instrução de 3 bytes e a HLT é de 1 byte.
8
TABELA 11-1. CÓDIGOS DE OPERAÇÃO DO SAP-2
11-4 INSTRUÇÕES DE REGISTRADORES . As instruções com referência à memória são relativamente lentas porque necessitam de mais de um acesso à memória durante o ciclo de instrução. Além disso, seguidamente queremos transferir dados de um registrador para outro sem ter de passar pela memória. A seguir veremos algumas das instruções de registradores do SAP-2 que foram projetadas para mover dados de um registrador para outro no menor tempo possível.
MOV MOV (move) é o mnemônico de mova. Esta instrução diz para o computador mover dados de um registrador para outro. Por exemplo, MOV A,B diz para o computador mover o conteúdo do registrador B para o acumulador. O conteúdo de B é copiado sem ser destruído. Por exemplo, se
A= 34H
B = 9DH
e
então a execução de MOV A,B resulta em
A= 9DH B = 9DH 9
Você pode mover dados entre os registradores A, B e C. Os formatos de todas as instruções MOV são
MOV A,B MOV A,C MOV B ,A MOV B.C MOV C,A MOV C,B Estas instruções são as mais rápidas do conjunto de instruções do SAP-2 porque exigem apenas um ciclo de máquina. ADD e SUB ADD (add ) significa adicionar o conteúdo do registrador designado ao acumulador. Por exemplo, ADD B significa adicionar o conteúdo do registrador B ao acumulador. Se
A= 04H
e
B = 02H
então a execução de ADD B resulta em
A=06H De maneira parecida, a instrução SUB significa subtrair o conteúdo do registrador designado do acumulador. SUB C irá subtrair o conteúdo do registrador C do acumulador. Os formatos das instruções ADD e SUB são
ADD B ADD C SUB B SUB C INR e DCR Muitas vezes desejamos incrementar ou decrementar o conteúdo de um dos registradores. INR é o mnemônico para incrementar que manda o computador incrementar o registrador designado. DCR é o mnemônico de decrementar que manda o computador decrementar o registrador designado. Os formatos destas instruções são
INR A INR B INR C DCR A DCR B DCR C A título de exemplo, se
B = 56H
e
então, a execução de INR B resulta em
10
C= 8AH
B = 57H e a execução de DCR C produz
C= 89H EXEMPLO 11-3 Mostre os mnemônicos necessários para somar os números decimais 23 e 45. A resposta deve ser armazenada na posição 5600H de memória. Além disto, a resposta incrementada de uma unidade deve ser armazenada no registrador C.
SOLUÇÃO Os números decimais 23 e 45 são equivalentes a 17H e 2DH. Aqui está um programa capaz de realizar esta tarefa:
EXEMPLO 11-4 . Montar manualmente um programa significa traduzir um programa fonte num programa de máquina à mão em vez de usar uma máquina. Monte manualmente o programa do exemplo precedente no endereço 2000H.
SOLUÇÃO Observe que as instruções ADD, INR, MOV e HLT são de 1 byte; as instruções MVI são de 2 bytes e a instrução STA, de 3 bytes.
11
11-5 INSTRUÇÕES JUMP E CALL . O SAP-2 tem três instruções de s altar( jump) que podem alterar a seqüência de instruções dentro de um programa.Em outras palavras, em vez de buscar a próxima instrução da maneira usual, o computador pode saltar ou desviar para uma outra parte do programa.
JMP Para começar , JMP é o mnemônico para saltar ( jump) que manda o computador buscar a próxima instrução da posição designada da memória. Toda instrução JMP inclui um endereço que é carregado no contador de programa. Por exemplo,
JMP 3000H diz ao computador para buscar a próxima instrução na posição 3000H de memória.
Fig. 11.3 (a) Salto incondicional; (b) salto condicional
Aqui está o que aconte ce. Suponha que JMP 3000H está armazenado na posição 2005H como ilustrado na Fig. 11-3a. No final do ciclo de busca, o contador de programa contém
PC = 2006H Durante o ciclo de execução, a JMP 3000H carrega o contador de programa com o endereço designado:
PC = 3000H Quando o próximo ciclo de busca começar, a próxima instrução virá de 3000H e não de 2006H (ver Fig. 11-3a).
JM O SAP-2 tem dois flags: o de sinal e o de zero. Durante a execução de algumas instruções, estes flags serão setados ou zerados dependendo do que acontece com o conteúdo do acumulador. Se o
12
conteúdo do acumulador se tornar negativo, o flag de sinal será setado, se não, será zerado. Simbolicamente
onde S significa flag de sinal. O flag de sinal permanecerá setado ou zerado até que uma nova operação o afete. JM é um mnemônico para saltar se menos ( jump if minus). O computador saltará para o endereço designad o somente se o flag de sinal estiver setado. Por exemplo, suponha que uma JM 3000H esteja armazenada em 2005H. Depois da busca desta instrução,
PC = 2006H Se S = 1 , a execução da JM 3000H carregará o contador de programa com
PC = 3000H Como o contador de programa contém agor a o valor 3000H, a próxima instrução virá de 3000H. Se a condição de saltar não for verdadeira ( S = O), o contador de programa permanecerá inalterado durante o ciclo de execução. Assim, durante o próximo ciclo de busca, a instrução será buscada de 2006H. A Fig. 11-3b simboliza as duas possibilidades para uma instrução JM. Se a condição de menos for satisfeita, o com putador saltará para 3000H. Caso contrário, o programa seguirá normalmente como se nada tivesse acontecido.
JZ O outro flag afetado pelas operações de acumulador é o de zero. Durante a execução de algumas instruções, o acumulador se tornará zero. Para registrar este evento, o flag de zero será setado. Se o conteúdo do, acumulador não se tornar zero, o flag de zero será zerado. Simbolicamente
JZ é o mnemônico para saltar se zero ( jump if zero) que manda o computador saltar para o endereço designado apenas se o flag de zero estiver setado. Suponha que uma JZ 3000H esteja armazenada em 2005H. Se Z = 1 durante a execução da JZ 3000H, então a próxima instrução será buscada em 3000H. Caso contrário, Z = 0, a próxima instrução virá de 2006H. JNZ JNZ significa saltar se não zero ( jump if not zero ). Ela manda o computador saltar para o endereço designado apenas quando o flag de zero estiver zerado. Quando o flag de zero estiver setado, não haverá salto. Suponha que uma JNZ 7800H esteja em 2100H. Se Z = 0, a próxima instrução virá de 7800H; entretanto, se Z = 1, o programa passará por cima indo para a instrução armazenada em 2101H. JM, JZ e JNZ são instruções de salto condicional, porque o saldo no programa ocorre apenas quando certas condições estão satisfeitas. Por outro lado, JMP é incondicional, porque depois que a instrução for buscada, o ciclo de execução sempre fará o programa pular para o endereço especificado.
13
CALL e RET Uma sub-rorina é um programa armazenado na memória para um possível uso num outro programa. Mu itos microcomputadores têm sub-rotinas para o cálculo de senos, co-senos, tangentes. logaritmos, raízes quadradas etc. Estas sub-rotinas fazem parte do software fornecido com o microcomputador. CALL (chamar) é um mnemônico para chamar sub-rotina. Toda instrução CALL deve incluir o endereço inicial da sub-rotina desejada. Por exemplo, se uma sub-rotina para raiz quadrada começar no endereço 5000H e uma de logaritmo começar no endereço 6000H, a execução de
CALL 5000H irá fazer um salto para a sub-rotina de raiz quadrada. Por outro lado, uma CALL 6000H produzirá um salto para a sub-rotina de logaritmo. RET significa retornar . Ela é usada no fim de todas as sub-rotinas para mandar o computador retomar ao programa original. Uma instrução RET está para uma sub-rotina assim como uma instrução HLT está para um programa. Ambas diz em ao computador que algo está terminado. Se você esquecer de colocar RET no fim de uma sub-rotina, o computador não poderá voltar ao programa original e você acabará obtendo entulho de computador. Quando uma CALL é executada no SAP-2, o conteúdo do contador de programa é automaticamente resguardado nas posições de memória FFFEH e FFFFH (as duas últimas posições da memória). Então, o endereço que acompanha a CALL é carrega do no contador de programa para que a execução possa começar no primeiro endereço da sub-rotina. Quando a sub-rotina termina, a instrução RET faz com que o endereço depositado nas posições FFFEH e FFFFH seja carregado de volta no contador de programa. Isto devolve o controle ao programa original. A Fig. 11-4 mostra o fluxo de programa durante uma sub-rotina. A instrução CALL 5000H envia o computador para a sub-rotina localizada na posição 5000H. Quando esta sub-rotina estiver encerrada, a instrução RET enviará o computador de volta para a instrução que sucede a CALL no programa principal.
Fig. 11-4 A instrução CALL
Assim como a JMP , a CALL é incondicional. Logo que uma CALL for buscada do registrador de instrução, o computador saltará para o endereço inicial da sub-rotina.
14
Mais sobre os Flags Os flags de zero e de sinal poderão ser setados ou zerados durante a execução de certas instruções. A Tabela 1 1-2 lista as instruções do SAP-2 que afetam os flags. Todas estas instruções usam o acumulador durante o ciclo de execução. Se o acumulador se tornar zero ou negativo enquanto uma destas instruções estiver sendo executada, o flag de zero ou de sinal será setado. Por exemplo, suponha que a instrução que está sendo executada seja ADD C. O conteúdo do registrador C é adicionado ao conteúdo do acumulador. Se o conteúdo do acumulador se tornar zero ou negativo no processo, o flag de zero ou de sinal será setado. Uma palavra ainda sobre as instruções INR e DCR. Como estas instruções usam o acumulador para incrementar ou decrementar 1 do registrador designado, elas também afetam os flags.Por exemplo, para executar uma DCR C, o conteúdo do registrado r C é enviado para o acumulador, subtraído de 1 e devolvido ao registrador C. Se o acumulador se tornar negativo, o flag de sinal será setado e, se o acumulador se tornar zero, o flag de zero será setado. TABELA 11-2. INSTRUÇÕES QUE AFETAM OS FLAGS
EXEMPLO 11.5 Faça a montagem manual do seguinte programa que inicia no endereço 2000H:
SOLUÇÃO
MVI C,O3H DCR C JZ 0009H JMP 0002H HLT
15
EXEMPLO 11-6 No programa anterior, quantas vezes a instrução DCR é executada?
SOLUÇÃO A Fig. 11-5 ilustra o fluxo de programa. Aqui está o que acontece. A instrução MVI C,03H carrega o registrador C com 03H. A DCR reduz o conteúdo para 02H. O conteúdo é superior a zero; portanto, o flag de zero é zerado e a instrução JZ 2009H é ignorada. A JMP 2002H faz o computador voltar à instrução DCR C.
Fig. 11-5 Laço de operações repetidas.
Na segunda vez que a DCR C é executada, o conteúdo desce para 01H e o flag de zero ainda continua zerado.JZ 2009H é novamente ignorada e a JMP 2002H faz o computador voltar para DCR C. Na terceira DCR C, o conteúdo vai a zero. Desta vez, o flag de zero é setado e, então, a JZ 2009H faz o programa pular para a instrução HLT. Um laço é uma parte de um programa que é repetida. Neste exemplo, nós passamos três vezes através do laço ( DCR C e JZ 2009H), como ilustrado na Fig. 11-5. Note que o número de vezes que se passou pelo laço é igual ao número inicialmente presente no registrador C. Se mudarmos a primeira instrução para MVI C,07H o computador fará 7 passagens pelo laço. Da mesma forma, se desejarmos passar.200 ( C8H) vezes pelo laço; a primeira instrução seria MVI C,C8H O registrador C age como um contador decrementador pré-ajustável. Esta é a razão pela qual o registrador C é algumas vezes conhecido como um contador. O ponto a ser lembrado é o seguinte. Podemos montar um laço usando MVI, DCR, .JZ e JMP num programa. O número carregado no registrador designado (o contador) determina o número de passagens pelo laço. Se colocarmos mais instruç ões dentro do laço, estas instruções adicionais serão executadas X vezes, onde X é o número colocado inicialmente no contador. EXEMPLO 11-7 Quando você compra um microcomputad or, você adquire junto normalmente software par realizar diferentes tarefas. Um dos programas que você pode adquirir é um assembler. O assembler lhe permite escrever programas na forma de mnemônicos. Então, o assembler converte estes mnemônicos em linguagem de máqu ina. Em outras palavras, quando você tem um assembler, não 16
precisa mais fazer montagem manual de se us programas; o computador fará isto por você.Mostre a versão em linguagem assembler do programa do Exemplo 11-5. Inclua rótulos e comentários. SOLUÇÃO
Quando você escreve um programa, ajuda muito colocar os seus próprios comentários sobre o que cada instrução deve supostamente fazer. Estes comentários ativarão sua própria memória quando você voltar a ler o programa meses depois. O primeiro comentário nos lembra que estamos inicializando o contador com o decimal 3; o segundo comentário nos lembra que es tamos decrementa ndo o contador; o terceiro comentário nos diz que vamos testar o zero antes de saltar e, finalmente, o quarto comentário nos diz que o programa vai repetir o laço. Quando o assembler converte o seu programa fonte em programa objeto, ele ignora tudo o que está após o ponto e vírgula. Por quê? Porque o assembler foi escrito assim. O ponto e vírgula é uma maneira codificada de lembrar o computador de que comentários pessoais se seguirão. (Lembre-se do ,código ASCII. 3BH é o ASCII para o ponto e vírgula. Quando assembler encontra 3BH ele sabe que comentários se seguirão.) O uso de rótulos é um outro auxílio usado com saltos e chamadas de sub-rotinas. Ao se escrever um programa em assembler, normalmente não se tem nenhuma idéia dos endereços que devem acompanhar as instruções de salto e de chamada de sub-rotina. Ao usar um rótulo no lugar de um endereço, poderemos escrever programas que nos farão sentido. O assembler atribuirá corretamente endereços aos nossos rótulos. Esta é uma notável característica de um assembler, porque nos proporciona uma grande economia de esforços. Por exemplo, quando o assembler converte o programa anterior para a linguagem de máquina, ele substitui JZ por CA (Tabela 11-1 de códigos de operação) e END pelo e endereço da instrução HLT. Da mesma forma, ele substituirá JMP por C3 (código de operação) REPEAT pelo endereço da instrução DCR C. O assembler determina os endereços das instruções HLT e JMP contando o número de bytes necessários a todas as instruções e determinando onde as instruções HLT e DCR C ficarão no programa final montado. Tudo o que você precisa se lembrar é de que você pode usar quaisquer rótulos que desejar para as instruções de salto e de chamada de sub-rotina. O mesmo rótulo seguido de dois pontos é colocado na frente da instruçã o para onde você está tentando saltar. Quando o assembler estiver convertendo o seu programa para linguagem de máquina, os dois pontos indicarão que um rótulo está presente. Mais um comentário sobre os rótulos. No SAP-2, os rótulos podem ter de um a seis caracteres, onde o primeiro sempre é uma letra. Os rótulos são normalmente palavras ou abreviações, mas números podem ser incluídos. A seguir temos exemplos de rótulos válidos:
REPEAT DELAY RDKBD A34 B12C3 Os dois primeiros são palavras; o terceiro é uma abreviação e os dois últimos incluem números.As restrições quanto ao comprimento (não mais de seis caracteres) e quanto ao caracter inicial ( deve ser uma letra) são típicas dos assemblers comerciais.
17
EXEMPLO 11-8 Mostre um programa para multiplicar os decimais 12 e 8;
SOLUÇÃO Os equivalentes hexadecimais de 12 e 8 são 0CH e 08H. Vamos montar um laço que adiciona 12 ao acumulador em cada passagem. Se o computador repetir o laço 8 vezes, o conteúdo do acumulador atingirá 96 (decimal) no final. Aqui está um programa em assembler que fará a tarefa:
Os comentários contam quase toda a história. Primei ro, nós zeramos o acumulador, A seguir, colocamos o decimal 12 no registrador B. Então, o con tador é inicializado com o decimal 8. Estas tr ês instruções constituem parte da inicialização que precede a entrada no laço. A instrução ADD B começa o laço adicionando o decimal 12 ao acumulador. A DCR C diminui o contador para 7. Como o flag de zero está zerado, a JZ DONE é ignorada na primeira vez que se passa pelo laço de repetição, e o programa retoma para a instrução ADD B. Você deve ser capaz de saber o que ocorrerá a seguir. A ADD B dentro do laço será executada 8 vezes. Depois de 8 passagens pelo laço, o flag de zero será setado; então, a JZ DONE (DONE em inglês significa feito) levará o programa para fora do laço na instrução HLT. Como 12 é adicionado 8 vezes, 12 + 12 + 12 + 12 + 12 + 12 + 12 + 12 = 96 (Como o decimal 96 é equivalente ao hexadecimal 60, o acumulador conterá 0110 0000.) Adições repetidas como as acima são equivalentes a uma multiplicação. Em outras palavras, adicionar 12 oito vezes é o mesmo que 12 x 8. A maioria dos microprocessadores não dispõe de hardware para multiplicação, se limitando a um somador-subtrator como o do SAP-2. Assim, nos microprocessadores comuns, você deve usar alguma forma de multiplicação programada como uma adição repetida, por exemplo. EXEMPLO 11-9 Modifique o programa de multiplicação anterior usando uma JNZ em vez de uma JZ.
SOLUÇÃO Veja isto:
18
Isto é mais s imples. Uma instrução JMP e um rótulo são eliminados. Enquanto o contador for maior do que zer o, a JNZ obrigará o computador a voltar para REPEAT. Quando o contador atingir zero, o programa passará por JNZ caindo em HLT. EXEMPLO 11-10 Faça uma montagem manual do programa anterior começando no endereço 2000H.
SOLUÇÃO
As três primeiras instruções fazem a inicialização que precede a multiplicação. Se mudássemos estes valores iniciais, poderíamos realizar multiplicações com outros números. EXEMPLO 11-11 Substitua a parte de multiplicação do programa anterior por uma sub-rotina que inicie no endereço F006H.
SOLUÇÃO
19
Eis o que aconteceu. As instruções de inicialização dependem dos números que serão multiplicados. Assim, eles não devem ser incluídos na sub-rotina. Ela deverá conter apenas a parte de multiplicação do pr ograma. Ao relocar o programa, nós mapeamos (convertemos) os endereços 2006H-200BH em F006HF00BH. Além disto, a HLT foi transformada numa RET para podermos voltar ao programa original. EXEMPLO 11.12 A sub-rotina de multiplicação do exemplo anterior é usada no seguinte programa. Que faz ele? MVI A, 00H MVI B, 10H MVI C,0EH CALL FO06H HLT
SOLUÇÃO
O hexadecimal 10H é equivalente ao decimal 16 e o 0EH, ao 14. As três primeiras instruções zeram o acumulador, carregam o decimal 16 no registrador B e inicializam o contador com decimal 14. A CALL envia o computador para a sub-rotina do exemplo anterior. Quando a RET é executada, o conteúdo do acumulador é E0H, equivalente a 224 decimal. A propósito, um parâmetro é um tipo de dado que deve ser convenientemente tratado por um a sub-rotina. A sub-rotina de multiplicação localizada em F006H precisa de três parâmetros para funcionar corretam ente ( A, B e C ). Nós passamos estes parâmetros à sub-rotina de multiplicação zerando o acumulador, colocando o multiplicando em B e o multiplicador e C. Em outras palavras, nós fazemos A = 00H, B = 10H e C= 0EH. A passagem de dados para uma sub-rotina na form a apresentada é chamada de passagem de parâmetros por registrador .
11-6 INSTRUÇÕES LÓGICAS Um microprocessador pode fazer lógica tanto como arit mética. A seguir, temos as instruções lógicas do SAP-2, que constituem um subconjunto da s instruções do 8080/8085.
CMA CMA significa complementar o acumulador . A execução de uma CMA inverte ou nega cada um dos bits do acumulador produzindo o complemento de 1. ANA ANA significa fazer a operação lógica AND no acumulador (AND Accumulator) juntamente com o conteúdo do registrador designado junto com a instrução. O resultado é armazenado no acumulador. Por exemplo, ANAB significa o AND do conteúdo do acumulador com o conteúdo do registrador B. Esta operação é feita bit a bit. Por exemplo, suponha que os dois registradores contenham
A= 1100 1100
(11-1)
B = 1111 0001
(11-2)
e A execução de ANA resulta em
20
A= 1100 0000 Observe que a operação lógica AND é feita sobre pares de bits como se mostra na Fig.11-6. A 7 com B7, A6 com B6. A5 com B5 e assim por diante. O resultado é armazenado no acumulador . No SAP-2 , temos disponíveis duas instruções ANA: ANA B e ANA C. A Tabela 11-1 mostra os códigos de operação.
Fig. 11-6 As instruções lógicas são feitas sobre pares de bit5.
ORA ORA é o mnemônico de fazer a operação lógica OR no acumulador (OR Accumulator ) juntamente com o registrador designado. As duas instruções ORA do SAP-2 são ORA B e ORA C. Por exemplo, se os conteúdos dos registradores A e B forem os dados pelas equações 11-1 e 11-2, então a execução de ORA B dará
A= 1111 1101 XRA XRA significa fazer a operação lógica XOR no acumulador( XOR Accumulator) juntamente com o registrador designado. O SAP-2 apresenta as instruções XRA B e XRA C em seu conjunto de instruções. Para os conteúdos dados pela s equações 11-1 e 11-2, a execução de XRA B fornece A= 0011 1101 ANI O SAP-2 também apresenta instruções lógicas imediatas. ANI significa AND imédiato (AND Immediate). Ela manda o computador fazer a operação AND entre o conteúdo do acumulador e o byte que sucede imediatamente o código de operação. Por exemplo, se
A= 0101 1110 a execução de ANI C7H fará o AND de 0101 1110 com 1100 0111 para produzir o novo conteúdo do acumulador A= 0100 0110
ORI ORI é o mnemônico para OR imediato (OR Immediate). O computador faz um OR entre o conteúdo do acumulador e o byte que sucede o código de operação da instrução. Se
A= 0011 1000 a execução de ORI 5AH fará o OR de
21
0011 1000 com 0101 1010 produzindo um novo conteúdo no acumulador de
A= 0111 1010 XRI XRl significa XOR imediato (XOR Immediate). Se 0001 1100 a execução de XRl D4H fará o exclusive OR de 0001 1100 com 1101 0100 para produzir
A= 1100 1000 11-7 OUTRAS INSTRUÇÕES Esta secção mostra as instruções restantes do conjunto de instruções do SAP-2 . Como estas instruções não se encaixam em nenhum grupo em particular, elas foram reunidas aqui formando um grupo à parte.
NOP NOP significa não operar . Durante a execução de uma NOP, todos os estados T não fazem nada. Portanto, não ocorre nenhuma alteração n os registradores durante uma NOP. A instrução NOP é usada para perder tempo. Precisa-se de quatro estados T para buscar e executar a instrução NOP. Repetindo um NOP um certo número de vezes, poderemos tardar o processament o; isto é útil em operações de temporização. Por exemplo, se colocarmos uma NOP dentro de um laço que será executado 100 vezes, nós criaremos um retardo de tempo de 400 estados T. HLT Nós já usamos esta instrução. HLT significa parar ( halt ). Ela encerra o processamento dos dados. IN é o mnemônico para entrar (input ). Ela manda o computador transferir dados de uma porta designada para o acumulador. Como há duas portas, você terá de indicar qual está sendo usada. O formato da instr ução para dar entrada a dados é
IN byte Por exemplo,
IN 02H significa transferir dados da porta 2 para o acumulador.
OUT OUT significa sair (output ). Quando esta instrução é usada, o conteúdo do acumulador é carregado na porta de saída indicada. O seu formato é
22
OUT byte Por exemplo, como há duas portas numeradas 3 e 4 (Fig. 11-2), você terá de especificar qual está sendo usada. Seja
OUT 03H Esta instrução irá transferir o conteúdo do acumulador para a porta 3.
RAL RAL é o mnemônico para rotacionar o acumulador para a esquerda (rotate the accumulator to left). Esta instrução deslocará todos os bits do acumulador para a esquerda além de mover o bit mais significativo ( MSB) para a posição do bit menos significativo ( LSB). Ver a Fig. 11- 7a. A título de exemplo, suponha que o conteúdo do acumulador seja A= 1011 0100 A execução de RAL dará
A= 0110 1001 Como você pode ver, todos os bits se deslocaram para a esquerda e o mais significativo foi para a posição menos significativa.
(a)
(b)
Fig. 11-7 Instruções de rotação: (a) RAL;(b) RAR.
RAR RAR significa rotacionar o acumulador para a direita (rotate accumulator right). Desta vez, os bits do acumulador se deslocam para a direita e o bit menos significativo ( LSB) vai para a posição do bit mais significativo ( MSB). Ver Fig. 11.7b. Se A= 1011 0100 a execução de uma RAR dará
A= 0101 1010
EXEMPLO 11-13 Os bits de um byte são numer ados de 7 a 0 ( MSB a LSB). Mostre um programa que dá entrada a um byte através da porta 2 e determine se o bit 0 é um 1 ou um 0. Se f or 1, o programa carrega no acumulador um Y (yes = sim) em código ASCll . Caso contrário, o programa carrega um N(não) ASCll no acumulador. A resposta sim ou não deve ser enviada para a porta 3 de saída.
SOLUÇÃO
23
A IN 02H transfere o conteúdo da porta 2 para o acumulador dando
A= A7A6A5A4A3A2A1 O byte imediato da ANI 01H é 0000 0001 Este byte é chamado de máscara porque seus 0s irão mascarar ou eliminar os bits em 1 correspondentes no acumulador. Em outras palavras, depois da execução de ANI 01H teremos
A= 0000 000A 0 Se A0 for 1, a JNZ YES produzirá um salto para a MVI A,59H. Isto deposita um 59H (o ASCII de Y) no acumulador. Se A0 for 0, o programa seguirá direto para a MVI A, 4EH que carregará o ASCII de N no acumulador . A OUT 03H carrega a resposta ( Y ou N em ASCII ) na porta 3. O display hexadecimal exibirá, portanto, a resposta: 59H ou 4EH. EXEMPLO 11-14 Ao invés de uma saída para lela na porta 3, nós queremos uma saída serial na porta 4. Modifique o programa anterior para que ele converta a resposta ( 59H ou 4EH) numa saída serial no bit 0 da porta 4.
SOLUÇÃO
Ao converter da forma paralela para a forma serial, o programa envia primeiro o bit A0 , depois o A1 , em seguida o A2 e assim por diante.
24
EXEMPLO 11-15 Handshaking (aperto de mão) é uma técnica de interação entre uma UCP e um dispositivo periférico e que ocorre durante uma transferência E/S de dados. No SAP-2, o handshaking ocorre da seguinte forma. Depois de você dar entrada a dois dígitos (1 byte) no codificador hexadecimal da Fig. 11-2, o dado é carregado na porta 1 e, ao mesmo tempo, um bit alto de READY (pronto) é enviado à porta 2. Antes de dar entrada a dados, a UCP testa o bit de READY na porta 2. Se READY estiver baixo, a UCP esperará. Se READY estiver alto, a UCP carregará o dado na porta 1. Quando a transferência de dados estiver encerrada, a UCP enviará um sinal de ACKNOWLEDGE para o codificador hexadecimal de teclado fazendo READY baixar de nível. Quando você teclar um novo byte, o ciclo recomeçará com um novo dado indo para a porta 1 e um novo READY em nível alto indo para a porta 2. A sequência de handshaking no SAP-2 é
1. READY (bit 0, porta 2) vai para o nível alto. 2. Dar entrada ao dado da porta 1 transferindo-o à UCP. 3. O bit ACKNOWLEDGE (bit 7, p orta 4) vai para o nível alto zerando o bit READY. 4. Zerar o bit ACKNOWLEDGE. Usando a técnica de handshaking, escreva um programa que dá entrada a um byte de dados da porta 1. Armazene o byte no registrador B.
SOLUÇÃO Se o bit READY estiver baixo, a ANI 01H irá zerar o conteúdo do acumulador. A JZ S STATUS, então, fará o programa retroceder a IN 02H. Este laço continuará até que o READY fique e alto indicando que há dados válidos na porta 1. Quando READY estiver alto, o programa passará pela JZ STATUS indo para a IN 01H. Isto fará a transferência de um byte da porta 1 para o acumulador. A MOV enviará o byte para o registrador B. A MVI A,80H setará o bit ACKNOWLEDGE (bit 7). A OUT 04H enviará este ACKNOWLEDGE, para o codificador hexadecimal, onde o hardware interno zerará bit READY. Então, o bit ACKNOWLEDGE será zerado em preparação para o próximo ciclo de entrada de dados.
11-8 RESUMO DO SAP-2 Esta secção resume os estados T, os flags e os modos de endereçamento do SAP-2.
Estados T O controlador-sequencializador do SAP-2 é microprogramado com um ciclo variável de máquina. Isto significa que algumas instruções serão mais demoradas do que outras para serem executadas.
25
Como você se lembra, a idéia da microprogramação é armazenar as rotinas de controle numa ROM e acessá-las na medida do necessário. A Tabela 11-3 mostra cada instrução e o número de estados T necessários à sua execução.Por exemplo, são necessários quatro estados T para executar a instrução ADD B, sete para executar a ANI byte, dezoito para executar a CALL e assim por diante. Em aplicações que envolvem temporizações, é importante o conhecimento dos estados T. Observe que a instrução JM precisa de 10/7 estados T para ser executada. Isto indica 10 estados T quando ocorre efetivamente o salto e apenas 7 quando o salto não chega a se realizar .A mesma idéia se aplica a outros tipos de saltos.
Flags (Bandeiras) Como você Sabe, algumas instruções tornam o acumulador negativo ou zero durante a sua execução. Isto afeta os flags de sinal e de zero. A Fig. 11.8 mostra os circuito usados no SAP-2 para setar os flags . Quando o conteúdo do acumulador é negativo, o seu bit A é um 1. Este bit de sinal alimenta a porta AND inferior. Quando o conteúdo do acumulador é zero, todos os bits são zero e a saída da porta XOR é 1. Esta saída alimenta o AND superior. Quando o sinal de chaveamento L F for alto, os flags serão atualizados para refletir as condições de zero e de sinal do acumulador. Isto significa que Zflag será alto quando o conteúdo do acumulador for zero e Sflag será alto quando o conteúdo do acumulador for negativo. Nem todas as instruções alteram os flags. Como se mostra na Tabela 11.3, as instruções que atualizam os flags são ADD, ANA, ANI, DCR, ORA, ORI, SUB, XRA e XRI. Por que estas instruções apenas? Porque o sinal L F da Fig.11-8 está alto apenas quando estas instruções são e xecutadas. Obtém-se isto rnicropro gramando um bit L F para cada instrução. Dito de outra forma, na ROM de controle nós colocamos um bit alto para L F no caso das instruções citadas e um bit baixo em L F no caso das demais instruções.
Fig. 11-8 Setando os flags.
Saltos Condicionais Como foi mencionado anteriormente, as instruções de salto condicional nece ssitam de 10 estados T quando o salto ocorre efetivamente e apenas sete no caso contrário. Em poucas palavras isto é conseguido da forma que se explica a seguir. Durante o ciclo de execução, o computador é levado ao endereço inicial da microrrotina de salto condicional. A microinstrução inicial analisa os flags e julga se o salto deve ser executado ou não. Em caso afirmativo, a microrrotina prossegue e, no caso negativo, a microrrotina é abortada e o computador começa um novo cicIo de busca.
26
Modos de Endereçamento As instruções do SAP-2 acessam os dados de diversas formas. O operando especifica de que forma o dado deve ser acessa do. Por exemplo, as primeiras instruções discutidas foram
LDA endereço STA endereço Estas instruções exemplificam o endereçamento direto porque o operando especifica onde o dado pode ser encontrado. O endereçamento imediato é diferente. Ao invés de fornecer o endereço do dado, nós damos o próprio dado. Por exemplo, MVI A,byte acessa o dado que deve ser carregado no acumulador usando o byte que sucede imediatamente o código de operação na memória, A Tabela 11-3 mostra outras instruções imediatas. Uma instrução como MOV A,B ilustra o uso de endereçamento de registrador . Em vez de usar a memória, o dado a ser acessado é armazenado num registrador da UCP. O endereçamento de registrador tem a vantagem da rapidez porque menos estados T são necessários para este tipo de instrução. O endereçamento implícito significa que a localização do dado está contida no próprio código de operação da instrução. Por exemplo, RAL nos diz para rotacionar os bits do acumulador para a esquerda. O dado está no acumulador. Por esta razão, nenhum operando é necessário no endereçamento implícito. TABELA 11-3. CONJUNTO DE INSTRUÇÕES DO SAP-2
27
Bytes Cada instrução ocupa um certo número de bytes na memória. No caso do SAP-2, as suas instruções podem ter 1,2 ou 3 bytes de comprimento. A Tabela 11-3 mostra o comprimento de cada instrução. Como você pode observar, as instruções ADD têm 1 byte, as instruções ANI têm 2 bytes, as CALL têm 3 bytes e assim por diante.
EXEMPLO 11-16 O SAP-2 tem uma freqüência de relógio de 1 MHz. Isto significa que cada estado T dura 1µs.Quanto tempo é necessário para se executar a seguinte sub-rotina?
28
SOLUÇÃO A instrução MVI é executada uma vez para inicializar a contagem. A DCR é executada 70 vezes.A JNZ retrocede 69 vezes e não salta uma vez. Com o número de estados T dados pela Tabela 11-3, pode-se calcular o tempo total de execução da seguinte forma:
Como você vê, o tempo aproximado de execução da sub-rotina é 1 ms. Sempre que a rotina acima for chamada, ela produzirá um retardo de tempo de 1ms. Há muitas aplicações onde os retardos de tempo são necessários. De acordo com a Tabela 11-3, as instruções da sub-rotina acima têm os seguintes comprimentos em bytes:
O comprimento total da sub-rotina é 8. Como parte do software do SAP-2, a sub-rotina pode ser montada e relocada nos endereços F010H a F017H. Daqui para frente, a execução uma CALL F010H produzirá sempre um retardo de tempo de 1ms. EXEMPLO 11-17 Qual o retardo de tempo produzido pela seguinte sub-rotina do SAP-2?
SOLUÇÃO Esta sub-rotina tem dois laços, um dentro do outro. O laço interno consiste em DCR C e JNZ LOOP2. Este laço interno produz um retardo de tempo de
29
Quando o contador chega a zero, o programa passa por cima da JNZ LOOP2 (LOOP é o LAÇO em português). O contador B é decrementado e a JNZ LOOP1 manda o programa de volta a MVI C,47H. Assim, pela segunda vez estamos em LOOP2. Como LOOP2 está dentro de LOOP1, LOOP2 será executado 10 vezes e o retardo total de tempo será de 10 ms. Aqui está o cálculo completo do retardo obtido pela sub-rotina:
Esta sub-rotina do SAP-2 tem um comprimento em bytes de 2 + 2 + 1+ 3 + 1+ 3 + 1 = 13 Ela pode ser montada e armazenada nos endereços F020H a F02CH. De agora em diante, sempre que uma CALL F020H for executada, um retardo de aproximadamente 10 ms será produzido. Trocando a sua primeira instrução por
MVI B,64H O contador B será inicializado com o decimal 100. Neste caso, o tempo escoado com o laço interno é de aproximadamente 100 ms. Esta sub-rotina de 100 ms poderá ser armazenada nos endereços F030H a F03CH. EXEMPLO 11-18 Aqui está uma sub-rotina com três laços encaixados um dentro do outro. Qual é o retardo produzido por ela?
30
SOLUÇÃO O laço LOOP3 ainda leva aproximadamente 1 ms para ser executado. O laço LOOP2 executa 100 passage ns pelo laço LOOP3, o que leva aproximadamente 100 ms para ser executado. O laço LOOP1 executa 10 passagens pelo laço LOOP2. Portanto, leva aproximadamente 1s para que se execute a sub-rotina inteira. Que temos nós? Uma sub-rotina de 1s. Ela será armazenada nos endereços F040H a F052H. Para conseguir um retardo de 1s, nós usaríamos uma CALL F040H. Alterando a instrução inicial p ara
MVI A,64H o laço LOOP1 fará 100 passagens pelo laço LOOP2, que, por sua vez, executará 100 passagens pelo laço LOOP3. A sub-rotina resultante poderá ser armazenada em F060H a F072H e produzirá um retardo de 10 s. A Tabela 11-4 resume os retardos programados em sub-rotina no SAP-2. Com elas poderem os produzir retardos de 1ms até 10 s. TABELA 11-4. SUB-ROTINAS DO SAP-2
EXEMPLO 11-19 Um semáforo numa estrada mostra o verde durante 50 s, o amarelo durante 6 s e o vermelho durante 30 s. Os bits 1, 2 e 3 da porta 4 são os sinais de acionamento do equipamento periférico que liga as lâmpadas d o semáforo. Escreva um programa que produza os retardos de tempos de 50, 6 e 30s para o semáforo.
SOLUÇÃO
31
Como as partes amarela, verde e vermelha são iguais, nós analisaremos apenas a parte verde do programa. Ela começa com uma MVI A,32H, que coloca o decimal 50 no acumulador. A STA SAVE guardará este valor na posição de memória chamada SAVE. A luz verde .é ligada quando a MVI A,02H é executada e seguida de uma OUT 04H, que transfere o bit setado no acumulador para a porta 4. Como esta porta comanda o semáforo, a luz verde acende. A CALL D1SEC produz um retardo de 1s. A LDA SAVE carrega o acumulado com o decimal 50. Este valor é decrementado para 49 quando a DCR A é executada. Este valor é guardado de volta na posição SAVE. Então a JNZ LOOPGR leva o programa de volta para CALL D1SEC para um novo retardo de 1 s. A CALL D1SEC é executada 50 vezes mantendo, portanto, a luz verde ligada por 50 s. Então o programa passa pela JNZ LOOPGR chegando à MVI A,06H. A parte amarela do programa é executada mantendo a luz amarela acesa durante 6 s. Finalmente, a parte vermelha o programa é executada mantendo a luz vermelha acesa durante 30 s. A JMP AGAIN repete todo o processo novamente. Desta forma, o programa está controlando a temporização das luzes verde, amarela e vermelha. EXEMPLO 11-20 O dó médio do teclado do piano tem uma frequência de 261,63 Hz. O bit 5 da porta 4 é conectado a um amplificador que aciona um alto-falante. Escreva um programa que envia um dó médio para o alto-falante.
SOLUÇÃO Para começar, o período do dó médio é
32
T =
1
1
= 3.822 µ s f 261,63 Hz O que faremos é enviar um sinal como o da Fig. 11-9 através da porta 4. Esta onda quadrada estará em nível alto durante 1.911 µs, e em nível baixo durante 1.911 µs. O período total é 3.822 µs e a freqüência é 261,63 Hz. Como a onda é quadrada e não senoidal, ela soará distorcida mas será reconhecida como um dó médio de fato. Aqui está um programa que envia um dó médio para o alto-falante. =
Fig. 11-9 Gerando uma nota dó médio.
A OUT 04H envia um bit (alto ou baixo, não importa) para o alto.falante. A MVI inicializa o contador com o decimal 134. Então vem o laço LOOP2, a DCR e a JNZ, que produzem um retardo de 1.866µs . Então o programa passa para a CMA que complementa todos os bits do acumulador. As duas NOPs acrescentam 8 µs ao retardo. A JMP LOOP1 faz o programa voltar ao início. Quando a OUT 04H é executada, o bit 5 (agora complementado) é enviado ao alto-falante, que passa ao estado oposto. O tempo total para cada ciclo é de 3.824 µs, o que está ,bem próximo do dó médio.
Aqui está o cálculo do tempo total: Este é o tempo de um semiperíodo. O ciclo total é de 3.824
s
µ
EXEMPLO 11.21 Os dados seriados são chamados algumas vezes de fluxo de dados seriais, porque os bits fluem um atrás do outro. Na Fig. 11.10, um fluxo de dados seriais está chegando ao bit 7 da porta 2
33
numa velocidade de aproximadamente 600 bits por segundo. Escreva um programa que dá entrada a um caracter de 8 bits a partir de um fluxo de dados seriais e o armazena na posição 2100H.
SOLUÇÃO Como chegam 600 bits por segundo, o período de cada um é 1 600 Hz
= 1.667 µ s
A idéia é receber um bit da porta 2, rotacionar o acumulador para a direita, esperar 1.600 µs, receber o próximo bit, rotacionar o acumulador para a direita e assim por diante até que todos os bits tenham chegado . Aqui está um programa que executará a tarefa:
34
Fig. 11-10
A primeira instrução zera o registrador B. A segunda instrução carrega o decimal 7 no contador C. A IN 02H traz o dado da porta 2. A ANI com a sua máscara isola o bit 7 porque este é o bit SERIAL IN da porta 2. A instrução ORA B não faz nada desta vez porque B está cheio de 0s.A RAR move os bits do acumulador para a direita. A MOV B,A guarda o conteúdo do acumulador no registrador B. A MVI A,73H inicializa o acumulador com o decimal 115. A seguir tem-se um laço de espera, DCR A e JNZ BIT verifica se C é zero. A seguir, o programa volta para a IN 02H, para obter o próximo bit do fluxo serial de dados. A ANI com sua máscara isola o bit 7 ,que por sua vez passa por uma operação lógica OR com o conteúdo do registrador B. Esta operação combina o bit anterior com o recém-chegado. Depois de uma nova RAR, os dois bits são armazenados no registrador B. Então, vem um novo retardo de 1.600 µs. O programa continua a se repetir dentro do laço e, em cada vez, um novo bit é obtido do fluxo serial de dados. Depois de 7 bits terem sido recebidos, o programa passará pela instrução JNZ BIT sem efetuar o salto. As quatro últimas instruções fazem o seguinte. A IN 02H lê o oitavo bit. A ANI isola o bit 7. A ORA combina este bit com os outros sete presentes no registrador B. Neste momento, todos os bits recebidos estão no acumulador. A STA 2100H armazena, então, o byte na posição 2100H. Um exemplo concreto ajudará. Suponha que o caracter que está sendo recebido seja o W, cujo código em ASCII é igual a 57H. O LSB (bit menos significativo) chega primeiro e o MSB (bit mais significativo), por último. A seguir, temos os conteúdos do registrador B depois de cada execução da ORA B:
35
A= 1000 0000 (Primeira passagem pelo laço ) A= 1100 0000 (Segunda passagem) A= 1110 0000 (Terceira passagem) A= 0111 0000 (Quarta passagem) A= 1011 1000 (Quinta passagem) A= 0101 1100 (Sexta passagem) A= 1010 1110 (Sétima passagem) A= 0101 0111 (Conteúdo final) A propósito, o código ASCII necessita de apenas 7 bits;o oitavo bit (A 7) poderá ser zerado ou usado como um bit de paridade.
GLOSSÁRIO Comentário: Notas pessoais num programa em linguagem de montagem que não sã montadas. Elas ajudam o programador a se lembrar do que faz o programa numa data posterior. Endereçamento de registrador : Endereçamento no qual o dado está armazenado num dos registradores a UCP. Endereçamento direto: Endereçamento no qual a instrução contém o endereço do dado com o qual se vai operar. Endereçamento imediato: Endereçamento no qual o dado com o qual se vai operar é o byte que segue o código de operação na instrução. Endereçamento implícito: Endereçamento no qual a posição do dado está contida no mnemônico. Flag (bandeira): Um flip-flop que armazena uma condição variável durante uma execução de programa . Handashaking (aperto de mão ): Interação entre uma UCP e um dispositivo periférico durante uma operação de E/S. No SAP-2, ela envolve os sinais READY e ACKNOWLEDGE. Máscara: Um byte usado numa instrução ANI para descartar certos bits. Montador : Um programa que converte um programa fonte num programa em linguagem de máquina. Montagem manual: Tradução manual de um programa fonte num programa em linguagem de máquina o invés de se usar um computador . Relocar : Deslocar um programa de uma parte da memória para outra. Ao se fazer isto, os endereços das instruções de salto devem ser convertidos para novos endereços. Rótulo: Nome dado a uma instrução num programa em linguagem de máquina. Para saltar para esta instrução, você pode usar o seu nome ao invés do seu endereço. O montador calculará o endereço correto desta instrução (rótulo) e o usará no programa em linguagem de máquina. Salto condicional: Um salto que ocorrerá somente se certas condições estiverem satisfeitas. Sub-rotina: Um programa armazenado nos endereços superiores da memória que pode ser usado diversas vezes como parte de um programa principal.
EXERCICIOS DE FIXAÇÃO Leia ccada um dos itens seguintes e preencha os claros com a palavra correta. As respostas aparecem começo da questão seguinte.
1. O controlador-sequencializador produz palavras de ______________ou microinstruções. 2. ( controle) Um flag é um ______________ que armazena o valor de uma condição variável durante uma execução de programa. O flag de sinal é setado quando o conteúdo do acumulador se torna negativo. O flag de ______________ setado quando o conteúdo do acumulador se torna zero.
36
3. ( flip-flop, zero) Quando se codifica a instrução LDA endereço e a instrução STA endereço o byte do endereço é armazenado num endereço inferior da memória e o byte ______________ num endereço superior. 4. ( menos significativo, mais significativo) A instrução JMP altera a seqüência do programa saltando para uma outra parte do programa.Com a instrução JM, o salto será executado somente se o flag de sinal estiver ______________. Com a instrução JNZ, o salto é executado somente se o flag de zero estiver ______________ . 5. (setado, zerado) Todas as sub-rotinas devem terminar com uma instrução ______________. Isto leva o computador à instrução que se segue à CALL no programa principal .A instrução CALL é incondicional; ela envia o computador para o endereço inicial de uma ______________. 6. (RET, sub-rotina) Um montador lhe permite escrever programas na forma mnemônica.Então, o montador converte estes mnemônicos na forma de linguagem de ______________. O montador ignora os ______________ que se seguem ao ponto e vírgula e atribui endereços aos rótulos. Os rótulos são constituídos de até seis caracteres onde o primeiro deve ser uma ______________. 7. (máquina, comentários, letra) A adição repetida é uma maneira de se fazer ____________. A multiplicação programada é usada na maioria dos microprocessadores porque as suas ULAS executam apenas adições e subtrações. 8. (multiplicação) Um parâmetro é um dado que é passado para uma ______________.Quando se chama uma sub-rotina, deve-se passar ______________ para que ela funcione adequadamente. 9. (sub-rotina, parâmetro) Uma ______________ é usada para isolar um bit. Isto acontece porque a ANI zera todos os outros bits. 10. (máscara) Handshaking é uma interação entre uma ______________ e um dispositivo periférico. No SAP-2, o bit ______________ indica à UCP se o dado de entrada é válido ou não. Depois que o dado foi transferido para o computador, a UCP enviará um bit ______________ para o dispositivo periférico. 11. (UCP, READY, ACKNOWLEDGE ) O computador SAP-2 é microprogramado com um cicIo de máquina ______________. Isto significa que algumas instruções demorarão mais do que outras para serem executadas. 12. (variável ) Os tipos de endereçamento vistos até agora são: direto, imediato, registrador e implícito. PROBLEMAS 11.1 Escreva um programa fonte que carrega o acumulador com o decimal 100, o registrador B com o decimal 150 e o registrador C com o decimal 200. 11.2 Monte manualmente o programa fonte da questão anterior a partir do endereço 2000H. 11.3 Escreva um programa que armazena o decimal 50 de memória 4000H o decimal 51 na 4001H e o decimal 52 na 4002H. 11.4 Monte manualmente o programa do problema anterior a partir da posição 2000H. 11.5 Escreva um programa fonte que adiciona o decimal 68 ao 34. A resposta deve ser armazenada na posição 5000H. 11.6 Monte manualmente o programa anterior a partir da posição 2000H. 11.7 Aqui está um programa:
Rótulo LOOP:
Mnemônico MVI C,78H DCR C JNZ LOOP HLT
37
View more...
Comments