Você está na página 1de 11

Faculdade de Engenharia

Microprocessadores Apoio ` as Aulas Pr aticas

4a Edi c ao, Setembro 2005 Departamento de Engenharia Electrot ecnica e de Computadores

Primeiros Passos na Programa c ao em Linguagem Assembly


Jo ao Paulo Sousa jpsousa@fe.up.pt Setembro 2005

Conte udo
1 Objectivos 2 Introdu c ao 3 Programa c ao em 3.1 Vantagens . . 3.2 Desvantagens 3.3 Conclus ao . . linguagem . . . . . . . . . . . . . . . . . . . . . assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 3 3 3 3 4 4 4 5 5 6 6 7 7 7 8 8

4 Modelo de programa c ao 4.1 Registos principais da fam lia i51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Grupos de instru c oes da fam lia i51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Algumas regras de sintaxe e modos de endere camento da fam lia i51 . . . . . . . . . . . . 5 O assemblador 5.1 Carater sticas gerais . . . . . . . . . . 5.2 Nomes simb olicos e operadores simples 5.3 Segmentos . . . . . . . . . . . . . . . . 5.3.1 Segmentos absolutos de c odigo 5.3.2 Segmentos absolutos de dados . 5.4 Formato das listagens . . . . . . . . . 6 Problemas

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

Objectivos

Familiariza c ao com o modelo de programa c ao simplicado da fam lia 51 da Intel, com a sintaxe da sua linguagem assembly e com alguns comandos do assemblador.

Introdu c ao

oprio nome indica, a armazenar Trabalhar segundo o paradigma do programa residente 1 obriga, como o pr em mem oria um programa (conjunto de ordens) num formato que o microprocessador entenda. No seu n vel mais baixo, essas ordens n ao s ao mais do que c odigos bin arios armazenados em mem oria que o microprocessador vai extraindo, interpretando e executando. Um programa nessa forma diz-se estar em c odigo m aquina. Por diversas raz oes programar directamente em c odigo m aquina n ao e vi avel mesmo para programas pequenos. De facto, constata-se facilmente que um programa em c odigo m aquina: e muito dif cil de perceber e depurar, n ao descreve a tarefa a executar de um modo intelig vel, e muito extenso e demora muito tempo a escrever, e muito sens vel a distrac c oes do programador que normalmente conduzem a erros muito dif ceis de detectar. Os dois u ltimos problemas podem ser atenuados escrevendo os c odigos em hexadecimal em vez de bin ario; mas uma melhoria substancial e atribuir um nome (mnem onica) a cada c odigo de instru c ao de modo a tornar o programa minimamente intelig vel chama-se a isso programar em linguagem assembly. Na gura 1 um mesmo programa aparece escrito em linguagem assembly da fam lia 51 e tamb em em c odigo m aquina (bin ario e hexadecimal). Linguagem assembly MOV A,#64 ADD A,#10 Bin 01110100 01000000 00100100 00001010 Hex 74 40 24 0A

Figura 1: Programa em assembly e c odigo m aquina

Por simples inspec c ao facilmente se conclui que e muito mais f acil programar em linguagem assembly do que directamente no c odigo m aquina de um microprocessador. De acordo com o convencionado pelo fabricante, os c odigos 74h e 24h representam, respectivamente, as instru c oes MOV A,#n (copiar para o registo A o valor n) e ADD A,#n (adicionar ao registo A o valor n, cando o resultado em A), onde n representa um valor constante e A o registo acumulador. Por outro lado, os c odigos 40h e 0Ah representam os operandos das instru c oes; pode assim concluir-se que o programa adiciona ao valor 64 o valor 10 cando o resultado da adi c ao no registo acumulador. Note-se a necessidade de converter os n umeros 64 (40h) e 10 (0Ah) para bin ario (ou hexadecimal) quando se programa directamente em c odigo m aquina.
1

cfr. Aulas te oricas da primeira semana

Programa c ao em linguagem assembly

A linguagem assembly e, pois, o n vel mais baixo em que se pode programar com alguma comodidade. A tradu c ao da linguagem assembly de cada microprocessador para o c odigo m aquina correspondente pode ser feita ` a m ao, mediante uma tabela de convers ao, mas normalmente e feita recorrendo a um assemblador, ferramenta que na maior parte dos casos e oferecida pelo fabricante do microprocessador. Nas sec c oes seguintes apresentam-se as vantagens e desvantagens de programar em linguagem assembly ; um bom assemblador atenua algumas das desvantagens da linguagem mas h a outras que lhe s ao intr nsecas.

3.1

Vantagens

A principal vantagem de programar em linguagem assembly e poder optimizar o c odigo de modo a aproveitar ao m aximo as caracter sticas particulares do hardware onde vai ser executado, conseguindo assim melhores resultados quer em tempo de execu c ao quer em tamanho de c odigo gerado. Outra vantagem e a exist encia de assembladores para todos os microprocessadores, muitas vezes oferecidos pelos fabricantes, pelo que e 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 determinado microprocessador.

3.2

Desvantagens

A principal desvantagem de uma linguagem de baixo n vel e a grande despropor c ao que existe entre a complexidade do seu conjunto de instru c oes e as tarefas que o microprocessador normalmente e chamado a executar. Esta despropor c ao obriga o programador a decompor cada tarefa num conjunto de opera c oes elementares que, al em de ser um processo demorado e sujeito a erros, n ao ajuda a manter o c odigo estruturado. Outra desvantagem e a necessidade de conhecer em detalhe o modelo de programa c ao do microprocessador, nomeadamente no que se refere aos registos de trabalho dispon veis, registos privilegiados ou especiais e registo de estado. Como consequ encia desta depend encia relativamente aos detalhes internos de um microprocessador, a portabilidade dos programas e muito reduzida.

3.3

Conclus ao

A tend encia actual e a favor de uma programa c ao mista, usando principalmente linguagens de mais alto n vel (C em particular) e recorrendo ` a linguagem assembly apenas em rotinas onde a eci encia do c odigo seja o objectivo principal a atingir. 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 de C para a maioria dos microprocessadores, alguns at e de dom nio p ublico, os avan cos na microelectr onica permitem que a rapidez de execu c ao se consiga facilmente por aumento da frequ encia de funcionamento 3

Quando se est a a estudar o funcionamento interno de um microprocessador o assembly e, no entanto, a linguagem mais adequada pelo que ser a a utilizada nesta disciplina.

Modelo de programa c ao

O modelo de programa c ao de um microprocessador descreve os recursos dispon veis para o programador: 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 os principais registos e instru c oes de um microprocessador. As sec c oes seguintes apresentam o modelo de programa c ao da fam lia 51 da Intel.

4.1

Registos principais da fam lia i51

A arquitectura base da fam lia 51 da Intel disponibiliza um n umero apreci avel de registos dos quais se destacam, numa primeira abordagem, os seguintes: Registos de trabalho R0 a R7 Registos privilegiados A (acumulador) e B 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 de estado (PSW) d a, entre outras, indica c oes sobre a paridade do valor contido no acumulador, se houve ou n ao transporte e/ou overow na u ltima opera c ao aritm etica efectuada, etc.

4.2

Grupos de instru c oes da fam lia i51

As instru c oes dispon veis na fam lia i51 podem dividir-se em cinco grupos consoante 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 4. Instru c oes de salto e chamada de subrotinas 5. Instru c oes booleanas As instru c oes de movimenta c ao de dados permitem copiar valores: de um registo para mem oria, da mem oria para um registo, etc. As instru c oes aritm eticas permitem efectuar as quatro opera c oes aritm eticas elementares considerando sempre necess ou n ao a exist encia de eventuais transportes. E ario recorrer ao registo acumulador e, por vezes, tamb em ao registo B. As instru c oes l ogicas permitem efectuar opera c oes l ogicas elementares assim como rota c oes de bits para a esquerda ou para a direita. Funcionam tamb em exclusivamente com o acumulador. 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. 4

As instru c oes booleanas permitem manipular bits individualmente. A maior parte delas obriga a utilizar um dos bits do registo de estado a ag CY (carry ) que funciona para o processamento booleano como o acumulador para o processamento aritm etico e l ogico. O resumo de instru c oes ocial de um dos actuais fabricantes desta fam lia [1, p aginas 13..16] ou o resumo [2] d ao uma panor amica geral das instru c oes dispon veis pelo que, um ou outro, deve ser estudado em pormenor.

4.3

Algumas regras de sintaxe e modos de endere camento da fam lia i51

A forma geral de uma instru c ao assembly da fam lia 51 e mnem onica [operando1[,operando2[,operando3]]] ou seja, h a instru c oes com 3, 2, 1 ou nenhum operando. De acordo com o estabelecido pelo fabricante original um operando pode ser: um n umero, representando um endere co de mem oria (endere camento directo), o nome de um registo (endere camento registo), um valor constante, se precedido do car acter # (endere camento imediato), um apontador, se precedido do car acter @ (endere camento indirecto). Estas regras de sintaxe entendem-se melhor com a apresenta c ao de alguns exemplos simples:
MOV R5,40h MOV R5,#40h ADD A,R5 ORL A,#10010001b LJMP 4358h ; Copia para o registo R5 o conte udo da posi c~ ao de mem oria 64. ; Coloca no registo R5 o valor 64. ; ; ; ; Adiciona ao acumulador o registo R5. Resultado no acumulador. Faz o OR l ogico do acumulador com o valor 91h. O resultado fica no acumulador. Continua a execu c~ ao do programa no endere co 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 apontada por R0.

Note-se que dos registos de trabalho R0 a R7, apenas R0 e R1 podem assumir o papel de apontadores. Quando o manual de programa c ao [1] emprega a designa c ao gen erica Rn est a a referir-se aos registos R0 a R7 mas quando usa a designa c ao Ri est a a referir-se apenas aos registos R0 e R1.

O assemblador

Uma ferramenta essencial para programar em linguagem assembly e o assemblador. Os primeiros assembladores pouco mais faziam do que a tradu c ao para c odigo m aquina mas os mais recentes t em muitas outras capacidades, nomeadamente: permitem atribuir nomes simb olicos a endere cos de mem oria, dispositivos de entrada sa da, vari aveis e grupos de instru c oes, permitem trabalhar em diversas bases de numera c ao bem como converter caracteres nos seus c odigos ASCII, 5

permitem efectuar c alculos aritm eticos simples com valores constantes ou nomes simb olicos, permitem denir os endere cos de mem oria onde o programa e os dados ir ao ser armazenados, permitem reservar areas de mem oria para armazenamento tempor ario de informa c ao, permitem a constru c ao e utiliza c ao de bibliotecas de fun c oes, ajudando assim a programar de modo modular e a reutilizar c odigo j a escrito em assembly ou noutras linguagens, permitem a congura c ao dos par ametros que alteram a gera c ao de c odigo m aquina e o formato das listagens produzidas. Existem actualmente diversos assembladores comerciais e de dom nio p ublico para a fam lia 51 da Intel. Um dos melhores e o da KEIL, dispon vel em vers ao de demonstra c ao (mas 90% funcional) nas salas de computadores e no CD que acompanha o livro recomendado como bibliograa principal. Nas sec c oes seguintes apresenta-se um resumo das suas capacidades.

5.1

Carater sticas 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 m da linha. O m do c odigo fonte e indicado pelo comando END; qualquer texto que apare ca depois desse comando e ignorado pelo assemblador.

5.2

Nomes simb olicos e operadores simples

Uma das grandes vantagens de utilizar um assemblador e poder denir nomes simb olicos para vari aveis, constantes e endere cos de programa. Para as as vari aveis essa deni c ao faz-se com o comando DS (dene storage ) e para as constantes com o comando EQU (equate ) cuja sintaxe se depreende do exemplo apresentado abaixo, retirado de um programa de controlo de uma m aquina de encher e empacotar garrafas:
; === Defini c~ ao Garrafas EQU tempo EQU V1 EQU V2 EQU V3 EQU de constantes 12 ; 250 ; 8000h ; V1+1 ; V1+2 ; ========================================== N umero de garrafas por caixa Tempo de engarrafamento (ms) 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

; === Declara c~ ao de vari aveis ========================================== Contador: DS 1 ; Reserva um byte em mem oria Total: DS 2 ; Reserva dois bytes em mem oria

No comando DS note-se a necessidade de : imediatamente a seguir ao nome. A deni 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:
. . mov a,#100 dec a . .

init:

5.3

Segmentos

Ao programar em assembly e poss vel escolher os endere cos onde car ao as vari aveis e as diferentes partes de um programa. Essa escolha e feita pela deni c ao de segmentos de mem oria. Existem duas classes de segmentos de mem oria absolutos e relativos (ou recoloc aveis), interessando, numa primeira abordagem, referir apenas os segmentos absolutos. Um segmento absoluto e uma zona de mem oria com endere co inicial conhecido.

5.3.1

Segmentos absolutos de c odigo

Um segmento absoluto de c odigo e uma zona de mem oria com endere co inicial conhecido onde est ao instru c oes do programa e/ou operandos com valor constante. Este tipo de segmento e denido recorrendo ao comando CSEG cuja sintaxe se depreende sem diculdade do exemplo apresentado abaixo:
; === Programa principal =============================================== CSEG AT 0000h ; Segmento com in cio no endere co 0000h mov a,#255 ; Move o valor 255 para o acumulador mov r0,a ; r0=255 mov r1,a ; r1=255 . . ; --- Rotinas de E/S --------------------------------------------------CSEG AT 0080h ; Segmento com in cio no endere co 0080h orl a,#7fh cpl a . . end ; Fim do c odigo fonte

Neste exemplo, o programa est a distribu do por dois segmentos de c odigo: um, com in cio no endere co 0000h, para o programa principal e outro, com in cio no endere co 0080h, onde reside um conjunto de rotinas auxiliares.

5.3.2

Segmentos absolutos de dados

Um segmento absoluto de dados e uma zona de mem oria com endere co inicial conhecido onde est ao alojadas vari aveis. Este tipo de segmento e denido recorrendo, entre outros, ao comando DSEG cuja sintaxe se depreende do exemplo apresentado abaixo:
; === Declara c~ ao de vari aveis ========================================== DSEG AT 40h ; Segmento com in cio no endere co 40h cont: DS 1 ; Vari avel cont ocupa 1 byte ; === Programa ========================================================= CSEG AT 0000h mov cont,#100 ; cont=100 . . end ; Fim do c odigo fonte

Em programas complexos a utiliza c ao de segmentos absolutos e uma tarefa ingrata pois e necess ario garantir que n ao haja sobreposi c ao entre eles. Para evitar problemas e facilitar a reutiliza c ao de c odigo e recomend avel trabalhar, sempre que poss vel, com segmentos relativos ou recoloc aveis. A deni c ao de segmentos relativos ser a, no entanto, abordada mais tarde. 7

5.4

Formato das listagens

O assemblador da KEIL permite denir 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 (e operandos) de cada instru c ao. Um exemplo e mais elucidativo do que muitas explica c oes:
LOC ---0040 ---0000 0003 0005 0007 OBJ LINE 1 2 3 4 5 6 7 8 9 10 SOURCE dseg at 40h ds 1 cseg at 0 mov cont,#100 dec cont mov a,cont jnz loop end

cont:

; cont ocupa 1 byte

754064 1540 E540 70FA

loop:

; ; ; ;

cont=100 cont=cont-1 a=cont Salta, isto e, repete tudo, se A<>0

Examinando a 1a coluna da listagem (endere cos) facilmente se percebe que a vari avel cont cou colocada no endere co 40h e que o programa come ca efectivamente no endere co 0000h. Examinando 2a coluna (c odigos gerados) pode concluir-se, por exemplo, que a primeira instru c ao foi codicada em tr es bytes (75h, 40h, 64h) o primeiro e o c odigo da instru c ao propriamente dita, o segundo, o endere co do primeiro operando da instru c ao (vari avel cont) e o terceiro, o valor do segundo operando da instru c ao, neste caso o valor 100.

Problemas

Apresenta-se de seguida um conjunto de problemas simples que podem ser resolvidos recorrendo a instru c oes aritm eticas, l ogicas e de movimenta c ao de dados. Recorra aos documentos de apoio necess arios aginas 13..16], [2] para conhecer as instru c oes dispon veis para os resolver. [1, p 1. Escreva programas para efectuar as seguintes opera c oes: (a) Copiar R5 para A (b) Copiar R5 para R3 (c) Trocar R5 com R3 sem estragar mais nenhum registo 2. Escreva um programa que coloque a zero os registos R0 e R1 e de seguida calcule o quadrado do valor que est a contido no acumulador. O resultado dever a car em R1 (parte mais signicativa) e R0 (parte menos signicativa). 3. Considere as vari aveis montante, jusante1 e jusante2 declaradas no segmento de dados apresentado:
; === Vari aveis ======================================================== DSEG AT 50h ; Segmento de dados montante: DS 1 ; Vari avel montante ocupa 1 byte jusante1: DS 1 ; Vari avel jusante1 ocupa 1 byte jusante2: DS 1 ; Vari avel jusante2 ocupa 1 byte

Apresente, num segmento de c odigo absoluto com in cio no endere co 0000h, dois modos diferentes (CPL, XRL) de negar o conte udo da vari avel montante, cando os resultados nas vari aveis jusante1 e jusante2. 8

4. Traduza ` a m ao, para c odigo m aquina, a sua solu c ao para o problema anterior. Nota: ser a necess ario ao. utilizar o manual de programa c ao [1] para responder a esta quest 5. Apresente dois modos diferentes (MUL, RLA) de multiplicar por 4 o valor da vari avel velocidade guardada na posi c ao de mem oria com o endere co 60h. 6. Considerando que mem[x] representa a posi c ao de mem oria com endere co x, escreva programas para efectuar as seguintes opera co es: (a) mem[62] = mem[61] mem[60] (b) mem[61] = 3 mem[60], com mem[60]<86. Porqu e? 7. Considere duas vari aveis minutos e segundos guardadas em posi c oes de mem oria com enderecos consecutivos. Declare as vari aveis num segmento de dados e escreva um programa para efectuar a opera c ao segundos = 60 minutos, podendo minutos variar entre 0 e 200. 8. Declare a variavel x num segmento de dados absoluto com in cio no endere co 50h e escreva um programa que calcule x = x (complemento para 2) considerando que: (a) x e de 8 bits (b) x e de 16 bits 9. Escreva um programa que calcule x = x + y para vari aveis de 16 bits. Declare as vari aveis num segmento de dados absoluto com in cio no endere co 40h. 10. Declare xx e yy num segmento de dados absoluto com in cio no endere co 48. Escreva um programa que copie os 4 bits mais signicativos de xx para os 4 bits menos signicativos de yy, considerando que s ao vari aveis de 8 bits. Os 4 bits mais signicativos de yy 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 (DIV, RRA, SWAP) 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. Declare todas as vari aveis num segmento de dados absoluto com in cio no endere co 35h.

Refer encias
[1] Philips semiconductors; 80C51 family programmers guide and instruction set ; Setembro de 1997. [2] Ferreira, Jos e Manuel; Resumo das instru c oes do 80C51 ; FEUP, Setembro de 2000.

Você também pode gostar