Vous êtes sur la page 1sur 11

Mclab03(2011) Pág.

14
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

MC-LAB - LABORATÓRIO 03: INTRODUÇÃO À PROGRAMAÇÃO ASSEMBLY

1. Objetivos

Ensinar como programar o microcomputador MC-1.

2. Equipamento necessário

 Unidade microcomputador MC-1


 Fonte de alimentação de 5 volts MB-2F

3. Teoria

ANTES DE INICIAR A PARTE PRÁTICA, LEIA ATENTAMENTE A TEORIA EXPOSTA NESTE ITEM E
NOS CAPÍTULOS 5 E 6 DO GAONKAR
Como já sabemos, o MC-1 possui um programa monitor que prover as funções necessárias para a utilização
de periféricos, tais como o teclado e o display hexadecimal. Esse programa monitor reside numa EPROM de
2Kbytes, cujos endereços estão compreendidos entre 0000H e 07FF. As rotinas que atendem cada um dos
periféricos são independentes entre si e, portanto, esses dispositivos não podem ser ativados
simultaneamente. Além dessa EPROM de 2Kbytes, o MC-1 também possui uma área de 256 bytes de RAM,
onde podemos escrever os nossos programas. Os endereços dessa área de RAM estão compreendidos
entre 2000H e 20FFH. No entanto, nem todas as posições da RAM estão disponíveis para o usuário. O
programa monitor também precisa de alguns bytes na RAM, onde ele possa escrever alguns dados
temporários, necessários a sua execução. A tabela abaixo mostra as áreas reservadas na memória RAM
para o uso do programa monitor.

Tabela 1 - Áreas reservadas na memória RAM para o Monitor e para a Expansão de EPROM.
Endereços Conteúdo
20B0-20C1 Rotinas da expansão de EPROM
20C2-20C4 Disponível para o usuário definir uma instrução JMP para a rotina de serviço da RST5
20C5-20C7 JMP para a rotina de serviço da RST 6
20C8-20CA JMP para a rotina de serviço da RST 6.5 (conectada à uma interrupção do usuário)
20CB-20CD JMP para a rotina de serviço da RST 7
20CE-20D0 JMP para a rotina de serviço da RST 7.5
20D1-20E8 Área usada pelo programa monitor para armazenamento de dados temporários
20E9 Imagem do Registrador E
20EA Imagem do Registrador D
20EB Imagem do Registrador C
20EC Imagem do Registrador B
20ED Imagem do Registrador de Flags
20EE Imagem do Registrador A
20EF Imagem do Registrador L
20F0 Imagem do Registrador H
20F1 Imagem do Registrador I (Máscaras de Interrupção)
20F2 Imagem do Registrador PC - LSByte
20F3 Imagem do Registrador PC - MSByte
20F4 Imagem do Registrador SP - LSByte
20F5 Imagem do Registrador SP - MSByte
20F6-20F7 Contém o endereço que está sendo mostrado no display de endereços
20F8 Contém o dado que está sendo mostrado no display de dados
20F9-20FC Buffer de saída e de endereços temporários
20FD Registrador Ponteiro
20FE Buffer de entrada do teclado
20FF Imagem do registrador de Comando/Status do 8155

14
Mclab03(2011) Pág. 15
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

4. Experimentos

 Para entender o significado de cada instrução, recorra ao conjunto de instruções da INTEL.


 Antes de executar cada programa, é conveniente pressionar a tecla RESET-IN por alguns segundos.
 Ao final dos experimentos desligar os módulos.

4.1. Programa complemento de um


O primeiro experimento consiste de um programa inversor (ou complemento de um) de dados. O programa
toma o conteúdo do endereço de memória 2030, complementa cada um dos seus bits e coloca o resultado
na posição de memória de endereço 2031. Desta forma, o microcomputador atua exatamente como 8 portas
inversoras. O programa está mostrado na Tabela 2.
Entre com o programa mostrado na Tabela 2 e examine cada uma de suas posições de memória para
certificar-se de que você entrou com os dados corretamente.

Tabela 2 - Programa Complemento de Um


ENDEREÇO DADOS ASSEMBLY COMENTÁRIOS
2000 3A LDA 2030 Carrega A com o conteúdo do endereço 2030
2001 30
2002 20
2003 2F CMA Complementa A
2004 32 STA 2031 Armazena o conteúdo de A no endereço 2031
2005 31
2006 20
2007 CF RST 1 Volta ao Monitor
.
A instrução CMA complementa o acumulador, significando que cada bit 0 é substituído por 1 e vice-versa, tal
como portas inversoras.
A instrução RST 1 (Restart 1) devolve o controle ao programa monitor. Após a execução desta instrução
você poderá visualizar o estado dos registradores da CPU e das posições de memória.
Execute o programa da tabela 2 para cada um dos valores mostrados na Tabela 3. Armazene os dados no
endereço 2030 e complete a tabela.

Tabela 3 - Resultados do Programa


ENDEREÇO 2030 ENDEREÇO 2031
55
12
31
00
F1
FF
3E

Quanto tempo levaria para rodar o programa da


Tabela 2?
Vamos descobrir este tempo. A instrução LDA requer 13 estados, a CMA 4 estados, a STA 13 estados e a
RST 1 exige 12 estados. Isso dá um total de 42 estados. Uma vez que o cristal de quartzo do MC-1 é de 4,7
MHz, o período de tempo equivalente a um estado é aproximadamente 425,532 ns, pois o 8085 divide
internamente a freqüência do cristal por 2. Logo o programa levaria para ser executado:

42 x 425,532 ns  17,87 s

15
Mclab03(2011) Pág. 16
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

4.2. Os registradores H e L
O microprocessador 8085 usa os registros H e L para endereçar a memória. Na verdade, este é o principal
uso destes registradores, daí a letra H para “a parte alta do endereço” (high) e L para a “parte baixa do
endereço” (low).
Reescreva o programa complemento de um do experimento 4.1 na forma indicada na Tabela 4.

Tabela 4 - Registradores H e L
ENDEREÇO DADOS ASSEMBLY COMENTÁRIOS
2000 21 LXI H, 2030 Carrega H e L com 2030
2001 30
2002 20
2003 7E MOV A,M Carrega A com o conteúdo do endereço 2030
2004 2F CMA Complementa o conteúdo do registrador A
2005 23 INX H Incrementa (HL). (HL) = 2031
2006 77 MOV M,A Armazena o resultado
2007 CF RST 1 Volta ao Monitor
A instrução LXI H, 2030 carrega o par de registradores H, L com o endereço 2030. O resultado é H = 20 e L
= 30.
A instrução MOV A,M carrega o acumulador com o conteúdo do endereço de memória indicada pelos
registradores H e L. O resultado neste caso é que o acumulador é carregado com o conteúdo da posição de
memória 2030.
A instrução INX H (incrementa o par de registradores H, L) soma 1 ao número de 16 bits contido nos
registradores H e L. O resultado é H = 20 e L = 31. Observe que INX H incrementa na realidade o registrador
L e somente afetará o registrador H se o incremento de L ultrapassar o valor FF.
A instrução MOV M,A armazena o conteúdo do acumulador na posição de memória endereçada pelo par H
e L. No nosso caso, o conteúdo do acumulador será armazenado no endereço 2031.
Entre e execute o programa da Tabela 4 para os dados fornecidos na Tabela 5.

Tabela 5 - Resultados do Programa


ENDEREÇO 2030 ENDEREÇO 2031
00
3E
C9
FA
1E

4.3. Adição de dois números


A Tabela 6 mostra um programa que adiciona o conteúdo das posições de memória 2030 e 2031 e
armazena o resultado no endereço 2032.

Tabela 6 - Somando Dois Números


ENDEREÇO DADOS ASSEMBLY COMENTÁRIOS
LXI H, 2030 Carrega H e L com 2030

MOV A,M Carrega A com o conteúdo do endereço 2030


INX H Incrementa (HL). (HL) = 2031
ADD M Soma os números
INX H Incrementa (HL). (HL) = 2032
MOV M,A Armazena o resultado
RST 1 Volta ao Monitor

16
Mclab03(2011) Pág. 17
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

A instrução ADD M soma um byte de dados contido na memória com o conteúdo do acumulador. O
resultado é armazenado no acumulador.
Entre e execute o programa para os dados fornecidos na Tabela 7. Complete esta tabela.

Tabela 7 - Resultados do Programa


ENDEREÇO 2030 ENDEREÇO 2031 ENDEREÇO 2032
32 15
58 43
88 7D

4.4. Implementação de funções lógicas


Altere o programa mostrado na Tabela 6 para que ele realize uma operação AND entre dois bytes de dados
presentes nas posições de memória 2030 e 2031 e armazena o resultado na posição de memória 2032.
Lembre-se que a instrução ANA M (código A6) realiza uma operação lógica AND entre o byte presente no
acumulador e o byte presente na posição de memória apontada pelo par HL
Como as funções lógicas OR e OR Exclusivo poderiam ser implementadas?
Escreva e execute estes três programas para os dados fornecidos na Tabela 8.
Complete esta tabela.

Tabela 8 - Resultados do Programa


END. 2030 END. 2031 END. 2032 END. 2032 END. 2032
AND OR XOR
32 15
58 43
88 7D

Explique os resultados obtidos.

4.5. Utilizando o recurso de ponto de parada (Breakpoint)


A fim de depurar um programa você dispõe do recurso do ponto de parada. Você já usou o ponto de parada
nos experimentos anteriores para finalizar um programa. Um ponto de parada é exatamente o que a diz a
palavra, “pára o programa em qualquer ponto (instrução) para tornar possível o exame do conteúdo dos
registradores e da memória”.
A execução da instrução RST 1 fará com que o programa monitor entre na rotina de ponto de parada, a qual
permitirá a visualização de todos os registradores. Todos os registros e memórias do usuário (RAM) podem
ser examinados e alterados.
Para reiniciar a execução do seu programa, pressione a tecla GO e a tecla EXECUTE. Uma vez que o
contador de programa é mantido inalterado, o programa continuará a sua operação normal na primeira
instrução após a instrução RST 1.
Entre com o programa mostrado na Tabela 9. O programa é um contador que conta até 3 e depois
armazena o conteúdo do acumulador na posição de memória de endereço 2015. Você vai notar que existe
uma instrução RST 1 inserida no meio do programa. Observe também que este programa implementa uma
função de decisão.

17
Mclab03(2011) Pág. 18
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

Tabela 9 - Programa Contador


ENDEREÇO DADOS ASSEMBLY COMENTÁRIOS
2000 3E MVI A,00 Zera o acumulador
2001 00
2002 3C AGAIN: INR A Incrementa a contagem
2003 FE CPI 03 Verifica o fim da contagem
2004 03
2005 CF RST 1 Ponto de Parada
2006 CA JZ END Salte se contagem = 3
2007 0C
2008 20
2009 C3 JMP AGAIN Repita
200A 02
200B 20
200C 32 END: STA 2015 Armazene o conteúdo do acumulador em 2015
200D 15
200E 20
200F CF RST 1 Volta ao Monitor

Execute o programa da Tabela 9. O endereço 2005 contém um ponto de parada (instrução RST 1). Quando
o programa parar, você pode examinar a memória ou registradores.
Observe em qual endereço o programa para pela primeira vez. Para isso verifique o conteúdo dos
registradores PCH = ________ e PCL =___________
O registrador A foi carregado com zero, depois incrementado de 1 em 1 e comparado a 3. Verifique o
conteúdo do registrador A. A exibição deve ser:
A 01
Esta exibição indica que o conteúdo do acumulador é 01H.
Verifique o conteúdo do registrador de flags (F). O vídeo mostrará:
F A1
A1H corresponde ao binário 10100001, ou seja, a instrução CPI posicionou o bit 6 (Flag de Zero) em 0,
indicando que o resultado da comparação não é igual a zero, ou seja, que conteúdo do acumulador é
diferente de 3.
Obs.:
Registrador de Flags: S Z X AC X P X CY

Para retomar a execução do programa a partir do ponto em que ele está pressione a seqüência de teclas
EXECUTE/GO/EXECUTE. O primeiro EXECUTE finaliza o comando de visualização dos registradores e o
par GO/EXECUTE recoloca o programa em execução.
Lembre-se que o contador de programa (PC) estava apontando para o endereço da próxima instrução, ou
seja, 2006. A instrução em 2006 é JZ (Salte se o resultado for zero, ou seja, se Z = 1). Como a flag de Zero
é 0 (Z = 0) o programa continuará no endereço 2009, que repete o programa (JMP AGAIN). É claro que
esse trecho (JZ END e JMP AGAIN) poderia ser simplificado para simplesmente JNZ AGAIN.
Repita a execução do programa até que o conteúdo do registrador A seja igual a 3. Neste caso, o conteúdo
do acumulador será armazenado na posição de memória de endereço 2015.
Pressione EXECUTE/GO/EXECUTE e verifique novamente PCH=_____ e PCL=_____. O ponto de parada
correspondente deverá ser o endereço 2010.
Verifique também o registrador de F=_____ e a posição de memória 2015=_____.

18
Mclab03(2011) Pág. 19
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

4.6. Processando conjuntos de dados


Conjuntos de dados são, geralmente, armazenados em posições consecutivas de memória. Neste
experimento estudaremos como identificar os elementos de um conjunto de dados e como processá-los.
São operações típicas sobre conjuntos de dados: calcular a média, encontrar o menor ou o maior elemento
para montar escalas, organizar dados para armazenagem em fita ou disco magnético, classificar, procurar
comandos especiais, etc.
Para ter acesso a um elemento particular de um conjunto de dados armazenados em posições sucessivas
de memória são necessárias duas informações: o endereço base (o endereço inicial do conjunto de dados)
e o índice (o número do elemento desejado).
O programa mostrado na Tabela 10 coloca o conteúdo das posições de memória 2060 e 2061 em ordem
decrescente, isto é, o maior elemento em primeiro lugar.

Tabela 10 - Processando Conjuntos de Dados


ENDEREÇO DADOS ASSEMBLY COMENTÁRIOS
LDA 2060 Obtém o primeiro elemento

MOV B,A Salva o primeiro elemento


LDA 2061 Obtém o segundo elemento

CMP B Compara os elementos


NOP Gasta tempo.
JC END Se (A) < (B), saia do programa

STA 2060 Senão, reordene os elementos

MOV A,B
STA 2061

END: RST 1 Volta ao Monitor

A instrução LDA 2060 transfere o conteúdo da posição de memória 2060 para o acumulador.
MOV B,A transfere um byte de dados de A para B.
A instrução seguinte, LDA 2061, toma o segundo byte e o transfere para o acumulador.
CMP B compara o byte armazenado em B com o conteúdo de A e indica o resultado alterando o valor dos
flags de carry (C) e de zero (Z). Os valores comparados não são alterados por esta operação.
Se o flag de carry for igual a 0, então A é maior ou igual a B; se o flag de carry é igual a 1, então A é menor
que B.
O programa testa a flag de carry (C) utilizando a instrução JC. Se o flag de carry for igual a 1, a execução do
programa continua no endereço especificado na instrução JC END. Se o flag de carry é 0, a execução
continua com a instrução seguinte a instrução JC (STA 2060).
As três instruções seguintes a JC END ordenam os bytes de dados em ordem decrescente.
Note que o programa contém uma instrução NOP.
Esta instrução pode ser substituída por RST 1 para que você possa examinar os registradores, caso seja
necessário.
Entre e execute o programa da Tabela 10 para os dados da Tabela 11. Complete a Tabela 11.

19
Mclab03(2011) Pág. 20
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

Tabela 11 - Processando um Conjunto de Dados


ENDEREÇO DADOS INICIAIS DADOS FINAIS
2060 5B
2061 7C

2060 B9
2061 01

Explique os resultados obtidos.

O fluxograma da Figura 1 generaliza o procedimento.

PROCESSANDO
CONJUNTOS DE DADOS

HL = ENDEREÇO INICIAL DO CONJUNTO

PROCESSAMENTO DE UM
ELEMENTO ESPECÍFICO
ARMAZENADO EM M

HL = HL + 1

CONDIÇÃO FINAL
No
ALCANÇADA ?

Yes

FIM

Figura 1 - Fluxograma do programa da Tabela 10.

20
Mclab03(2011) Pág. 21
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

Portanto, pode-se processar um conjunto de dados com o microcomputador MC-1, seguindo os seguintes
passos:
1. Usando a instrução LXI (Load HL immediate) ou LHLD (Load HL direct) defina o endereço inicial do
conjunto de dados nos registradores HL, que serão usados como ponteiros para a memória.
2. Refira-se a um elemento particular endereçado por HL como M.
3. Acesse o próximo elemento do conjunto mediante a instrução INX H (increment H, L) ou
4. Acesse um elemento arbitrário do conjunto carregando o deslocamento em outro par de registradores e
utilizando a instrução DAD (double register add).
O programa da Tabela 12 encontra a soma de todos os elementos de um conjunto de dados. A Figura 2
mostra o fluxograma correspondente.
A instrução CMP B compara o conteúdo dos registradores A e B e indica o resultado desta comparação
setando (ou não) os flags de transporte e de zero. A instrução SUB A zera o acumulador. A.
A próxima instrução, JZ END, testa o estado do flag de zero. Se este flag estiver setado (Z=1), a execução
do programa termina. Se este flag estiver resetado (Z=0) a execução do programa continua na próxima
instrução (LDA). A essa altura, o programa recupera o valor da soma, incrementa o contador e volta à
instrução ADD M a fim de somar o próximo dado.

SOMA

CONTADOR = TAMNHO DO CONJUNTO


INDICADOR = ENDEREÇO INICIAL
SOMA = 0

SOMA = SOMA + DADOS

INDICADOR = INDICADOR +1
CONTADOR = CONTADOR + 1

No CONTADOR = 0 ?

Yes

FIM

Figura 2 - Fluxograma do programa da Tabela 12

21
Mclab03(2011) Pág. 22
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

Tabela 12 - Somando um Conjunto de Dados


ENDEREÇO DADOS ASSEMBLY COMENTÁRIOS
MVI B,05 Inicia o contador

LXI H,2060 Inicia o ponteiro de memória

SUB A Zera o acumulador


AGAIN: ADD M Soma = Soma + dados. (A) = (A)+(M)
STA 2065 Salva a soma no endereço 2065 (memória)

DCR B Decrementa contador


SUB A Zera o acumulador
CMP B Compara contador (B) com 00.
JZ END Se fim da soma, salte para a instrução
indicada pelo END.

LDA 2065 Recupere a soma parcial

INX H Incremente o ponteiro de memória


JMP AGAIN Adicione novo dado

END: RST 1 Volta ao Monitor

Entre e execute o programa da Tabela 12 para os dados da Tabela 13.

Tabela 13 - Resultados do Programa


ENDEREÇO DADOS
2060 A3
2061 11
2062 27
2063 5B
2064 32
2065  Complete este campo

Explique os resultados obtidos.

O programa Tabela 14 encontra o maior e o menor número de uma lista de 10 elementos. Ele transfere para
o endereço 2040 o maior número da lista e para o endereço 2041 o menor número da lista. A lista começa
no endereço 2030.

22
Mclab03(2011) Pág. 23
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

Tabela 14 - Encontrando o Maior e o Menor Número de uma Lista


ENDEREÇO DADOS ASSEMBLY COMENTÁRIOS
LXI H,2030 Inicialização do ponteiro de memória

MVI B,0A Inicialização do contador de controle do loop

MVI D,00 Inicialização do registro que conterá o maior valor

MVI E,FF Inicialização do registro que conterá o menor valor

AGAIN: MOV A,M Lê dado da lista


CMP E Compara dado com o menor valor já obtido
JNC L1 Se (A)  (E) então vá para L1

MOV E,A Se (A)  (E) então (E)  (A)


L1: CMP D Compara dado com o maior valor já obtido
JC L2 Se (A)  (D) então vá para L2

MOV D,A Se (A)  (D) então (D)  (A)


L2: INX H Incrementa o ponteiro de memória
DCR B Decrementa o contador de controle do loop
JNZ AGAIN Controle do loop. Se não foram lidos todos os
dados então vá para AGAIN

LXI H,2040 Guarda maior valor no endereço 2040

MOV M,D
LXI H,2041 Guarda menor valor no endereço 2041

MOV M,E
RST 1 Volta ao Monitor

Entre com os seguintes dados:


Tabela 15 - Lista de Dados
ENDEREÇO DADOS
2030 1A
2031 2B
2032 5E
2033 6F
2034 92
2035 A3
2036 81
2037 70
2038 4D
2039 3C

Execute o programa da Tabela 14 e complete a Tabela 16 para os dados da Tabela 15.

23
Mclab03(2011) Pág. 24
Criado em 21/03/2011 10:08:00 Paulo Sergio da Silva
Atualizado em 21/03/2011 10:37:00 Impresso em 21/03/2011
10:37:00

Tabela 16 - Resultados do Programa


ENDEREÇO DADOS
2040
2041

5. Questões

1. Descreva as seguintes instruções ORA M; MVI r,data; INR r; CPI data; JZ addr; JMP addr.
2. Os programas das Tabela 9 e Tabela 12 não são as melhores implementações para as tarefas
sugeridas. Utilizando as instruções XRA A e JNZ reescreva esses programas de uma forma mais
otimizada em termos de tempo de execução e espaço de memória.
3. Escreva um programa que some três bytes?
4. Qual seria o tempo gasto para executar o programa da Tabela 4? Compare esse tempo com o tempo
gasto para executar o programa da Tabela 2.
5. Escreva um programa para ordenar um conjunto “genérico” de números armazenados em memória. A
quantidade dada a serem ordenados deve ser guardada em um registrador antes do programa ser
executado.

24

Vous aimerez peut-être aussi