Buscar

Assembly - Primeiros passos

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Aula 5
Assembly
Primeiros Passos
5.1 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . 1
5.2 Introdução . . . . . . . . . . . . . . . . . . . . . . . . 2
5.3 Programação em linguagem assembly . . . . . . . . 3
5.4 Modelo de programação . . . . . . . . . . . . . . . . 4
5.4.1 Organização da memória . . . . . . . . . . . . . . . . 4
5.4.2 Registos principais . . . . . . . . . . . . . . . . . . . 5
5.4.3 Grupos de instruções . . . . . . . . . . . . . . . . . . 5
5.5 Regras de sintaxe . . . . . . . . . . . . . . . . . . . . 6
5.6 O assemblador . . . . . . . . . . . . . . . . . . . . . . 7
5.6.1 Caracteŕısticas gerais . . . . . . . . . . . . . . . . . . 7
5.6.2 Alguns comandos do assemblador da KEIL . . . . . 8
5.6.3 Formato das listagens . . . . . . . . . . . . . . . . . 10
5.7 Problemas . . . . . . . . . . . . . . . . . . . . . . . . . 10
5.8 Algumas resoluções . . . . . . . . . . . . . . . . . . . 12
5.1 Objectivos
Familiarização com o modelo de programação simplificado da famı́lia 51, com a
sintaxe da sua linguagem assembly e com alguns comandos do assemblador.
1
2 AULA 5. ASSEMBLY – PRIMEIROS PASSOS
5.2 Introdução
O paradigma do programa residente1 obriga, como o próprio nome indica, a
armazenar em memória um programa (conjunto de instruções) num formato
que o microprocessador entenda. Essas instruções não são mais do que códi-
gos binários que o microprocessador vai extraindo da memória, descodificando
e executando. Um programa nessa forma diz-se estar em código máquina. Pro-
gramar directamente em código máquina não é viável mesmo para programas
pequenos. De facto, por simples inspecção constata-se que os programas em
código máquina: a) são muito extensos, dif́ıceis de perceber e depurar, b) não
descrevem as tarefas a executar de um modo facilmente inteliǵıvel.
Estes problemas podem ser parcialmente resolvidos atribuindo um nome sim-
bólico (mnemónica) a cada código de instrução de modo a tornar o programa
minimamente inteliǵıvel e mais fácil de escrever; chama-se a isso programar em
linguagem assembly .
Um exemplo ajudará a clarificar estes conceitos: considere-se um programa
que adiciona o conteúdo da posição de memória 64 com o conteúdo da posição
65 colocando o resultado na posição de memória 66 e ignorando um eventual
transporte (carry). Numa descrição de alto ńıvel, considerando a memória re-
presentada pelo array mem[ ], o que este programa irá fazer é:
mem[66] = mem[64] + mem[65]
No caso particular da famı́lia 51 as operações aritméticas envolvem obrigatoria-
mente um registo – o registo acumulador (A) – que, antes da operação, guarda
um dos operandos e depois recolhe o resultado. Tendo em conta esta restrição
o programa poderá ser:
1. copiar para o acumulador o conteúdo da posiç~ao de memória
com o endereço 64,
2. adicionar ao acumulador o conteúdo da posiç~ao de memória
com o endereço 65 (ficando o resultado no acumulador),
3. copiar para a posiç~ao de memória com o endereço 66 o valor
que ficou no acumulador.
Na figura 5.1 pode ver-se a representação deste programa em código máquina e
em linguagem assembly : consta de três instruções e ocupa seis bytes.
código máquina linguagem assembly
E5 40
25 41
F5 42︸ ︷︷ ︸
MOV A,64
ADD A,65
MOV 66,A︸ ︷︷ ︸
Códigos Instruções
Figura 5.1: Representação em código máquina e linguagem assembly
1 Cfr. aulas teóricas da primeira semana.
5.3. PROGRAMAÇÃO EM LINGUAGEM ASSEMBLY 3
De acordo com o estabelecido pelo fabricante2 os códigos E5h, 25h e F5h repre-
sentam, respectivamente, as três instruções referidas anteriormente e os códigos
40h, 41h e 42h representam os endereços de memória envolvidos na operação;
note-se a necessidade de os converter para hexadecimal quando se programa
directamente em código máquina.
5.3 Programação em linguagem assembly
A tradução de um programa escrito em linguagem assembly para os códigos má-
quina correspondentes pode ser feita à mão, mediante uma tabela de conversão
mas habitualmente é feita de forma automática recorrendo a uma ferramenta
própria – o assemblador – fornecida (pelo menos em versões simples) gratuita-
mente pelo fabricante.
A programação em linguagem assembly tem vantagens e desvantagens intŕınse-
cas à própria linguagem. Como vantagens registe-se que:
• A existência de assembladores para todos os microprocessadores,
muitos deles gratuitos ou de domı́nio público, faz com que seja sem-
pre posśıvel programar em assembly, qualquer que seja o micropro-
cessador escolhido; o mesmo não acontece com linguagens de alto
ńıvel, onde nem sempre é posśıvel encontrar um compilador ade-
quado para um dado microprocessador.
• A facilidade de optimização do código permite aproveitar ao máximo
as caracteŕısticas particulares do hardware onde o programa vai ser
executado, conseguindo deste modo melhores resultados quer em
tempo de execução quer em tamanho de código gerado.
E como desvantagens:
• A extrema simplicidade das instruções é responsável pela habitual
desproporção entre as tarefas que o microprocessador é chamado a
executar e o seu conjunto de instruções. Isto obriga à decomposição
de cada tarefa a executar num conjunto de operações elementares
que, além de ser um processo demorado e sujeito a erros, dificulta a
estruturação dos programas.
• A necessidade de conhecer os detalhes internos de um microproces-
sador, em particular tudo o que se refere aos registos de trabalho
dispońıveis, registos privilegiados ou especiais, registo de estado e
conjunto de instruções, tem como consequência uma reduzida por-
tabilidade dos programas.
A tendência actual em ambiente comercial é a favor de uma programação mista,
usando principalmente linguagens de mais alto ńıvel (C em particular) e recor-
2 Foi a Intel que originalmente desenvolveu a famı́lia 51 embora actualmente existam vários
fabricantes com produtos compat́ıveis. A Philips Semiconductors é, actualmente, o fabricante
com a maior gama de produtos compat́ıveis com esta famı́lia.
4 AULA 5. ASSEMBLY – PRIMEIROS PASSOS
rendo à linguagem assembly apenas em rotinas onde a eficiência do código seja
o objectivo principal. Esta tendência explica-se por três motivos:
• a pressão do mercado obriga a encurtar o tempo de desenvolvimento e a
aumentar a facilidade de manutenção do código,
• existem actualmente compiladores para a maioria dos microprocessadores,
alguns até de domı́nio público, capazes de gerar código optimizado,
• os avanços na microelectrónica permitem que a rapidez de execução se
consiga facilmente por aumento da frequência de funcionamento.
Em ambientes académicos, especialmente se o objectivo é estudar o funciona-
mento interno de um microprocessador, o respectivo assembly é a linguagem
mais adequada pelo que será intensivamente utilizada nesta disciplina. Em
disciplinas que abordem de novo este assunto mas na perspectiva do desen-
volvimento de aplicações para microprocessadores, será natural que se utilizem
linguagens de mais alto ńıvel.
5.4 Modelo de programação
O modelo de programação de um microprocessador descreve os recursos dis-
pońıveis para o programador: organização da memória, registos de trabalho,
registos especiais, eventuais agrupamentos de registos, instruções e modos de
endereçamento dispońıveis, etc. Para começar a escrever pequenos programas
basta conhecer a organização da memória, os principais registos e os diferentes
grupos de instruções. As secções seguintes apresentam estes componentes do
modelo de programação para o caso particular da famı́lia 51.
5.4.1 Organização da memória
Do ponto de vista da programação e de uma forma extremamente resumida
podemos considerar que a famı́lia 51 permite o acesso a três zonas de memória
distintas – memória de dados interna (MDI), memória de dados externa (MDE)
e memória de programas (MP) que poderáser interna ou externa ao micro.
A figura 5.2, adaptada da folha de caracteŕısticas do componente [?], indica a
capacidade de cada uma destas zonas para o caso do 89C51.
Este elemento da famı́lia 51 possui internamente 128 bytes de RAM (que funci-
ona como MDI) e pode endereçar até 64 kBytes de memória de dados externa
adicional. Para armazenar o programa possui internamente 4 kBytes de Flash
ROM que funciona como memória de programas. Alternativamente pode ende-
reçar até 64 kBytes de memória de programas externa.
Na maioria das aplicações a distinção entre memória de programas interna e
externa é irrelevante para o programador pois ela é feita por hardware. No en-
5.4. MODELO DE PROGRAMAÇÃO 5
128 Bytes
64 kBytes
4 kBytes
60 kBytes
MDI MDE MP
Figura 5.2: Organização da memória do 89C51
tanto, na memória de dados a distinção é feita por software, existindo instruções
espećıficas para lidar com uma e com outra.
5.4.2 Registos principais
A arquitectura base da famı́lia 51 disponibiliza um número apreciável de registos
dos quais se destacam os seguintes:
• Registos de trabalho – R0 a R7,
• Registos privilegiados – A (acumulador) e B,
• Registo apontador de 16 bits – DPTR (data pointer),
• Registo de estado – PSW (program status word).
Os registos A e B são privilegiados no sentido de que existem algumas instruções
que só podem ser executadas neles, por exemplo as operações aritméticas só
podem ser efectuadas sobre o acumulador. O registo apontador de 16 bits é
utilizado para aceder à memória externa. O registo de estado (PSW) dá, entre
outras, indicações sobre a paridade do valor contido no acumulador e se houve
ou não transporte na última operação aritmética efectuada; existem instruções
espećıficas para testar estas condições.
5.4.3 Grupos de instruções
As instruções dispońıveis na famı́lia 51 podem dividir-se em cinco grupos con-
soante a sua função:
1. Instruções de movimentação de dados
2. Instruções aritméticas
3. Instruções lógicas (processamento de bytes)
4. Instruções de salto e chamada de subrotinas
5. Instruções booleanas (processamento de bits)
6 AULA 5. ASSEMBLY – PRIMEIROS PASSOS
As instruções de movimentação de dados permitem copiar valores de um
registo para outro, de um registo para memória e de memória para um registo.
As instruções aritméticas permitem efectuar as quatro operações aritméticas
elementares considerando ou não a existência de eventuais transportes. É sempre
necessário recorrer ao registo acumulador.
As instruções lógicas permitem efectuar operações lógicas elementares – AND,
OR, XOR e NOT, sempre bit a bit – sobre operandos de um byte, assim como
rotações de bits para a esquerda ou para a direita.
As instruções de salto e chamada de subrotinas permitem alterar a ordem de
execução de um programa de forma condicional ou incondicional.
As instruções booleanas permitem manipular bits individualmente. A maior
parte delas obriga a utilizar a flag CY (carry) que funciona para o processamento
booleano como o acumulador para o processamento aritmético e lógico. bit do
psw
O resumo de instruções [2] ou [1, páginas 13..16] dá uma panorâmica geral das
instruções dispońıveis pelo que constitui um elemento de consulta indispensável.
O livro recomendado [4, secção 8.7] ou o manual de programação editado por
um dos fabricantes desta famı́lia [1] constitui a principal referência para estudo
deste assunto.
5.5 Regras de sintaxe
A forma geral de uma instrução assembly da famı́lia 51 é
mnemónica [operando1[,operando2[,operando3]]]
isto é, cada instrução é constitúıda por uma mnemónica eventualmente seguida
de um, dois ou três operandos que podem ser:
• um número, representando um endereço de memória,
• um número, representando uma constante (se precedido pelo carácter #),
• o nome de um registo,
• o nome de um registo a funcionar como apontador (se precedido pelo
carácter @).
Estas regras de sintaxe entendem-se melhor com a apresentação de exemplos.
Nota: Tudo o que aparece após o carácter ‘;’ é considerado comentário até ao
fim da linha.
Assegure-se que entende completamente todas as instruções apresentadas no
segmento de programa seguinte:
5.6. O ASSEMBLADOR 7
; Copia para o registo R5...
MOV R5,40h ; ...o conteúdo da posiç~ao de memória 64.
MOV R5,#40h ; ...o valor 64.
; Coloca no registo DPTR o valor 50000 (C350h).
MOV DPTR,#50000
; Adiciona ao acumulador (acc) o registo R7.
ADD A,R7 ; O resultado fica em acc.
; Faz o OU lógico (bit a bit) do acc com o valor F0h.
ORL A,#11110000b ; O resultado fica em acc.
; Copia para a posiç~ao de memória 65 o que está em acc.
MOV 65,A
; Continua a execuç~ao do programa no endereço 4358h.
LJMP 4358h
; Copia para o acumulador...
MOV A,R0 ; ...o que está em R0
MOV A,@R0 ; ...o conteúdo da posiç~ao de memória
; de dados interna apontada por R0.
Note-se que dos registos de trabalho R0 a R7, apenas R0 e R1 podem assumir o
papel de apontadores. No manual de programação [1] a designação genérica Rn
refere-se aos registos R0 a R7 mas a designação Ri refere-se apenas aos registos
R0 e R1. A designação genérica direct refere-se a um endereço da memória de
dados interna.
5.6 O assemblador
5.6.1 Caracteŕısticas gerais
Uma ferramenta essencial quando se programa em linguagem assembly é o as-
semblador. Os primeiros assembladores pouco mais faziam do que a tradução
para código máquina mas actualmente têm muitas outras capacidades permi-
tindo nomeadamente:
• atribuir nomes simbólicos a endereços de memória, variáveis e grupos de
instruções,
• trabalhar em diversas bases de numeração bem como converter caracteres
nos seus códigos ASCII,
• efectuar cálculos aritméticos simples com constantes ou nomes simbólicos,
• definir os endereços de memória onde o programa e os dados irão ser
armazenados,
• reservar áreas de memória para armazenamento temporário de informação,
• configurar a geração de código máquina e o formato das listagens produ-
zidas,
• construir e utilizar bibliotecas de funções, ajudando a programar de forma
modular e a reutilizar código já escrito em assembly ou noutras linguagens.
8 AULA 5. ASSEMBLY – PRIMEIROS PASSOS
Existem actualmente inúmeros assembladores comerciais e de domı́nio público
para a famı́lia 51. Para o sistema operativo Windows um dos melhores é o
da KEIL Software (www.keil.com), dispońıvel em versão de demonstração, mas
90% funcional, no CD que acompanha o livro recomendado. Este assemblador
está integrado num ambiente gráfico, o µVision-51, que inclui também um com-
pilador de C e facilita muito o trabalho de edição dos programas. Um assembla-
dor tão bom como o anterior mas de domı́nio público, dispońıvel em fonte para
Windows e para Linux, é o AS8051 (shop-pdp.kent.edu/ashtml/asxxxx.htm)
utilizado no pacote SDCC – Small Device C Compiler – um compilador de C
também de domı́nio público (scdd.sourceforge.net). Nas aulas serão utilizadas
as versões de demonstração dos produtos da KEIL.
5.6.2 Alguns comandos do assemblador da KEIL
Indicações gerais
Não há distinção entre maiúsculas e minúsculas. Qualquer texto precedido do
carácter ‘;’ é considerado comentário; um comentário prolonga-se sempre até
ao fim da linha. O fim do código fonte é indicado pelo comando END; qualquer
texto que apareça depois desse comando é ignorado pelo assemblador.
Nomes simbólicos e operadores simples
Uma das grandes vantagens de utilizar um assemblador é a possibilidade de
poder definir nomes simbólicos. Para as constantes essa definição faz-se com
os comandos EQU e DB e para as variáveis com o comando DS cuja sintaxe se
depreende dos exemplos apresentados de seguida, adaptados de um programa
para controlo de uma máquina de encher e empacotar garrafas:
; === Definiç~ao de Constantes =========================================
GarrafasEQU 12 ; Número de garrafas por caixa
tempo equ 250 ; Tempo de engarrafamento (ms)
V1 equ 8000h ; Endereço de E/S da válvula 1
V2 EQU V1+1 ; Endereço de E/S da válvula 2
V3 EQU V1+2 ; Endereço de E/S da válvula 3
init equ 10011010b ; Comando de inicializaç~ao
prompt equ ’>’ ; Código ASCII do prompt do sistema
CR EQU 0Ah ; Carriage return (ASCII)
LF EQU 0Dh ; Line feed (ASCII)
; === Mensagens do sistema ============================================
Pin: DB CR,LF,"Introduza o seu PIN: " ; Reserva e preenche MP
; === Variáveis =======================================================
Contador: DS 1 ; Reserva um byte em MD
Total: DS 2 ; Reserva dois bytes em MD
5.6. O ASSEMBLADOR 9
O comando DS apenas reserva espaço enquanto que o comando DB reserva e
preenche; note-se a necessidade de ‘:’ nestes comandos. A diferença entre DB
e EQU é que o primeiro não gera qualquer código máquina enquanto o segundo
preenche a memória com os valores indicados.
A definição de nomes simbólicos para endereços de programa é feita implicita-
mente ao colocar uma etiqueta antes da instrução que se quer referenciar:
mov cont,#100 ; Valor inicial do contador
loop: dec cont ; Decrementa
mov a,cont
jnz loop ; Repete enquanto A n~ao for zero
Segmentos
Ao programar em assembly o programador pode escolher os endereços onde fi-
cará o programa e onde ficarão os dados. Para isso é necessário definir segmentos
de memória. Os segmentos podem ser absolutos ou recolocáveis. Os primeiros
serão utilizados desde já enquanto que os segundos só nas próximas aulas.
Um segmento absoluto é uma zona de memória com endereço inicial fixo. São
definidos recorrendo, entre outros, aos comandos CSEG (para segmentos em me-
mória de programa) e DSEG (para segmentos em memória de dados interna). A
sintaxe destes comandos depreende-se do exemplo apresentado:
; === Variáveis ========================================================
DSEG AT 40h ; Segmento em MDI com inı́cio em 40h
total: DS 2 ; Reserva dois bytes
contador: DS 1 ; Reserva um byte
; === Programa principal ===============================================
CSEG AT 0000h ; Segmento em MP com inı́cio em 0000h
.
.
.
; --- Rotinas de E/S ---------------------------------------------------
CSEG AT 007Fh ; Segmento em MP com inı́cio em 007Fh
.
.
.
; === Mensagens do sistema =============================================
CSEG AT 0100h ; Segmento no endereço 0100h da MP
Pin: DB CR,LF,"Introduza o seu PIN: " ; Preenche 23 bytes
No exemplo apresentado, a variável total ocupará os endereços 40h e 41h da
memória de dados e a variável contador ocupará o endereço 42h. O programa
principal começa no endereço 0000h da memória de programas e há um conjunto
de rotinas que ocupam uma zona com ińıcio em 007Fh da memória de programas.
No endereço 0100h da memória de programas começam as mensagens do sistema.
10 AULA 5. ASSEMBLY – PRIMEIROS PASSOS
5.6.3 Formato das listagens
O assemblador da KEIL permite definir vários parâmetros de formatação para
as listagens que gera. Se nada for dito em contrário, as listagens são formatadas
de modo a evidenciar o endereço de memória em que cada instrução começa e os
códigos gerados para cada instrução. Mais uma vez um exemplo é elucidativo:
LOC OBJ LINE SOURCE
---- 1 dseg at 40h
0040 2 cont: ds 1
3
---- 4 cseg at 0
0000 754064 5 mov cont,#100
0003 1540 6 loop: dec cont
0005 E540 7 mov a,cont
0007 70FA 8 jnz loop
9
10 end
Examinando a 1a coluna da listagem (endereços) facilmente se percebe que a
variável cont (linha 2) ficou colocada no endereço 40h e examinando a 2a coluna
(códigos gerados) facilmente se vê que a primeira instrução (linha 5) gerou três
bytes – o primeiro é o código da instrução propriamente dita, o segundo o
endereço da variável (40h) e o terceiro o valor que nela é colocado (64h=100).
5.7 Problemas
A única maneira de aprender a programar em assembly é escrever programas
em assembly ! Apresentam-se de seguida alguns problemas básicos que podem
ser resolvidos recorrendo a instruções aritméticas, lógicas e de movimentação de
dados. Deverá ter sempre à mão o resumo das instruções.
1. Quais as sequências de instruções necessárias para efectuar as seguintes
operações:
(a) Copiar o conteúdo do registo R5 para R3. ( repararque
éimposśıvelcopiardirectamentedeumregistoparaoutro )
(b) Trocar entre si os conteúdos dos registos R5 e R3 sem estragar mais
nenhum registo. ( utilizarainstruçãoxch )
2. Apresente programas que, de dois modos diferentes, neguem o conteúdo da
variável montante guardada em memória de dados interna no endereço
50. Em ambos os casos o resultado deve ficar na variável jusante guar-
dada no endereço seguinte. Para cada caso considere duas alternativas:
(a) É necessário preservar a variável montante.
(b) Não é necessário preservar a variável montante.
5.7. PROBLEMAS 11
( podecomplementar-seovaloroufazerumaoperaçãoXORcom
amáscaraFFh )
3. Traduza à mão, para código máquina, as soluções do problema anterior.
4. Apresente três modos diferentes de multiplicar por 2 o valor da variável ve-
locidade guardada em memória de dados interna num endereço à escolha.
( adicionarasipŕopria,multiplicarpordois,fazerumarotaçãodeumbit
àesquerda. )
5. Considerando que mem[ ] representa a memória de dados interna, escreva
programas para efectuar as seguintes operações:
(a) mem[22] = mem[21] – mem[20].
(b) mem[21] = 3 × mem[20], supondo que mem[20] é inferior a 86.
Porquê?
6. Sabendo que a variável minutos pode variar entre 0 e 200, escreva um
programa para efectuar a operação segundos = 60 × minutos, consi-
derando que as variáveis:
(a) estão guardadas em endereços de memória de dados interna à escolha;
(b) estão guardadas em endereços de memória de dados externa:
i. inferiores a 100h;
ii. superiores ou iguais a 100h.
Nos problemas seguintes, as variáveis são guardadas em endereços de memória
de dados interna à escolha.
7. Escreva um programa que calcule x = x + y para variáveis de 16 bits.
8. Escreva um programa que calcule x = x 2 considerando um valor inicial
de x inferior a 256.
9. Escreva um programa que calcule x = – x (complemento para 2) consi-
derando que:
(a) x é de 8 bits
(b) x é de 16 bits
10. Escreva um programa que copie os 4 bits mais significativos de x para os
4 bits menos significativos de y, considerando que são variáveis de 8 bits.
Os 4 bits mais significativos de y devem ser colocados a zero.
11. Considere que temptot contém a soma das medições de temperatura efec-
tuadas em 16 pontos diferentes de uma estufa. Apresente 3 modos diferen-
tes de calcular a temperatura média no interior da estufa. Suponha que
está a trabalhar com variáveis de 8 bits e o resultado é guardado em temp-
med. ( dividirpor16,rodaràdireitaquatrobitsoutrocarasmetades ).
12 AULA 5. ASSEMBLY – PRIMEIROS PASSOS
5.8 Algumas resoluções
A t́ıtulo excepcional, por ser a primeira vez que se resolvem problemas deste
tipo, apresentam-se algumas soluções completas.
LOC OBJ LINE SOURCE
1 ;======================================================================
2 ; Possı́veis resoluç~oes para alguns dos problemas
3 ;======================================================================
8
9 ;-[1.b]-----------------------------------------------
0002 CD 10 xch a,r5 ; Estraga acc mas acaba
0003 CB 11 xch a,r3 ; por recuperar o
0004 CD 12 xch a,r5 ; seu valor inicial
15
16 ;-[2.a]-----------------------------------------------
00FF 17 mask equ 11111111b ; Negar todos os bits...
18
---- 19 dseg at 50
0032 20 montante: ds 1
0033 21 jusante: ds 1
22
---- 23 cseg at 0
0000 E532 24 mov a,montante ; Extrai valor
0002 F4 25 cpl a ; Complementa
0003 F533 26 mov jusante,a ; Guarda resultado
27
0005 853233 28 mov jusante,montante ; Copia
0008 6333FF 29 xrl jusante,#mask ; Complementa
31
32 ;-[4 (parcial)]-------------------------------------------- 33 dseg at 60
003C 34 velocidade: ds 1
35
---- 36 cseg at 100h
0100 E53C 37 mov a,velocidade
0102 253C 38 add a,velocidade
0104 F53C 39 mov velocidade,a
40
0106 E53C 41 mov a,velocidade
0108 C3 42 clr c
0109 33 43 rlc a
010A F53C 44 mov velocidade,a
46
47 ;-[5.a]-----------------------------------------------
010C E515 48 mov a,21
010E C3 49 clr c
010F 9514 50 subb a,20
0111 F516 51 mov 22,a
52
53 ;-[5.b]-----------------------------------------------
0113 E514 54 mov a,20
0115 75F003 55 mov b,#3
0118 A4 56 mul ab
0119 F515 57 mov 21,a
58
59
60 ;-[6 (parcial)]---------------------------------------
---- 61 dseg at 70
0046 62 segundos: ds 2
0048 63 minutos: ds 1
64
---- 65 cseg at 200h
0200 E548 66 mov a,minutos
0202 75F03C 67 mov b,#60
0205 A4 68 mul ab
0206 F546 69 mov segundos,a
0208 85F047 70 mov segundos+1,b
72
73 ;-[7]-------------------------------------------------
5.8. ALGUMAS RESOLUÇÕES 13
74 vars segment data
75 prog segment code
76
---- 77 rseg vars
0000 78 x: ds 2
0002 79 y: ds 2
80
---- 81 rseg prog
0000 E500 F 82 mov a,x
0002 2500 F 83 add a,y
0004 F500 F 84 mov x,a
0006 E500 F 85 mov a,x+1
0008 3500 F 86 addc a,y+1
000A F500 F 87 mov x+1,a
88
89 ;-[8]-------------------------------------------------
000C E500 F 90 mov a,x
000E 8500F0 F 91 mov b,x
0011 A4 92 mul ab
0012 F500 F 93 mov x,a
0014 85F000 F 94 mov x+1,b
96
97 ;-[9.a]-----------------------------------------------
0017 E500 F 98 mov a,x
0019 F4 99 cpl a
001A 2401 100 add a,#1
001C F500 F 101 mov x,a
103
104 ;-[9.b]-----------------------------------------------
001E E500 F 105 mov a,x
0020 F4 106 cpl a
0021 2401 107 add a,#1
0023 F500 F 108 mov x,a
0025 E500 F 109 mov a,x+1
0027 F4 110 cpl a
0028 3400 111 addc a,#0
002A F500 F 112 mov x+1,a
114
115 ;-[10]------------------------------------------------
002C E500 F 116 mov a,x
002E C4 117 swap a
002F 540F 118 anl a,#00001111b
0031 F500 F 119 mov y,a
121
122 ;-[11]------------------------------------------------
123 valores segment data
124 rotinas segment code
125
---- 126 rseg valores
0000 127 temptot: ds 1
0001 128 tempmed: ds 1
129
---- 130 rseg rotinas
0000 E500 F 131 mov a,temptot
0002 75F010 132 mov b,#16
0005 84 133 div ab
0006 F500 F 134 mov tempmed,a
135
0008 E500 F 136 mov a,temptot
000A 54F0 137 anl a,#11110000b
000C 03 138 rr a
000D 03 139 rr a
000E 03 140 rr a
000F 03 141 rr a
0010 F500 F 142 mov tempmed,a
143
0012 E500 F 144 mov a,temptot
0014 C4 145 swap a
0015 540F 146 anl a,#00001111b
0017 F500 F 147 mov tempmed,a
148
149 end
14 AULA 5. ASSEMBLY – PRIMEIROS PASSOS
Referências
[1] Philips semiconductors; 80C51 family programmer’s guide and instruction
set ; Setembro de 1997.
[2] Ferreira, José Manuel; Resumo das instruções do 80C51 ; FEUP, Setembro
de 2000.
[3] Atmel Wireless and Microcontrollers; 89C51 data sheet ; Setembro de 1999.
[4] Ferreira, José Manuel; Introdução ao Projecto com Sistemas Digitais e Mi-
crocontroladores; FEUP Edições, 1998, ISBM 972-752-032-4.
15
	Assembly -- primeiros passos
	Objectivos
	Introdução
	Programação em linguagem assembly
	Modelo de programação
	Organização da memória
	Registos principais
	Grupos de instruções
	Regras de sintaxe
	O assemblador
	Características gerais
	Alguns comandos do assemblador da KEIL
	Formato das listagens
	Problemas
	Algumas resoluções

Continue navegando