Aula 5
Assembly
Primeiros Passos
5.1 Objectivos . . . 1
5.2 Introdu¸c˜ao . . . 2
5.3 Programa¸c˜ao em linguagemassembly . . . 3
5.4 Modelo de programa¸c˜ao . . . 4
5.4.1 Organiza¸c˜ao da mem´oria . . . 4
5.4.2 Registos principais . . . 5
5.4.3 Grupos de instru¸c˜oes . . . 5
5.5 Regras de sintaxe . . . 6
5.6 O assemblador . . . 7
5.6.1 Caracter´ı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¸c˜oes . . . 12
5.1 Objectivos
Familiariza¸c˜ao com o modelo de programa¸c˜ao simplificado da fam´ılia 51, com a sintaxe da sua linguagemassembly e com alguns comandos do assemblador.
1
5.2 Introdu¸ c˜ ao
O paradigma do programa residente1 obriga, como o pr´oprio nome indica, a armazenar em mem´oria um programa (conjunto de instru¸c˜oes) num formato que o microprocessador entenda. Essas instru¸c˜oes n˜ao s˜ao mais do que c´odi- gos bin´arios que o microprocessador vai extraindo da mem´oria, descodificando e executando. Um programa nessa forma diz-se estar emc´odigo m´aquina. Pro- gramar directamente em c´odigo m´aquina n˜ao ´e vi´avel mesmo para programas pequenos. De facto, por simples inspec¸c˜ao constata-se que os programas em c´odigo m´aquina: a) s˜ao muito extensos, dif´ıceis de perceber e depurar, b) n˜ao descrevem as tarefas a executar de um modo facilmente intelig´ıvel.
Estes problemas podem ser parcialmente resolvidos atribuindo um nome sim- b´olico (mnem´onica) a cada c´odigo de instru¸c˜ao de modo a tornar o programa minimamente intelig´ıvel e mais f´acil de escrever; chama-se a isso programar em linguagemassembly.
Um exemplo ajudar´a a clarificar estes conceitos: considere-se um programa que adiciona o conte´udo da posi¸c˜ao de mem´oria 64 com o conte´udo da posi¸c˜ao 65 colocando o resultado na posi¸c˜ao de mem´oria 66 e ignorando um eventual transporte (carry). Numa descri¸c˜ao de alto n´ıvel, considerando a mem´oria re- presentada peloarray mem[ ], o que este programa ir´a fazer ´e:
mem[66] = mem[64] + mem[65]
No caso particular da fam´ılia 51 as opera¸c˜oes aritm´eticas envolvem obrigatoria- mente um registo – o registo acumulador (A) – que, antes da opera¸c˜ao, guarda um dos operandos e depois recolhe o resultado. Tendo em conta esta restri¸c˜ao o programa poder´a ser:
1. copiar para o acumulador o conte´udo da posi¸c~ao de mem´oria com o endere¸co 64,
2. adicionar ao acumulador o conte´udo da posi¸c~ao de mem´oria com o endere¸co 65 (ficando o resultado no acumulador), 3. copiar para a posi¸c~ao de mem´oria com o endere¸co 66 o valor
que ficou no acumulador.
Na figura 5.1 pode ver-se a representa¸c˜ao deste programa em c´odigo m´aquina e em linguagemassembly: consta de trˆes instru¸c˜oes e ocupa seisbytes.
c´odigo m´aquina linguagemassembly E5 40
25 41 F5 42
| {z }
MOV A,64 ADD A,65 MOV 66,A
| {z }
C´odigos Instru¸c˜oes
Figura 5.1: Representa¸c˜ao em c´odigo m´aquina e linguagemassembly
1Cfr. aulas te´oricas da primeira semana.
5.3. PROGRAMA ¸C ˜AO EM LINGUAGEM ASSEMBLY 3 De acordo com o estabelecido pelo fabricante2 os c´odigosE5h,25heF5hrepre- sentam, respectivamente, as trˆes instru¸c˜oes referidas anteriormente e os c´odigos 40h, 41h e42hrepresentam os endere¸cos de mem´oria envolvidos na opera¸c˜ao;
note-se a necessidade de os converter para hexadecimal quando se programa directamente em c´odigo m´aquina.
5.3 Programa¸ c˜ ao em linguagem assembly
A tradu¸c˜ao de um programa escrito em linguagemassemblypara os c´odigos m´a- quina correspondentes pode ser feita `a m˜ao, mediante uma tabela de convers˜ao mas habitualmente ´e feita de forma autom´atica recorrendo a uma ferramenta pr´opria – oassemblador – fornecida (pelo menos em vers˜oes simples) gratuita- mente pelo fabricante.
A programa¸c˜ao em linguagemassembly tem vantagens e desvantagens intr´ınse- cas `a pr´opria linguagem. Como vantagens registe-se que:
• A existˆencia de assembladores para todos os microprocessadores, muitos deles gratuitos ou de dom´ınio p´ublico, faz com que seja sem- pre poss´ıvel programar emassembly, qualquer que seja o micropro- cessador escolhido; o mesmo n˜ao acontece com linguagens de alto n´ıvel, onde nem sempre ´e poss´ıvel encontrar um compilador ade- quado para um dado microprocessador.
• A facilidade de optimiza¸c˜ao do c´odigo permite aproveitar ao m´aximo as caracter´ısticas particulares dohardware onde o programa vai ser executado, conseguindo deste modo melhores resultados quer em tempo de execu¸c˜ao quer em tamanho de c´odigo gerado.
E como desvantagens:
• A extrema simplicidade das instru¸c˜oes ´e respons´avel pela habitual despropor¸c˜ao entre as tarefas que o microprocessador ´e chamado a executar e o seu conjunto de instru¸c˜oes. Isto obriga `a decomposi¸c˜ao de cada tarefa a executar num conjunto de opera¸c˜oes elementares que, al´em de ser um processo demorado e sujeito a erros, dificulta a estrutura¸c˜ao dos programas.
• A necessidade de conhecer os detalhes internos de um microproces- sador, em particular tudo o que se refere aos registos de trabalho dispon´ıveis, registos privilegiados ou especiais, registo de estado e conjunto de instru¸c˜oes, tem como consequˆencia uma reduzida por- tabilidade dos programas.
A tendˆencia actual em ambiente comercial ´e a favor de uma programa¸c˜ao mista, usando principalmente linguagens de mais alto n´ıvel (C em particular) e recor-
2Foi a Intel que originalmente desenvolveu a fam´ılia 51 embora actualmente existam v´arios fabricantes com produtos compat´ıveis. A Philips Semiconductors ´e, actualmente, o fabricante com a maior gama de produtos compat´ıveis com esta fam´ılia.
rendo `a linguagemassembly apenas em rotinas onde a eficiˆencia do c´odigo seja o objectivo principal. Esta tendˆencia explica-se por trˆes motivos:
• a press˜ao do mercado obriga a encurtar o tempo de desenvolvimento e a aumentar a facilidade de manuten¸c˜ao do c´odigo,
• existem actualmente compiladores para a maioria dos microprocessadores, alguns at´e de dom´ınio p´ublico, capazes de gerar c´odigo optimizado,
• os avan¸cos na microelectr´onica permitem que a rapidez de execu¸c˜ao se consiga facilmente por aumento da frequˆencia de funcionamento.
Em ambientes acad´emicos, especialmente se o objectivo ´e estudar o funciona- mento interno de um microprocessador, o respectivo assembly ´e a linguagem mais adequada pelo que ser´a intensivamente utilizada nesta disciplina. Em disciplinas que abordem de novo este assunto mas na perspectiva do desen- volvimento de aplica¸c˜oes para microprocessadores, ser´a natural que se utilizem linguagens de mais alto n´ıvel.
5.4 Modelo de programa¸ c˜ ao
O modelo de programa¸c˜ao de um microprocessador descreve os recursos dis- pon´ıveis para o programador: organiza¸c˜ao da mem´oria, registos de trabalho, registos especiais, eventuais agrupamentos de registos, instru¸c˜oes e modos de endere¸camento dispon´ıveis, etc. Para come¸car a escrever pequenos programas basta conhecer a organiza¸c˜ao da mem´oria, os principais registos e os diferentes grupos de instru¸c˜oes. As sec¸c˜oes seguintes apresentam estes componentes do modelo de programa¸c˜ao para o caso particular da fam´ılia 51.
5.4.1 Organiza¸ c˜ ao da mem´ oria
Do ponto de vista da programa¸c˜ao e de uma forma extremamente resumida podemos considerar que a fam´ılia 51 permite o acesso a trˆes zonas de mem´oria distintas – mem´oria de dados interna (MDI), mem´oria de dados externa (MDE) e mem´oria de programas (MP) que poder´a ser interna ou externa ao micro.
A figura 5.2, adaptada da folha de caracter´ı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¸car at´e 64 kBytes de mem´oria de dados externa adicional. Para armazenar o programa possui internamente 4 kBytes de Flash ROM que funciona como mem´oria de programas. Alternativamente pode ende- re¸car at´e 64 kBytes de mem´oria de programas externa.
Na maioria das aplica¸c˜oes a distin¸c˜ao entre mem´oria de programas interna e externa ´e irrelevante para o programador pois ela ´e feita por hardware. No en-
5.4. MODELO DE PROGRAMA ¸C ˜AO 5
128 Bytes
64 kBytes
4 kBytes 60 kBytes
MDI MDE MP
Figura 5.2: Organiza¸c˜ao da mem´oria do 89C51
tanto, na mem´oria de dados a distin¸c˜ao ´e feita porsoftware, existindo instru¸c˜oes espec´ıficas para lidar com uma e com outra.
5.4.2 Registos principais
A arquitectura base da fam´ılia 51 disponibiliza um n´umero apreci´avel 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˜ao privilegiados no sentido de que existem algumas instru¸c˜oes que s´o podem ser executadas neles, por exemplo as opera¸c˜oes aritm´eticas s´o podem ser efectuadas sobre o acumulador. O registo apontador de 16 bits ´e utilizado para aceder `a mem´oria externa. O registo de estado (PSW) d´a, entre outras, indica¸c˜oes sobre a paridade do valor contido no acumulador e se houve ou n˜ao transporte na ´ultima opera¸c˜ao aritm´etica efectuada; existem instru¸c˜oes espec´ıficas para testar estas condi¸c˜oes.
5.4.3 Grupos de instru¸ c˜ oes
As instru¸c˜oes dispon´ıveis na fam´ılia 51 podem dividir-se em cinco grupos con- soante a sua fun¸c˜ao:
1. Instru¸c˜oes de movimenta¸c˜ao de dados 2. Instru¸c˜oes aritm´eticas
3. Instru¸c˜oes l´ogicas (processamento debytes) 4. Instru¸c˜oes de salto e chamada de subrotinas 5. Instru¸c˜oes booleanas (processamento de bits)
As instru¸c˜oes de movimenta¸c˜ao de dados permitem copiar valores de um registo para outro, de um registo para mem´oria e de mem´oria para um registo.
As instru¸c˜oesaritm´eticas permitem efectuar as quatro opera¸c˜oes aritm´eticas elementares considerando ou n˜ao a existˆencia de eventuais transportes. ´E sempre necess´ario recorrer ao registo acumulador.
As instru¸c˜oesl´ogicaspermitem efectuar opera¸c˜oes l´ogicas elementares – AND, OR, XOR e NOT, sempre bit a bit – sobre operandos de umbyte, assim como rota¸c˜oes de bits para a esquerda ou para a direita.
As instru¸c˜oes desaltoechamadade subrotinas permitem alterar a ordem de execu¸c˜ao de um programa de forma condicional ou incondicional.
As instru¸c˜oes booleanas permitem manipular bits individualmente. A maior parte delas obriga a utilizar aflagCY (carry) que funciona para o processamento booleano como o acumulador para o processamento aritm´etico e l´ogico. bit do psw
O resumo de instru¸c˜oes [2] ou [1, p´aginas 13..16] d´a uma panorˆamica geral das instru¸c˜oes dispon´ıveis pelo que constitui um elemento de consulta indispens´avel.
O livro recomendado [4, sec¸c˜ao 8.7] ou o manual de programa¸c˜ao editado por um dos fabricantes desta fam´ılia [1] constitui a principal referˆencia para estudo deste assunto.
5.5 Regras de sintaxe
A forma geral de uma instru¸c˜aoassembly da fam´ılia 51 ´e
mnem´onica [operando1[,operando2[,operando3]]]
isto ´e, cada instru¸c˜ao ´e constitu´ıda por uma mnem´onica eventualmente seguida de um, dois ou trˆes operandos que podem ser:
• um n´umero, representando um endere¸co de mem´oria,
• um n´umero, representando uma constante (se precedido pelo car´acter#),
• o nome de um registo,
• o nome de um registo a funcionar como apontador (se precedido pelo car´acter @).
Estas regras de sintaxe entendem-se melhor com a apresenta¸c˜ao de exemplos.
Nota: Tudo o que aparece ap´os o car´acter ‘;’ ´e considerado coment´ario at´e ao fim da linha.
Assegure-se que entende completamente todas as instru¸c˜oes apresentadas no segmento de programa seguinte:
5.6. O ASSEMBLADOR 7
; Copia para o registo R5...
MOV R5,40h ; ...o conte´udo da posi¸c~ao de mem´oria 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´ogico (bit a bit) do acc com o valor F0h.
ORL A,#11110000b ; O resultado fica em acc.
; Copia para a posi¸c~ao de mem´oria 65 o que est´a em acc.
MOV 65,A
; Continua a execu¸c~ao do programa no endere¸co 4358h.
LJMP 4358h
; Copia para o acumulador...
MOV A,R0 ; ...o que est´a em R0
MOV A,@R0 ; ...o conte´udo da posi¸c~ao de mem´oria
; 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¸c˜ao [1] a designa¸c˜ao gen´ericaRn refere-se aos registos R0 a R7 mas a designa¸c˜aoRi refere-se apenas aos registos R0 e R1. A designa¸c˜ao gen´ericadirect refere-se a um endere¸co da mem´oria de dados interna.
5.6 O assemblador
5.6.1 Caracter´ısticas gerais
Uma ferramenta essencial quando se programa em linguagem assembly ´e o as- semblador. Os primeiros assembladores pouco mais faziam do que a tradu¸c˜ao para c´odigo m´aquina mas actualmente tˆem muitas outras capacidades permi- tindo nomeadamente:
• atribuir nomes simb´olicos a endere¸cos de mem´oria, vari´aveis e grupos de instru¸c˜oes,
• trabalhar em diversas bases de numera¸c˜ao bem como converter caracteres nos seus c´odigos ASCII,
• efectuar c´alculos aritm´eticos simples com constantes ou nomes simb´olicos,
• definir os endere¸cos de mem´oria onde o programa e os dados ir˜ao ser armazenados,
• reservar ´areas de mem´oria para armazenamento tempor´ario de informa¸c˜ao,
• configurar a gera¸c˜ao de c´odigo m´aquina e o formato das listagens produ- zidas,
• construir e utilizar bibliotecas de fun¸c˜oes, ajudando a programar de forma modular e a reutilizar c´odigo j´a escrito emassemblyou noutras linguagens.
Existem actualmente in´umeros assembladores comerciais e de dom´ınio p´ublico para a fam´ılia 51. Para o sistema operativo Windows um dos melhores ´e o
daKEIL Software (www.keil.com), dispon´ıvel em vers˜ao de demonstra¸c˜ao, mas
90% funcional, no CD que acompanha o livro recomendado. Este assemblador est´a integrado num ambiente gr´afico, oµVision-51, que inclui tamb´em um com- pilador de C e facilita muito o trabalho de edi¸c˜ao dos programas. Um assembla- dor t˜ao bom como o anterior mas de dom´ınio p´ublico, dispon´ıvel em fonte para Windows e para Linux, ´e o AS8051 (shop-pdp.kent.edu/ashtml/asxxxx.htm) utilizado no pacote SDCC – Small Device C Compiler – um compilador de C tamb´em de dom´ınio p´ublico (scdd.sourceforge.net). Nas aulas ser˜ao utilizadas as vers˜oes de demonstra¸c˜ao dos produtos da KEIL.
5.6.2 Alguns comandos do assemblador da KEIL
Indica¸c˜oes gerais
N˜ao h´a distin¸c˜ao entre mai´usculas e min´usculas. Qualquer texto precedido do car´acter ‘;’ ´e considerado coment´ario; um coment´ario prolonga-se sempre at´e ao fim da linha. O fim do c´odigo fonte ´e indicado pelo comandoEND; qualquer texto que apare¸cadepois desse comando ´e ignorado pelo assemblador.
Nomes simb´olicos e operadores simples
Uma das grandes vantagens de utilizar um assemblador ´e a possibilidade de poder definir nomes simb´olicos. Para as constantes essa defini¸c˜ao faz-se com os comandos EQU e DB e para as vari´aveis com o comando DS cuja sintaxe se depreende dos exemplos apresentados de seguida, adaptados de um programa para controlo de uma m´aquina de encher e empacotar garrafas:
; === Defini¸c~ao de Constantes =========================================
Garrafas EQU 12 ; N´umero de garrafas por caixa tempo equ 250 ; Tempo de engarrafamento (ms) V1 equ 8000h ; Endere¸co de E/S da v´alvula 1 V2 EQU V1+1 ; Endere¸co de E/S da v´alvula 2 V3 EQU V1+2 ; Endere¸co de E/S da v´alvula 3 init equ 10011010b ; Comando de inicializa¸c~ao
prompt equ ’>’ ; C´odigo 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´aveis =======================================================
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¸co enquanto que o comando DB reserva e preenche; note-se a necessidade de ‘:’ nestes comandos. A diferen¸ca entre DB eEQU´e que o primeiro n˜ao gera qualquer c´odigo m´aquina enquanto o segundo preenche a mem´oria com os valores indicados.
A defini¸c˜ao de nomes simb´olicos para endere¸cos de programa ´e feita implicita- mente ao colocar uma etiqueta antes da instru¸c˜ao 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 emassembly o programador pode escolher os endere¸cos onde fi- car´a o programa e onde ficar˜ao os dados. Para isso ´e necess´ario definir segmentos de mem´oria. Os segmentos podem ser absolutos ou recoloc´aveis. Os primeiros ser˜ao utilizados desde j´a enquanto que os segundos s´o nas pr´oximas aulas.
Um segmento absoluto ´e uma zona de mem´oria com endere¸co inicial fixo. S˜ao definidos recorrendo, entre outros, aos comandosCSEG(para segmentos em me- m´oria de programa) e DSEG(para segmentos em mem´oria de dados interna). A sintaxe destes comandos depreende-se do exemplo apresentado:
; === Vari´aveis ========================================================
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¸co 0100h da MP Pin: DB CR,LF,"Introduza o seu PIN: " ; Preenche 23 bytes
No exemplo apresentado, a vari´aveltotal ocupar´a os endere¸cos 40h e 41h da mem´oria de dados e a vari´avelcontadorocupar´a o endere¸co 42h. O programa principal come¸ca no endere¸co 0000h da mem´oria de programas e h´a um conjunto de rotinas que ocupam uma zona com in´ıcio em 007Fh da mem´oria de programas.
No endere¸co 0100h da mem´oria de programas come¸cam as mensagens do sistema.
5.6.3 Formato das listagens
O assemblador da KEIL permite definir v´arios parˆametros de formata¸c˜ao para as listagens que gera. Se nada for dito em contr´ario, as listagens s˜ao formatadas de modo a evidenciar o endere¸co de mem´oria em que cada instru¸c˜ao come¸ca e os c´odigos gerados para cada instru¸c˜ao. Mais uma vez um exemplo ´e 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¸cos) facilmente se percebe que a vari´avelcont(linha 2) ficou colocada no endere¸co 40h e examinando a 2acoluna (c´odigos gerados) facilmente se vˆe que a primeira instru¸c˜ao (linha 5) gerou trˆes bytes – o primeiro ´e o c´odigo da instru¸c˜ao propriamente dita, o segundo o endere¸co da vari´avel (40h) e o terceiro o valor que nela ´e colocado (64h=100).
5.7 Problemas
A ´unica maneira de aprender a programar em assembly ´e escrever programas em assembly! Apresentam-se de seguida alguns problemas b´asicos que podem ser resolvidos recorrendo a instru¸c˜oes aritm´eticas, l´ogicas e de movimenta¸c˜ao de dados. Dever´a ter sempre `a m˜ao o resumo das instru¸c˜oes.
1. Quais as sequˆencias de instru¸c˜oes necess´arias para efectuar as seguintes opera¸c˜oes:
(a) Copiar o conte´udo do registoR5 paraR3. ( e qu arar rep
´ ei mp oss´ı ve lc opiar dire cta me ntede um reg isto par aou
tro )
(b) Trocar entre si os conte´udos dos registosR5 eR3 sem estragar mais nenhum registo. ( h xc ¸ c˜ao tru ins ara liz uti )
2. Apresente programas que, de dois modos diferentes, neguem o conte´udo da vari´avelmontante guardada em mem´oria de dados interna no endere¸co 50. Em ambos os casos o resultado deve ficar na vari´aveljusante guar- dada no endere¸co seguinte. Para cada caso considere duas alternativas:
(a) ´E necess´ario preservar a vari´avelmontante.
(b) N˜ao ´e necess´ario preservar a vari´avelmontante.
5.7. PROBLEMAS 11
( om Rc XO a¸ c˜ao oper ma ru aze uf oro val eo ntar-s me ple com pode
am
´ asc ara FF
h )
3. Traduza `a m˜ao, para c´odigo m´aquina, as solu¸c˜oes do problema anterior.
4. Apresente trˆes modos diferentes de multiplicar por 2 o valor da vari´avelve- locidadeguardada em mem´oria de dados interna num endere¸co `a escolha.
( it mb deu ota¸ c˜ao ar um er faz s, ordoi arp plic lti mu ia, ´ opr ipr as ionar adic
` ae sq ue
rda. )
5. Considerando quemem[ ]representa a mem´oria de dados interna, escreva programas para efectuar as seguintes opera¸c˜oes:
(a) mem[22] = mem[21] – mem[20].
(b) mem[21] = 3 ×mem[20], supondo quemem[20] ´e inferior a 86.
Porquˆe?
6. Sabendo que a vari´avel minutos pode variar entre 0 e 200, escreva um programa para efectuar a opera¸c˜aosegundos =60 × minutos, consi- derando que as vari´aveis:
(a) est˜ao guardadas em endere¸cos de mem´oria de dados interna `a escolha;
(b) est˜ao guardadas em endere¸cos de mem´oria de dados externa:
i. inferiores a 100h;
ii. superiores ou iguais a 100h.
Nos problemas seguintes, as vari´aveis s˜ao guardadas em endere¸cos de mem´oria de dados interna `a escolha.
7. Escreva um programa que calcule x = x + y para vari´aveis de 16 bits.
8. Escreva um programa que calculex = x2 considerando um valor inicial dex inferior a 256.
9. Escreva um programa que calculex = – x (complemento para 2) consi- derando que:
(a) x ´e de 8 bits (b) x ´e de 16 bits
10. Escreva um programa que copie os 4 bits mais significativos dex para os 4 bits menos significativos de y, considerando que s˜ao vari´aveis de 8 bits.
Os 4 bits mais significativos dey devem ser colocados a zero.
11. Considere quetemptotcont´em a soma das medi¸c˜oes de temperatura efec- tuadas em 16 pontos diferentes de uma estufa. Apresente 3 modos diferen- tes de calcular a temperatura m´edia no interior da estufa. Suponha que est´a a trabalhar com vari´aveis de 8 bits e o resultado ´e guardado emtemp- med. ( s etade asm ocar outr its ob uatr taq rei ` adi rodar or16, rp idi div ).
5.8 Algumas resolu¸ c˜ oes
A t´ıtulo excepcional, por ser a primeira vez que se resolvem problemas deste tipo, apresentam-se algumas solu¸c˜oes completas.
LOC OBJ LINE SOURCE
1 ;======================================================================
2 ; Poss´ıveis resolu¸c~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 ¸C ˜OES 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
Referˆ encias
[1] Philips semiconductors; 80C51 family programmer’s guide and instruction set; Setembro de 1997.
[2] Ferreira, Jos´e Manuel;Resumo das instru¸c˜oes do 80C51; FEUP, Setembro de 2000.
[3] Atmel Wireless and Microcontrollers;89C51 data sheet; Setembro de 1999.
[4] Ferreira, Jos´e Manuel;Introdu¸c˜ao ao Projecto com Sistemas Digitais e Mi-
crocontroladores; FEUP Edi¸c˜oes, 1998, ISBM 972-752-032-4.
15