Você está na página 1de 8

MC-LAB - LABORATÓRIO 05: OPERAÇÕES ARITMÉTICAS DE 16 BITS

1. Objetivos

Após completar estas atividades você deverá ser capaz de:


? Entender o uso das instruções aritméticas do 8085.
? Entender e usar as seguintes instruções do 8085: ADC, DAD, DCR, LHLD, SHLD, RAL.
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, NOS CAPÍTULOS 7 E 10 E NO APÊNDICE A2 DO GAONKAR
Você já usou as instruções mais comuns para o 8085, porém não foram muitos os programas a utilizarem
qualquer tipo de operação aritmética. A unidade lógica-aritmética do microprocessador 8085 só pode
SOMAR, de modo que todas as operações usarão alguma forma de soma. As instruções de subtração, por
exemplo, usam o complemento de dois. Para realizar a multiplicação usaremos o deslocamento (shift) e a
soma e para a divisão, o deslocamento, o complemento de dois e a soma.
As operações aritméticas que o microcomputador não pode realizar diretamente com algumas instruções
são, as vezes, mais fáceis de realizar através das chamadas tabelas de consulta. Estas tabelas
simplesmente contêm todas as respostas possíveis a um determinado problema. O problema aritmético
torna-se, então, um problema de programação: como conseguir a resposta correta da tabela. Você precisa
saber duas coisas para chegar à resposta correta: a posição da resposta na tabela (chamada de índice) e o
endereço inicial da tabela (chamado de base).
O endereço inicial da tabela é um número fixo. O índice pode ser organizado na tabela, de modo que os
próprios dados sejam os índices. Você vai executar um programa com este tipo de indexação durante este
exercício de laboratório.
As vantagens/desvantagens do uso de tabelas para esta função é uma questão de tempo versus
necessidade de memória. As tabelas são mais rápidas, uma vez que dispensam computação, e muito
simples, pois não é preciso programar e nem testar qualquer tipo de operação matemática. Entretanto,
podem ocupar muito espaço de memória, se for grande a quantidade de dados a serem tabelados. O
tamanho da tabela pode ser reduzido limitando-se a precisão dos resultados, escalando-se os dados de
entrada ou fazendo-se uma programação inteligente. Muitas vezes as tabelas são utilizadas para computar
funções trigonométricas, converter códigos e realizar outras tarefas matemáticas.
A maioria das operações matemáticas efetuadas num microcomputador consiste de manipulações
decimais ou binárias de palavras múltiplas. Muitas vezes, além da adição e subtração, a única instrução
disponível para se realizar uma aritmética decimal é uma instrução de correção decimal (Ajuste Decimal).
Todas as demais operações aritméticas só podem ser realizadas por meio de software.
A aritmética binária de múltipla precisão requer simples repetições de instruções de uma só palavra. O bit
de transporte (carry) transfere informações entre as palavras. A soma com transferência (carry) e a
subtração com empréstimo (borrow) usam informações de operações aritméticas anteriores.
A multiplicação e a divisão se efetuam respectivamente com uma série de somas e subtrações, de forma
bastante semelhante a manual.
As operações com palavras duplas são importantes, uma vez que uma multiplicação produz um resultado
duas vezes mais longo que os operandos. Por outro lado, a divisão reduz a extensão do resultado. A
multiplicação e a divisão levam muito tempo quando realizadas por software, devido à repetição das
operações aritméticas e dos deslocamentos.

34
4. Experimentos

ANTES DE EXECUTAR OS PROGRAMAS, CONFIRA TODOS OS CÓDIGOS HEXADECIMAIS DAS


INSTRUÇÕES

4.1. Adição binária de números de 16 bits

Um programa de adição binária pode ser estendido para manipular números de 16 bits. Contudo, este tipo
de operação envolve mais do que duas adições de 8 bits, desde que existe um único acumulador de 8 bits
no microprocessador 8085.
Serão necessárias instruções adicionais para mover partes da soma entre o acumulador e outros
registradores. O problema do “vai um” do byte menos significativo para o byte mais significativo pode ser
tratado do seguinte modo:
a) Adicione os 8 bits menos significativos usando a instrução ADD.
b) Adicione os 8 bits mais significativos usando a instrução ADC.
A instrução ADC (add with carry) adiciona o conteúdo do registrador ou da posição de memória
especificados e o conteúdo do flag de carry com o conteúdo do acumulador.
O Programa 1 adiciona os elementos de um vetor de 6 números binários de 16 bits, armazenados a partir
da posição de memória 2050 e coloca o resultado da soma na posição de memória 2060 e 2061.
END. DADOS ASSEMBLY COMENTÁRIOS
MVI C,06 Obtém o tamanho do array

LXI D,0000 Soma = zero

LXI H,2050 Define o ponteiro de endereços.

AGAIN: MOV A,E Adiciona os LSBytes


ADD M
MOV E,A
INX H Incrementa o ponteiro de endereços
MOV A,D Adiciona os MSBytes
ADC M
MOV D,A
INX H Incrementa o ponteiro de endereços
DCR C Decrementa o tamanho do array
JNZ AGAIN

XCHG Salva o resultado de 16 bits


SHLD 2060 Armazena soma na memória

RST 1 Volta ao Monitor


Programa 1 - Adição binária com números de 16 bits
Vamos analisar cada instrução deste programa:
? A primeira instrução, MVI C,06 carrega o registrador C com o número 6, isto é, o numero de elementos
do vetor de 16 bits.
? LXI D,0000 zera o conteúdo do par de registradores DE. Este par de registradores conterá o resultado
parcial e final da soma.
? LXI H,2050 define o endereço base do vetor.
? MOV A,E coloca o byte menos significativo da soma no acumulador.

35
? ADD M soma o conteúdo do acumulador com o conteúdo da posição de memória apontada por HL,
colocando o resultado no acumulador.
? MOV E,A salva o resultado da soma anterior (byte menos significativo) no registrador E.
? INX H incrementa o par HL de uma unidade.
? MOV A,D coloca o byte mais significativo da soma no acumulador.
? ADC M adiciona o byte mais significativo da soma com o conteúdo da localização de memória apontada
pelo par de registradores HL e com o flag de carry, determinado pela instrução ADD anterior.
? MOV D,A salva o resultado da soma anterior (byte mais significativo) no registrador D.
? INX H incrementa o par de registradores HL. Então, este par passará a apontar para o próximo byte
menos significativo do vetor de dados de 16 bits.
? DCR C subtrai um do conteúdo do registrador C. Então, o índice será decrementado de um, indicando
agora quantos números de 16 bits ainda restam pata ser adicionados. Esta instrução seta ou reseta o
flag de zero.
? JNZ AGAIN faz com que o microprocessador execute a instrução localizada na posição de memória
AGAIN, se o flag de zero for zero (Z=0). Caso contrário, se o flag de zero for um (Z=1), o
microprocessador prossegue na próxima instrução da seqüência. Se o registrador C alcançou o valor 00,
então o flag de zero é setado (Z=1); caso contrário o flag de zero é resetado (Z=0).
? AGAIN é um label (rótulo) que assume o valor do endereço 2008 O nome AGAIN é arbitrário.
? A seqüência de instruções de MOV A,E até JNZ AGAIN é executada 6 vezes.
? XCHG troca os conteúdos do registrador D com o registrador H e do registrador E com o registrador L.
Então, a soma é transferida do par DE para o para HL.
? SHLD 2060 armazena o conteúdo do par de registradores HL, iniciando pelo endereço 2060. O
registrador L é armazenado no endereço 2060 e o H no próximo endereço (2061). Portanto, a soma é
armazenada nas localizações de memória 2060 e 2061.
? RST 1 pára o programa e retorna o controle ao monitor.
? Execute o programa de acordo com o seguinte procedimento:
a) Entre os seguintes dados, iniciando no endereço 2050: 01, 00, 02, 02, 03, 00, 14, 14, 05, 05, 06, 00.
b) Execute o programa iniciando no endereço 2000.
c) Verifique os endereços 2060 e 2061. Qual o resultado obtido? O Programa 1 sempre vai
fornecer o resultado da correto da soma em 2060 e 2061? Justifique?
d) Execute o programa para diferentes valores de dados. Os resultados são coerentes?

4.2. Multiplicação de dois números

A Figura 1 mostra o fluxograma de um programa que multiplica dois números de 8 bits não sinalizados. O
resultado é um número de 16 bits. O endereço 201E contém o multiplicando e o endereço 201F o
multiplicador, o resultado é armazenado nos endereços 2020 e 2021.

36
ÍNICIO

PRODUTO = 0
CONTADOR = 8
MULTIPLICANDO = (201E)
MULTIPLICADOR = (201F)

PRODUTO = 2 x PRODUTO
(DESLOQUE 1 BIT PARA ESQUERDA)
MULTIPLICADOR = 2 x MULTIPLICADOR

O TRANSPORTE DO NÃO
MULTIPLICADOR É 1 ?

SIM

PRODUTO = PRODUTO +
MULTIPLICANDO

CONTADOR = CONTADOR - 1

NÃO
CONTADOR É = 0 ?

SIM

(2020) e (2021) = PRODUTO

FIM

Figura 1 - Fluxograma do Programa de Multiplicação


O Programa 2 corresponde ao fluxograma da Figura 1.
END. DADOS ASSEMBLY COMENTÁRIOS
LXI H,201E Inicializa o ponteiro de memória com endereço do
Multiplicando

MOV E,M Obtém o Multiplicando


MVI D,00 Estende para 16 bits

INX H Aponta para o endereço do Multiplicador


MOV A,M Obtém o Multiplicador
LXI H,0000 Limpe o produto

MVI B,08 Inicializa o contador.

37
AGAIN: DAD H Multiplique por 2. (HL) = (HL) + (HL)
RAL Obtém o bit de transporte (carry)
JNC TEST Verifica o bit de transporte

DAD D Ajusta o resultado do produto. (HL)=(HL)+(DE)


TEST: DCR B Verifica o fim do cálculo
JNZ AGAIN Fim do cálculo

SHLD 2020 Armazena o resultado do produto

RST 1 Volta ao Monitor


Programa 2 - Multiplicação de dois números
Execute o Programa 2 e complete a Tabela 1. Justifique os resultados.
ENDEREÇO 201E ENDEREÇO 201F ENDEREÇO 2021 ENDEREÇO 2020
01 02
03 03
10 10
20 20
Tabela 1 - Resultado do Programa 2.
Por que o algoritmo não coloca o multiplicador num contador e simplesmente soma o
multiplicando a si mesmo tantas vezes quantas forem o conteúdo desse registrador?

4.3. Divisão de dois números

A Figura 2 mostra o fluxograma de um programa que divide um número sem sinal de 16 bits por um
número sem sinal de 8 bits. Os endereços 201C e 201D contêm o número de 16 bits, que é dividido pelo
número armazenado no endereço 201E. O quociente será guardado no endereço 201F e o resto no
endereço 2020.

38
ÍNICIO

DIVIDENDO = (201D) (201C)


DIVISOR = (201E)
QUOCIENTE = 0
CONTADOR = 8

DIVIDENDO = 2 x DIVIDENDO

DIVIDENDO É MAIOR OU NÃO


IGUAL AO DIVISOR ?

SIM

DIVIDENDO = DIVIDENDO - DIVISOR


QUOCIENTE = QUOCIENTE + 1

CONTADOR = CONTADOR - 1

NÃO
CONTADOR É = 0 ?

SIM

(201F) = QUOCIENTE
(2020) = RESTO

FIM

Figura 2 - Fluxograma do Programa de Divisão


O Programa 3 corresponde ao fluxograma da Figura 2.
END. DADOS ASSEMBLY COMENTÁRIOS
LHLD 201C Obtém o dividendo

LDA 201E Obtém o divisor

MOV C,A Guarda o divisor


MVI B,08 Inicializa o contador

AGAIN: DAD H Divisão


MOV A,H
SUB C

39
JC TEST Verifica se dividendo < divisor

MOV H,A Dividendo ? divisor, subtraia divisor do dividendo


INR L Incrementa quociente
TEST: DCR B Dividendo < divisor, verifique o fim do cálculo
JNZ AGAIN Fim do cálculo

SHLD 201F Armazene o quociente (L) e o resto (H)

RST 1 Volta ao Monitor


Programa 3 - Divisão de dois números
Os seguintes dados são um exemplo dos resultados obtidos com o programa.
(201C) = 6D e (201D) = 32 (12.909 decimal)
(201E) = 47 (71 decimal)
Resultados:
(201F) = B5 (181 decimal)
(2020) = 3A (58 decimal)
Isto é: 12909 ? 71 = 181 com resto 58
Execute o Programa 3 e complete a Tabela 2. Justifique os resultados obtidos.
DIVIDENDO DIVISOR QUOCIENTE RESTO
201D 201C 201E 201F 2020
01 01 02
00 0D 04
02 02 05
08 00 20
Tabela 2 - Resultado do programa

4.4. Quadrado de um número

Entre e examine o Programa 4 mostrado abaixo. Este programa utiliza uma tabela de consulta. A finalidade
deste programa é obter o quadrado do conteúdo da posição de memória 201A e colocar o resultado em
201B. A posição de memória 201A deve conter um número entre 0 e 7.
Observe que a tabela de quadrados representa dados constantes, e não parâmetros mutáveis.
ENDEREÇO DADOS ASSEMBLY COMENTÁRIOS
LDA 201A Obtém o byte de dados

MOV L,A Parte baixa do endereço da tabela


MVI H,00 Limpa a parte alta do endereço da tabela

LXI D,2020 Endereço base da tabela

DAD D Obtenha o índice: (HL) = (HL) + (DE)


MOV A,M Obtenha o resultado: quadrado do (201A)
STA 201B Armazena o resultado

RST 1 Volta a Monitor

TABELA DE CONSULTA

40
2020 00 Decimal 0
2021 01 Decimal 1
2022 04 Decimal 4
2023 09 Decimal 9
2024 10 Decimal 16
2025 19 Decimal 25
2026 24 Decimal 36
2027 31 Decimal 49
Programa 4 - Quadrado de um número
Execute o programa para os valores dos dados mostrados na Tabela 3, completando-a. Lembre-se que a
resposta observada é em hexadecimal. Converta o resultado para o seu valor decimal para preencher a
terceira coluna.
ENDEREÇO 201A ENDEREÇO 201B ENDEREÇO 201B
(HEXADECIMAL) (DECIMAL)
00
01
02
03
04
05
06
07
Tabela 3 - Resultados do programa

5. Análise dos resultados

1. Descreva as seguintes instruções DAD, RAL, SHLD.


2. O que é uma Tabela de Consulta?
3. Qual a função do bit de transporte (carry) em aritmética de múltipla precisão?
4. Explique os algoritmos dos Programa 2 (multiplicação) e Programa 3 (divisão).

41

Você também pode gostar