UNIVERSIDADE DA BEIRA INTERIOR
Sistemas Digitais II
FOLHAS DE APOIO:
ASSEMBLER E SIMULADOR DO µP8085
Coordenação: Prof. Dr. Rui M. Boucho Oliveira
Ano Lectivo 2005/2006
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
1. Introdução
Um assemblador (assembler) é uma ferramenta software – um programa – destinado a simplificar a
tarefa de escrever programas de computador. São evidentes as vantagens de programação numa
linguagem assembly simbólica, em relação à programação numa forma directamente reconhecível
pela máquina, como por exemplo em código binário ou hexadecimal.
Os códigos de operação (opcodes) em linguagem assembly são facilmente relembrados (MOV para
instruções de mover dados, JMP para saltos, etc.). Podem também representar-se simbolicamente
endereços e valores referenciados no campo de operandos das instruções, atribuindo-lhe nomes com
tanto significado como as mnemónicas das instruções. Por exemplo, se o programa tiver um
conjunto de instruções usado como ciclo de temporização (um conjunto de instruções executadas
repetidamente até que um determinado intervalo de tempo tenha decorrido) poderemos designá-lo
por ATRASO.
2. Linguagem Assembly
Para utilizar o assemblador, em primeiro lugar é necessário escrever um programa fonte, constituído
por instruções em linguagem assembly, utilizando mnemónicas dos códigos de operação e etiquetas
(labels), como referimos anteriormente. Além das instruções, no programa fonte devem incluir-se
directivas para o assemblador, por vezes também designadas por pseudo-instruções.
Tal como em qualquer outra linguagem, também na linguagem assembly é necessário respeitar
certas regras de codificação. Cada linha de código, respeitante a uma instrução ou a uma directiva,
deve ser escrita segundo o seguinte formato de quatro campos:
Label:
Nome
Código de operação
Operando(s)
; Comentário
Embora se indiquem formalmente quatro campos para cada linha de código, não é necessário que
estejam sempre todos preenchidos. Em qualquer caso, os campos devem ser separados, pelo menos,
por um espaço em branco. Cada instrução ou directiva deve ser escrita numa única linha, não se
admitindo linhas de continuação. No entanto, podem existir linhas compostas unicamente por
comentários.
As letras do alfabeto, de A a Z, e os dígitos de 0 a 9 são caracteres válidos na escrita de programas
em linguagem assembly. As letras podem ser escritas maiúsculas ou minúsculas, embora o
-1-
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
assemblador as trate todas como maiúsculas, internamente. São ainda admitidos outros caracteres,
como por exemplo sinais ou caracteres de controlo.
O campo Label / Nome é sempre opcional. Uma etiqueta (label) de uma instrução é um nome
simbólico, cujo valor é o endereço da posição de memória onde a instrução é assemblada. Uma
etiqueta de uma instrução ou um nome para uma directiva do assemblador pode conter de um a seis
caracteres alfanuméricos, sendo o primeiro alfabético e obrigatoriamente colocado na coluna 1 da
linha. As etiquetas devem sempre terminar com ‘:’ (dois pontos). Etiquetas e nomes devem ser
únicos, sendo definidos apenas uma vez no programa.
O campo código de operação contem a mnemónica do código de operação para uma instrução do
microprocessador ou da directiva a ser realizada.
O campo operando identifica os dados que devem ser operados pelo código de operação
especificado. Algumas instruções não requerem operandos, enquanto outras requerem um ou dois,
que deverão ser indicados separados por vírgulas. Regra geral, quando se requerem dois operandos
(em operações de transferência de dados, por exemplo), o primeiro dos operandos identifica o
destino (ou alvo) do resultado da operação e o segundo a procedência dos dados. A informação
requerida no campo de operando poderá ser de registos, par de registos, dados imediatos ou
endereços de 16 bits. Quanto à forma como se especifica poderá ser como dados em hexadecimal,
decimal, octal ou binário, como constantes ASCII, como valores atribuídos a etiquetas, como as
próprias etiquetas de instruções ou dados ou mesmo como expressões. Os dados em binário devem
ser seguidos da letra B, em octal seguidos da letra Q, em hexadecimal seguidos da letra H e em
decimal seguidos da letra D. Qualquer número que não esteja especificamente identificado como
binário, octal ou hexadecimal é interpretado como decimal. Deve ter-se em atenção que os números
devem sempre começar com um dígito de 0 a 9, devendo em hexadecimal começar por 0 caso o
dígito seguinte seja A, B, C, D, E ou F. As constantes ASCII são constituídas por caracteres ASCII
delimitados por aspas.
O campo comentário pode conter qualquer informação que se considere útil para documentação do
programa. O único requisito de codificação para este campo é que seja precedido pelo símbolo ‘;’
(ponto e vírgula). Embora os comentários sejam opcionais, devem utilizar-se frequentemente para
facilitar o processo de depuração e manutenção dos programas.
-2-
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
Um exemplo de uma linha de um programa em linguagem assembly do µP8085 pode ser,
OMEGA: MOV B,C ; GUARDAR A CONTAGEM NO REGISTO B
No campo de label está ‘OMEGA:’, indicando que o código da instrução que consta nesta linha se
encontra na posição de memória cujo endereço é o valor de ‘OMEGA’. Note-se que o ‘O’ de
‘OMEGA’ se encontra na coluna 1 da linha. No campo do código de operação está a mnemónica
‘MOV’ indicando que se deve fazer uma transferência de dados. No campo de operando está ‘B,C’,
indicando que a referida transferência se deverá realizar entre os registos B e C, passando o
conteúdo do registo B a ser igual ao do registo C. No campo de comentário, neste caso, encontra-se
uma descrição mais ligada ao algoritmo que se está a implementar, por exemplo considera-se que o
registo C tem uma função de contador, pretendendo-se com esta instrução salvaguardar no registo B
um particular valor de contagem.
3. Pseudo-Instruções ou Directivas do Assemblador.
Muitas vezes quando se programam microprocessadores utiliza-se uma codificação absoluta, isto é,
às posições de memória onde se encontram as instruções do programa e os dados (e no caso do
µP8085, as posições do espaço de entrada/saída) correspondem endereços absolutos. Nem sempre é
necessário definir essas posições com um endereço específico, podendo utilizar-se código
recolocável (relocatable), desde que o assemblador garanta que todas as etiquetas sejam resolvidas
adequadamente (durante a linkagem). O assemblador AVMAC85, que se vai utilizar nas aulas de
laboratório, permite utilizar código absoluto ou código recolocável, ou os dois no mesmo programa.
3.1. Segmentos
A forma mais natural para organizar o programa fonte do assemblador AVMAC85 é a utilização de
segmentos. Um segmento é uma série de mnemónicas de instruções e/ou directivas do assemblador,
precedidas por uma declaração SEG. Um determinado segmento, depois de aberto, pode ser deixado
e voltar-se a ele quantas vezes for necessário, isto é, depois de se definir e entrar num segmento
pode deixar-se esse segmento para se entrar noutro e, então, entrar e sair entre dois ou mais
segmentos. Existe um limite de definição para 1023 segmentos diferentes, embora se possa sair e
reentrar nesses segmentos, sem limite.
Para definir um segmento, utiliza-se a directiva DEFSEG:
DEFSEG novo_segmento
-3-
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
A directiva DEFSEG define o nome de um segmento, que poderá ser qualquer, à excepção das
palavras reservadas do AVMAC85. Podem ainda associar-se atributos a esse segmento, como
veremos mais à frente.
Para se entrar num segmento utiliza-se a directiva SEG. Sempre que se entra explicitamente num
determinado segmento, implicitamente se deixa qualquer segmento onde se estivesse.
Em seguida apresenta-se um exemplo de entrada, saída e reentrada em segmentos.
DEFSEG segmento_um
...
DEFSEG segmento_dois
...
SEG
segmento_um
...
instruções e/ou directivas (e/ou comentários, opções, etc.)
...
SEG
segmento_dois
...
instruções, etc.
...
SEG
segmento_um
...
instruções e/ou directivas (e/ou comentários, opções, etc.)
...
SEG
segmento_dois
...
instruções, etc.
...
Note-se que as directivas DEFSEG podem ser colocadas em qualquer ponto do programa fonte,
desde que, para um determinado nome_de_segmento, preceda a directiva SEG para esse mesmo
nome_de_segmento.
Ao definir um segmento, podemos associar-lhe alguns atributos como, por exemplo, CLASS e
ABSOLUTE, entre outros que não referiremos aqui.
A associação do atributo ABSOLUTE a um determinado segmento define-o como um segmento
absoluto e permite a utilização da directiva ORG. Esta directiva permite estabelecer uma posição
absoluta actual no segmento. Por exemplo, se quisermos que a primeira posição do segmento seja
1000H, podemos escrever
-4-
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
DEFSEG nome_de_segmento
SEG
nome_de_segmento
ORG
1000H
A directiva ORG pode utilizar-se várias vezes no mesmo segmento, estabelecendo uma nova
posição absoluta a partir da linha em que está escrita.
O atributo CLASS permite distribuir os segmentos por três classes: CODE, DATA e IOSPACE. Os
segmentos que contêm código de programa declaram-se como sendo de classe CODE, enquanto que
os segmentos destinados aos dados do programa se declaram como sendo de classe DATA. A classe
IOSPACE destina-se aos segmentos onde se definem os endereços dos portos de entrada/saída, que
como sabemos têm um espaço de endereçamento particular nos sistemas baseados no µP8085. De
notar que nos segmentos da classe IOSPACE, as únicas directivas que tem sentido utilizar são ORG
e DS (que veremos mais adiante). As definições dos segmentos podem, então, ter os seguintes
formatos:
DEFSEG nome_de_segmento, CLASS=CODE, ABSOLUTE
DEFSEG nome_de_segmento, CLASS=DATA, ABSOLUTE
DEFSEG nome_de_segmento, CLASS=IOSPACE, ABSOLUTE
Se na definição de um segmento não for utilizado o atributo CLASS, assume-se que a sua classe é
CODE. Refira-se,ainda, que o AVMAC85 tem segmentos predefinidos, com nomes idênticos aos
das suas classes, bastando escrever SEG CODE, SEG DAT ou SEG IOSPACE para entrar neles.
A directiva END coloca-se no final do programa fonte para que o assemblador saiba quando deve
concluir a sua tarefa. Esta directiva não começa na primeira coluna e não tem parâmetros.
Para definirmos dados explicitamente num programa, o assemblador AVMAC85 disponibiliza as
directivas para definição de nomes simbólicos ou para reservar espaço de armazenamento.
Pode definir-se um novo nome simbólico e atribuir-lhe um valor específico com a directiva EQU
(do inglês, equates), usando a seguinte sintaxe, onde o nome começa na primeira coluna:
TREZE
EQU
13H
Após esta linha, o nome TREZE será sempre associado ao valor 13H. Note-se que um nome
simbólico deste tipo é distinto de uma etiqueta (label) que, efectivamente, representa um endereço.
-5-
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
A directiva TEQ (do inglês, temporary equate) é semelhante à EQU. A diferença reside no facto de
o valor atribuído ao nome simbólico com a directiva TEQ se poder redefinir ao longo do programa,
enquanto que os valores atribuídos com a directiva EQU não se podem alterar.
Pode-se definir um nome simbólico e reservar espaço de armazenamento para ele com as directivas
DB, DW ou DS. AS directivas DB e DW requerem valores para inicialização, enquanto que com a
directiva DS não há inicialização.
A directiva DB (do inglês, define byte) reserva um byte com um valor que se lhe atribui. A linha:
MANDO
DB 0FFH
define o nome simbólico MANDO, que corresponde ao endereço de uma posição de memória, cujo
conteúdo passa a ser 0FFH.
Com uma única directiva DB pode definir-se mais do que um byte:
NUMEROS
DB 12H, 5AH, 0B9H, 76H
Os valores a atribuir, separados por vírgulas, vão ser os conteúdos de posições de memória
consecutivas, correspondendo o endereço NUMEROS à primeira posição.
Outra utilização da directiva DB é a definição de cadeias (strings) de caracteres ASCII:
STRING
DB
“SISTEMAS DIGITAIS”
Esta linha faz com que, a partir da posição de memória cujo endereço é STRING, estejam
armazenados os valores dos códigos ASCII correspondentes aos 17 caracteres indicados. A cadeia
de caracteres deve estar delimitada por aspas simples ou duplas.
A directiva DW (do inglês, define word) é semelhante a DB, à excepção de que reserva espaço em
blocos de 16 bits (uma palavra corresponde a dois bytes):
EXEMPLO
DW
1000H, 0FFFFH, 3D7AH
A directiva DS (do inglês, define space) é útil quando se precisa de definir espaço não inicializado
(por exemplo, para uma matriz). A directiva DS faz com que seja reservado na memória o espaço
indicado como parâmetro, em bytes:
MATRIZ
DS
10H
Esta linha faz com sejam reservados 16 posições consecutivas na memória (10H equivale a 16 em
decimal), correspondendo o endereço MATRIZ à primeira dessas posições.
-6-
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
4. Vantagens do assemblador.
O assemblador é uma ferramenta para desenvolvimento de programas com o auxílio do
computador. Os assembladores são absolutamente essenciais para a escrita de software industrial;
a assemblagem manual é demasiado difícil para programas com mais de 50 instruções. Podemos
resumir as características mais importantes do assemblador como se segue:
•
O assemblador traduz as mnemónicas em código binário com velocidade e precisão,
eliminando, assim, os erros humanos na procura dos códigos.
•
O assemblador atribui os valores apropriados aos nomes simbólicos utilizados num
programa. Isto facilita a especificação dos endereços de salto.
•
É fácil inserir ou apagar instruções num programa; o assemblador pode re-assemblar
rapidamente todo o programa com novas posições de memória e endereços modificados para
as instruções de saltos. Isto evita ter que reescrever o programa, manualmente.
•
O assemblador verifica erros de sintaxe, tais como etiquetas ou expressões erradas, e
disponibiliza mensagens de erro. Contudo, não pode verificar erros de lógica num programa.
•
O assemblador pode reservar posições de memória para dados ou resultados.
•
O assemblador pode fornecer ficheiros para documentação.
Programas simuladores e depuradores (debuggers) podem ser utilizados em conjunto com o
assembler para testar e depurar um programa escrito em linguagem assembly.
5. Introdução ao simulador AVSIM85
Quando o programa AVSIM85 corre, simula, em memória, todo o hardware do µP8085, incluindo
registos, portos, memória e hardware periférico. Pode executar-se código assemblado para o
µP8085 e observar o estado do CPU à medida que o código se executa. O simulador AVSIM85
disponibiliza um “CPU visual” completo no qual se pode observar o código executar, uma instrução
de cada vez. Pode observar-se o efeito de cada instrução nos registos, portos e posições de memória
do CPU.
O simulador AVSIM85 também disponibiliza um depurador (debugger) simbólico completo.
Podem introduzir-se breakpoints ou passpoints, executar código passo a passo, desfazer uma
operação e examinar e alterar registos, memória e flags. O AVSIM85 permite, ainda, fazer
introdução de código (patch code) interactivamente, sem ter que sair do simulador ou reassemblar o
programa.
-7-
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
O simulador AVSIM85 trata o écran como um editor de texto, permitindo movimentos para
qualquer parte do CPU simulado e modificar os seus conteúdos. Pode, então, executar-se o código
para verificar os resultados da modificação, voltar atrás (com a função <UNDO>, tecla F9) e tentar
outra alteração.
O simulador AVSIM85 pode trabalhar num de dois modos:
Modo de display: Neste modo o simulador funciona como um editor de écran. Pode deslocar-se o
cursor para qualquer parte do CPU que esteja em negrito, como, por exemplo, os registos
ou os portos e modificar os conteúdos dessas áreas.
Modo de comando: Neste modo pode aceder-se a um conjunto de menus de comandos, disponíveis
na parte inferior do écran. Com estes comandos podem-se carregar ficheiros, examinar
memória, modificar o fragmento de programa (patch), etc..
Para passar de um modo a outro deve pressionar-se a tecla de Escape.
Fig. 1 - Regiões do écran do simulador AVSIM85
-8-
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
O écran do AVSIM85 (Fig. 1) encontra-se dividido em distintas regiões, cada uma delas para
visualizar partes do µP8085 ou informações de estado do simulador.
O AVSIM85 utiliza dez teclas de função (Fig. 2) para um controlo básico do simulador, fornecendo
as funções básicas de um depurador de uma forma simples e fácil de utilizar.
Fig. 2
-9-
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
Fig. 3
Fig. 4
- 10 -
SISTEMAS DIGITAIS II
UNIVERSIDADE DA BEIRA INTERIOR
FOLHAS DE APOIO: ASSEMBLER E SIMULADOR DO µP8085
No modo de display, o cursor pode mover-se para qualquer janela no écran. Podem alterar-se quase
todos os valores realçados no écran teclando novos valores por cima. Por exemplo, para alterar o
conteúdo do Acumulador, deve mover-se o cursor para o Acumulador e escrever-se um novo valor
sobre o anterior. As excepções são as janelas de estado do simulador, que se alteram com as teclas
de função, e o fragmento do programa que só se pode alterar com o comando Patch. Na Fig. 3
podem ver-se as acções das teclas de cursor no controlo básico do simulador.
A utilização destas teclas para mover o cursor de uma janela para outra pode tornar-se bastante
incómoda, especialmente se as janelas se encontrarem muito separadas no écran. O AVSIM85
disponibiliza “teclas expresso” (Fig. 4), que permitem mover rapidamente o cursor entre janelas.
No modo de comando, o cursor permanece nas duas linhas do fundo do écran. Da primeira vez que
se entra neste modo, essas linhas apresentam a seguinte informação:
>
Dump Expression
commandFile Help IO
Load -space-
ESC to screen
A primeira destas linhas, com o símbolo “>”, é uma area de mensagens. Toda a informação do
simulador é visualizada nesta linha, assim como qualquer solicitação de informação, como um
nome de ficheiro, um endereço ou uma instrução. Também aqui aparecem as mensagens de erro do
AVSIM85. Todo o texto introduzido, enquanto se está em modo de comando, aparecerá nesta linha.
A segunda linha, a última do écran, contem o menu de comandos actual. Cada palavra é um
comando. Cada comando está abreviado e a sua abreviatura está em letra maiúscula (por exemplo, o
“D” de Dump). Quando um menu é demasiado grande para caber no écran, deve pressionar-se a
tecla de espaços (space) para se verem os restantes comandos.
Pode seleccionar-se um comando por nome escrevendo a letra correspondente à abreviatura do
comando, respondendo o simulador de imediato, sem ser necessário pressionar a tecla Return. Em
alternativa, pode seleccionar-se um comando actuando nas teclas de cursor, apontando para um
determinado comando que aparece realçado. Para que esse comando seja executado deve, então,
pressionar-se a tecla Return. Para abortar a acção de um comando, deve pressionar-se Crtl-C.
As duas linhas correspondentes ao menu de comandos principal aparecem na seguinte forma:
Dump Expression commandFile Help IO Load -spaceESC to screen
Memory Patch Quit Reset Set setUp View eXecute -space- ESC to screen
- 11 -