Assembly Primeiros Passos - paginas.fe.up.pt

Estes problemas podem ser parcialmente resolvidos atribuindo um nome sim- ... A programa¸c˜ao em linguagem assembly tem vantagens e desvantagens intr´...

76 downloads 732 Views 191KB Size
Aula 5

Assembly Primeiros Passos

5.1

5.1

Objectivos . . . . . . . . . . . . . . . . . . . . . . . . .

1

5.2

Introdu¸ c˜ ao

. . . . . . . . . . . . . . . . . . . . . . . .

2

5.3

Programa¸ c˜ ao em linguagem assembly . . . . . . . .

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

Objectivos

Familiariza¸c˜ ao com o modelo de programa¸c˜ao 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¸ c˜ ao

O paradigma do programa residente 1 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´odigos bin´ arios que o microprocessador vai extraindo da mem´oria, descodificando e executando. Um programa nessa forma diz-se estar em c´ odigo m´ aquina. Programar 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 simb´ 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 linguagem assembly. 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 representada pelo array 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 obrigatoriamente 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 linguagem assembly: consta de trˆes instru¸c˜oes e ocupa seis bytes. c´ odigo m´aquina

linguagem assembly

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 linguagem assembly 1

Cfr. aulas te´ oricas da primeira semana.

˜ EM LINGUAGEM ASSEMBLY 5.3. PROGRAMAC ¸ AO

3

De acordo com o estabelecido pelo fabricante2 os c´odigos E5h, 25h e F5h representam, respectivamente, as trˆes instru¸c˜oes referidas anteriormente e os c´odigos 40h, 41h e 42h representam 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 linguagem assembly para os c´odigos m´aquina 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 – o assemblador – fornecida (pelo menos em vers˜oes simples) gratuitamente pelo fabricante. A programa¸c˜ ao em linguagem assembly tem vantagens e desvantagens intr´ınsecas `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 sempre poss´ıvel programar em assembly, qualquer que seja o microprocessador escolhido; o mesmo n˜ao acontece com linguagens de alto n´ıvel, onde nem sempre ´e poss´ıvel encontrar um compilador adequado para um dado microprocessador. • A facilidade de optimiza¸c˜ ao do c´odigo permite aproveitar ao m´aximo as caracter´ısticas particulares do hardware 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 microprocessador, 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 portabilidade 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 recor2 Foi 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.

4

AULA 5. ASSEMBLY – PRIMEIROS PASSOS

rendo ` a linguagem assembly 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 funcionamento 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 desenvolvimento 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 dispon´ı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 funciona 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 endere¸car at´e 64 kBytes de mem´oria de programas externa. Na maioria das aplica¸co˜es 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 PROGRAMAC ¸ AO

5

60 kBytes 64 kBytes

4 kBytes

128 Bytes 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 por software, 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 u ´ltima opera¸ca˜o aritm´etica efectuada; existem instru¸c˜oes espec´ıficas para testar estas condi¸c˜ oes.

5.4.3

Grupos de instru¸co ˜es

As instru¸c˜ oes dispon´ıveis na fam´ılia 51 podem dividir-se em cinco grupos consoante a sua fun¸c˜ ao: 1. 2. 3. 4. 5.

Instru¸c˜ oes Instru¸c˜ oes Instru¸c˜ oes Instru¸c˜ oes Instru¸c˜ oes

de movimenta¸c˜ ao de dados aritm´eticas l´ ogicas (processamento de bytes) de salto e chamada de subrotinas booleanas (processamento de bits)

6

AULA 5. ASSEMBLY – PRIMEIROS PASSOS

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˜ oes aritm´ eticas permitem efectuar as quatro opera¸c˜oes aritm´eticas ´ sempre elementares considerando ou n˜ao a existˆencia de eventuais transportes. E necess´ ario recorrer ao registo acumulador. As instru¸c˜ oes l´ ogicas permitem efectuar opera¸c˜oes l´ogicas elementares – AND, OR, XOR e NOT, sempre bit a bit – sobre operandos de um byte, assim como rota¸c˜ oes de bits para a esquerda ou para a direita. As instru¸c˜ oes de salto e chamada de 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 a flag CY (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˜ao assembly 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´erica Rn refere-se aos registos R0 a R7 mas a designa¸c˜ao Ri refere-se apenas aos registos R0 e R1. A designa¸c˜ ao gen´erica direct refere-se a um endere¸co da mem´oria de dados interna.

5.6 5.6.1

O assemblador Caracter´ısticas gerais

Uma ferramenta essencial quando se programa em linguagem assembly ´e o assemblador. Os primeiros assembladores pouco mais faziam do que a tradu¸c˜ao para c´odigo m´ aquina mas actualmente tˆem muitas outras capacidades permitindo 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 produzidas, • construir e utilizar bibliotecas de fun¸c˜oes, ajudando a programar de forma modular e a reutilizar c´ odigo j´ a escrito em assembly ou noutras linguagens.

8

AULA 5. ASSEMBLY – PRIMEIROS PASSOS

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 da KEIL 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 compilador de C e facilita muito o trabalho de edi¸c˜ao dos programas. Um assemblador 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 comando END; qualquer texto que apare¸ca depois 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 V2 V3

equ 8000h EQU V1+1 EQU V1+2

; Endere¸ co de E/S da v´ alvula 1 ; Endere¸ co de E/S da v´ alvula 2 ; Endere¸ co de E/S da v´ alvula 3

init

equ 10011010b

; Comando de inicializa¸ c~ ao

prompt CR LF

equ ’>’ EQU 0Ah EQU 0Dh

; C´ odigo ASCII do prompt do sistema ; Carriage return (ASCII) ; 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 e EQU ´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 implicitamente ao colocar uma etiqueta antes da instru¸c˜ao que se quer referenciar:

loop:

mov dec mov jnz

cont,#100 cont a,cont loop

; Valor inicial do contador ; Decrementa ; Repete enquanto A n~ ao for zero

Segmentos Ao programar em assembly o programador pode escolher os endere¸cos onde ficar´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 comandos CSEG (para segmentos em mem´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´ avel total ocupar´a os endere¸cos 40h e 41h da mem´oria de dados e a vari´ avel contador ocupar´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.

10

AULA 5. ASSEMBLY – PRIMEIROS PASSOS

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

---0040 ---0000 0003 0005 0007

754064 1540 E540 70FA

LINE 1 2 3 4 5 6 7 8 9 10

SOURCE

cont:

loop:

dseg at 40h ds 1 cseg at 0 mov cont,#100 dec cont mov a,cont jnz loop end

Examinando a 1a coluna da listagem (endere¸cos) facilmente se percebe que a vari´ avel cont (linha 2) ficou colocada no endere¸co 40h e examinando a 2a coluna (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

Au ´nica 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 registo R5 para R3. ( euq raraper ortuo arap otsiger mu ed etnematcerid raipoc lev´ıssopmi ´e) (b) Trocar entre si os conte´ udos dos registos R5 e R3 sem estragar mais nenhum registo. ( hcx o˜ a¸curtsni a razilitu) 2. Apresente programas que, de dois modos diferentes, neguem o conte´ udo da vari´ avel montante guardada em mem´oria de dados interna no endere¸co 50. Em ambos os casos o resultado deve ficar na vari´avel jusante guardada no endere¸co seguinte. Para cada caso considere duas alternativas: ´ necess´ (a) E ario preservar a vari´avel montante. (b) N˜ ao ´e necess´ ario preservar a vari´avel montante.

5.7. PROBLEMAS

11

( moc ROX o˜ a¸carepo amu rezaf uo rolav o es-ratnemelpmoc edop hFF aracs´ am a) 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´avel velocidade guardada em mem´ oria de dados interna num endere¸co `a escolha. ( tib mu ed o˜ a¸cator amu rezaf ,siod rop racilpitlum ,airp´ orp is a ranoicida .adreuqse ` a) 5. Considerando que mem[ ] 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 que mem[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˜ao segundos = 60 × minutos, considerando 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 calcule x = x 2 considerando um valor inicial de x inferior a 256. 9. Escreva um programa que calcule x = – x (complemento para 2) considerando que: (a) x ´e de 8 bits (b) x ´e 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˜ao vari´aveis de 8 bits. Os 4 bits mais significativos de y devem ser colocados a zero. 11. Considere que temptot cont´em a soma das medi¸c˜oes de temperatura efectuadas em 16 pontos diferentes de uma estufa. Apresente 3 modos diferentes 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 em tempmed. ( sedatem sa racort uo stib ortauq atierid ` a rador ,61 rop ridivid).

12

AULA 5. ASSEMBLY – PRIMEIROS PASSOS

5.8

Algumas resolu¸ co ˜es

A t´ıtulo excepcional, por ser a primeira vez que se resolvem problemas deste tipo, apresentam-se algumas solu¸c˜oes completas. LOC

OBJ

0002 CD 0003 CB 0004 CD

00FF ---0032 0033 ---0000 E532 0002 F4 0003 F533 0005 853233 0008 6333FF

---003C ---0100 E53C 0102 253C 0104 F53C 0106 0108 0109 010A

E53C C3 33 F53C

010C 010E 010F 0111

E515 C3 9514 F516

0113 0115 0118 0119

E514 75F003 A4 F515

---0046 0048 ---0200 0202 0205 0206 0208

E548 75F03C A4 F546 85F047

LINE 1 2 3 8 9 10 11 12 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 72 73

SOURCE ;====================================================================== ; Poss´ ıveis resolu¸ c~ oes para alguns dos problemas ;====================================================================== ;-[1.b]----------------------------------------------xch a,r5 ; Estraga acc mas acaba xch a,r3 ; por recuperar o xch a,r5 ; seu valor inicial ;-[2.a]----------------------------------------------mask equ 11111111b ; Negar todos os bits... dseg montante: ds jusante: ds

at 1 1

50

cseg mov cpl mov

at 0 a,montante a jusante,a

; Extrai valor ; Complementa ; Guarda resultado

mov xrl

jusante,montante jusante,#mask

; Copia ; Complementa

;-[4 (parcial)]---------------------------------------dseg at 60 velocidade: ds 1 cseg mov add mov

at 100h a,velocidade a,velocidade velocidade,a

mov clr rlc mov

a,velocidade c a velocidade,a

;-[5.a]----------------------------------------------mov a,21 clr c subb a,20 mov 22,a ;-[5.b]----------------------------------------------mov a,20 mov b,#3 mul ab mov 21,a

;-[6 (parcial)]--------------------------------------dseg at 70 segundos: ds 2 minutos: ds 1 cseg at 200h mov a,minutos mov b,#60 mul ab mov segundos,a mov segundos+1,b ;-[7]-------------------------------------------------

˜ 5.8. ALGUMAS RESOLUC ¸ OES

---0000 0002 ---0000 0002 0004 0006 0008 000A

E500 2500 F500 E500 3500 F500

F F F F F F

000C 000E 0011 0012 0014

E500 8500F0 A4 F500 85F000

F F

0017 0019 001A 001C

E500 F4 2401 F500

F

001E 0020 0021 0023 0025 0027 0028 002A

E500 F4 2401 F500 E500 F4 3400 F500

F

002C 002E 002F 0031

E500 C4 540F F500

F

F F

F

F F

F

F

---0000 0001 ---0000 0002 0005 0006

E500 75F010 84 F500

F

0008 000A 000C 000D 000E 000F 0010

E500 54F0 03 03 03 03 F500

F

0012 0014 0015 0017

E500 C4 540F F500

F

F

F

F

74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 96 97 98 99 100 101 103 104 105 106 107 108 109 110 111 112 114 115 116 117 118 119 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149

vars prog

x: y:

13

segment data segment code rseg 2 2

vars

rseg mov add mov mov addc mov

prog a,x a,y x,a a,x+1 a,y+1 x+1,a

ds ds

;-[8]------------------------------------------------mov a,x mov b,x mul ab mov x,a mov x+1,b ;-[9.a]----------------------------------------------mov a,x cpl a add a,#1 mov x,a ;-[9.b]----------------------------------------------mov a,x cpl a add a,#1 mov x,a mov a,x+1 cpl a addc a,#0 mov x+1,a ;-[10]-----------------------------------------------mov a,x swap a anl a,#00001111b mov y,a ;-[11]-----------------------------------------------valores segment data rotinas segment code

temptot: tempmed:

rseg ds ds

valores 1 1

rseg mov mov div mov

rotinas a,temptot b,#16 ab tempmed,a

mov anl rr rr rr rr mov

a,temptot a,#11110000b a a a a tempmed,a

mov swap anl mov

a,temptot a a,#00001111b tempmed,a

end

14

AULA 5. ASSEMBLY – PRIMEIROS PASSOS

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 Microcontroladores; FEUP Edi¸c˜ oes, 1998, ISBM 972-752-032-4.

15