; 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).