Você está na página 1de 43

Estrutura do programa e programao

Assembly com 8051


O que entende por linguagem assembly?
i. Apresenta um nvel de abstrao intermdia entre os dois
extremos: linguagem mquina e linguagem alto-nvel

ii. Facilita a programao pela substituio do cdigo binrio


da linguagem mquina com smbolos
Escrita usando labels(etiquetas), mnemnicas, e.t.c.

Um programa em assembly no executvel


Todos os smbolos tais como mnemnicas, etiquetas
devem ser traduzidos para cdigo binrio

Microprocessadores www.corradi.junior.nom.br - COTUCA


Estrutura do programa e programao
Assembly com 8051
Como que se processa a traduo de um
programa assembly para programa mquina ?
Dependendo da complexidade do ambiente de
programao pode envolver vrias etapas at a produo
do cdigo executvel
i. Assembler
a. Traduz um programa em assembly para programa em linguagem
mquina (cdigo objeto)
b. O cdigo objecto pode estar na forma absoluta ou forma relocatable

ii. Linker
a. Combina vrios programas objectos na forma relocatable, produzindo um
programa executvel atravs da atribuio de endereos absolutos
b. Produz tambm um ficheiro contendo o mapa de memria e tabela de
smbolos
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
O que acontece ao invocar o assembler a
partir da linha de comando ?
Sintaxe: ASM51 ficheiro fonte [controles do assembler]
Exemplo: ASM51 echo.src
LC = Location Counter
Passo 1 (Tabela de smbolos)
1. (LC) =0 / ORG Usado pelo assembler como
endereo da instruo ou valor
2. (LC) += length(inst) ou
da label
(LC) += length(DB/DW/DS)
ASM51

3. SymT[...] = ( label,(LC) ) ou
SymT[...] = ( symbol,(EQU) ) Echo.lst
Programa.src Programa.lst
(echo.src)
Passo 2
1. Mnemnica opcode Echo.obj

2. Determinao dos operandos Programa.obj


Todos os smbolos so
substitudos pelo valor
na tabela de smbolos

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Contador de localizao (Location Counter)
O assembler possui um contador de localizao para cada um dos
cincos segmentos
1. CODE (0000h - FFFFH) (0000h)
2. DATA (00H FFH)/(00H 7FH) (30h)
3. IDATA (00H FFH)/(00H 7FH) (80h)
4. BIT (00H FFH)/(20H 2FH) (00h)
5. XDATA (0000H FFFFH) (0000h)

Cada contador de localizao inicializado com o valor zero e


pode posteriormente ser alterado usando as diretivas para o
assembler

O smbolo $ pode ser usado para especificar o valor do contador


de localizao do segmento ativo:
TABLE: DB 1,2,3,4,5,6,7,8,9
LEN EQU $-TABLE

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Ficheiro .lst e tabela de smbolos
Controles do assembler
Informa ao ASM51 que as subrotinas foram definidas
noutro mdulo

A resolver pelo
linker ( assembler
desconhece 0
endereo do
segmento
relocatable)

Identifica o fim de um Pertencem a outros mdulos, e


programa assembler por isso s o linker pode
determinar o endereo absoluto
Opcode das instrues

Porqu opcode = 80H (SJMP) e no 02H (LJMP) ou (AJMP)?


Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Saltos e chamadas genricas
ASM51 permite o uso de mnemnicas genricas JMP ou CALL em
vez de SJMP, AJMP, LJMP ou ACALL, LCALL

A converso da mnemnica genrica para instruo real segue a


seguinte regra:

1. JMP substitudo por SJMP se no for usada forward reference e o


destino do salto estiver na gama de 128 localizaes

forward reference:uso de um smbolo antes da respectiva definio

2. JMP/CALL substitudo por AJMP/ACALL se no for usada forward


reference e a instruo que segue JMP/CALL pertencer mesma
pgina de 2K que a instruo destino

3. Caso contrrio, ser usado a converso para LJMP/LCALL


r) Resposta pergunta do slide anterior: sendo o salto para trs com deslocamento (offset)
inferior a 128 bytes, aplica-se a condio 1
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Ficheiro .lst e tabela de smbolos

Torna as subrotinas
visveis a outros mdulos

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Ficheiro .lst e tabela de smbolos (cont.)

Reserva espao para 40 caracteres

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Qual a principal diferena entre um ficheiro
objeto absoluto e um relocatable?

1. O ficheiro objeto absoluto contm apenas bytes


binrios (00H FFh) de um programa em
linguagem mquina

2. Um ficheiro relocatable contm ainda uma


tabela de smbolos e outras informaes
necessrias para que o linker possa produzir o
programa executvel

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Qual a sintaxe de invocao do linker?
RL51 lista_de_relocatable [ficheiro_destino] [controlos_de_localizao]

Exemplo:
Pg. 164: errado RL51 ECHO.obj, IO.obj TO EXAMPLE &
CODE(EPROM(8000H)) DATA(ONCHIP(30) )
1. Ficheiros relocatable: echo.obj, io.obj
2. Programa executvel: example
3. Os mdulos apresentam dois segmentos relocatable EPROM para cdigo localizado
em 8000H e ONCHIP para dados localizado a partir de 30H

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Exemplo de ficheiro .Map criado pelo Linker
Diga como apareceria
no ficheiro executvel a
codificao da instruo
CALL INIT, invocada
no mdulo MAIN?

1. Do ficheiro echo.lst, linha 14 obtm-


se o opcode da instruo como sendo
12H
2. Da tabela de smbolos do ficheiro
Esta tabela de
smbolos aparece no
example.M51 obtm-se o endereo
ficheiro .M51 porque absoluto de INIT como sendo 8024H
os ficheiros .src
3. Sendo CALL de 3 bytes (porqu?) a
comeam com a
diretiva $DEBUG respectiva codificao seria 12 8024h

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Qual o formato da linguagem assembly?
1. Um programa assembly contm os seguintes elementos:
1. Instrues mquina
2. Diretivas para o assembler
3. Controles do assembler
4. Comentrios

2. O formato genrico para cada linha o seguinte:


1. [ smbolo ] mnemnica [operando] [,operando] [...] [;comentrio]
2. A mnemnica pode ser uma instruo ou uma diretiva para o assembler
3. O operando contm o endereo ou dado usado pela instruo
4. O primeiro caractere de um smbolo deve ser sempre uma letra, ?, ou _ que ser
seguida por letras, dgitos, ?, _. Pode conter no mximo 31/256? caracteres
5. Uma etiqueta (label) um smbolo que termina obrigatoriamente com o caractere :.

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Exemplo de smbolos

PAR EQU 500 Smbolo legal


START: MOV A, #0FFH Etiqueta legal
Mensagem: DB Help Etiqueta legal
VAR: DS 10 Etiqueta legal
BitVar: DBIT 16 Etiqueta legal
Start: JMP THERE etiqueta ilegal /duplicado
DATA EQU 100 ilegal/directiva assembly
LOW CODE 80H ilegal / operador do assembly
ALPHA# DW 00FFh contm caractere ilegal
?_?_? DBIT 12 legal
1st_var DS 3 1 caractere ilegal
MOD DW 19 ilegal / operador do assembler
TITLE SEGMENT ilegal / controlo do assembler
MOV IDATA ilegal /instruo assembly

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Caractersticas dos dados imediatos
Todos os dados imediatos com excepo do MOV DPTR, #dado,
requerem constantes de 8-bit

No entanto, os dados imediatos so tratados como


constantes de 16-bit e posteriormente usado apenas o LSB
Neste caso todos os bits do MSB devem ser iguais

CONSTANTE EQU 100

MOV A, #0FEH legal


ORL 40H, #CONSTANTE legal
MOV A, #0FF00H legal
MOV A, #00D8H legal
MOV A, 0FE00H ilegal
MOV A, #01FFH ilegal

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Como especificar o endereo de um bit numa
instruo?

ON EQU 7
Explicitamente pelo endereo SETB 0E7H
JNB 99H, $

SETB ACC.7
Usando o operador .
SETB 224.ON
SETB 0E0H.7
Usando um smbolo pr-definido JNB TI, $
CLR C

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Bases nmericas

Decimal MOV A, #15


MOV A, #15D
Binrio MOV #1111B
Octal MOV A, #17Q
MOV A, #17O
Hexadecimal MOV A, #0FH
Para diferenciar um
MOV A, #0A5H dado hexadecimal

A, #A5H?
imediato de um smbolo
MOV

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Cadeias de caractere

MOV A, #m carrega A com 06Dh, valor do ASCII m

ASPAS EQU Define ASPAS como sendo 22h

DB 8051 Armazenar na memria de cdigo 8, 0, 5,1

AGUARDE: CJNE A, #Q, AGUARDE Fica a espera que (A) seja do caractere Q

SUBB A, #0 Converte dgito ASCII para dgito binrio

MOV DPTR, #AB Ambas as instrues carregam o DPTR com a cadeia


de caractere AB
MOV DPTR, #4142H

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Operadores de expresso Smbolo do
Operador
Operao

+, -, Adio, subtrao
/, * Diviso, multiplicao
MOD Resto da diviso
OR Ou-lgico
Precedncia do Operadores AND E-lgico
()
XOR Ou-exclusivo
HIGH, LOW
NOT Complemento
* , /, MOD, SHL, SHR
SHR Rodar direita
+, -
SHL Rodar esquerda
EQ, NE, LT, LE, GT, GE, =, <>, <, <=, >, >=
HIGH Obter o MSB
NOT
LOW Obter o LSB
AND
EQ, = Igual a
OR, XOR
NE, <> Diferente
Operadores com mesma precedncia so avaliados da esquerda
para direita LT, < Menor que

LE, <= Menor ou igual


GT, > Maior que
GE, >= Maior ou igual

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Expresso Resultado TRES EQU 3
A B 0001H MTRES EQU -3
HIGH(0AADDH) 0AAH MOV A, #10 + 10H
LOW(0AADDH) 0DDH MOV A, #1AH
7 MOD 4 3 MOV A, #25 MOD 7
1000B SHR 2 0010B MOV A, #4
NOT 1 0FFFEH MOV A, #9 AND 0FH
A SHL 8 4100H MOV A, #9
5 EQ 8 0000H MOV A, # (NOT TRES) + 1
A LT B 0FFFFH MOV A, #MTRES
3 <= 3 0FFFFH MOV A, #11111101B
-1 0FFFFH MOV A, #8 SHL 1
7 NE 4 ou 7<>4 0FFFFH MOV A, #10H
1101B XOR 0101B 1000B MOV A, #12H
HIGH(A SHL 8) 0041H MOV A, #HIGH 1234H
HIGH A SHL 8 0000H MOV A, #5 = 5
A OR A SHL 8 4141H MOV A, #$ > 0
NOT A 1 0FFBFH MOV A, #100 GE 50

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Categoria Diretiva Sntaxe Funo
para
ASM51
Controle do ORG ORG expresso Especifica um valor para contador de localizao
do segmento ativo
estado
END END Indica ao assembler o fim do programa fonte

USING USING expresso Indica ao assembler o banco de registo usado no


cdigo que vem a seguir diretiva. Repare que
a comutao do banco de registro deve ser
efetuada usando apenas instrues do 8051

Definio de SEGMENT Smbolo SEGMENT tipo_de_segmento Declara um smbolo como sendo um segmento
relocatable de um dado tipo. Para comear a usar
smbolos o segmento, deve-se usar a diretiva RSEG

EQU Smbolo EQU expresso Atribu um valor a um smbolo

SET Smbolo SET expresso Igual ao EQU, exceptuando o fato de permitir a


redefinio o smbolo

DATA Smbolo DATA expresso Atribui ao smbolo um endereo direto da RAM


interna

IDATA Smbolo IDATA expresso Atribui um endereo indiretamente enderevel


da RAM interna ao smbolo

XDATA Smbolo XDATA expresso Atribui ao smbolo um endereo da memria


externa

BIT Smbolo BIT expresso Atribu um endereo direto da rea de memria


enderevel ao bit a um smbolo

CODE Smbolo CODE expresso Atribu um endereo da memria de cdigo ao


smbolo

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
DEZ EQU 10 ; O smbolo DEZ passa a ser uma constante de valor 10

CONTADOR EQU R7 ; INC R7 pode agora ser substitudo por INC CONTADOR

NOVO_DEZ EQU DEZ ; smbolo atribudo o valor de outro smbolo j definido

CINCO EQU DEZ / 2 ; smbolo atribudo o valor de uma expresso aritmtica

A_REG EQU A ; A_REG pode ser usado legalmente onde A normalmente usado

ASCII_D EQU D ; smbolo atribudo o valor do caractere ASCII D

HERE EQU $ ; valor do contador de localizao atribudo ao smbolo

EPROM SEGMENT CODE ; declarao do smbolo como sendo um segmento de cdigo

APONTADOR SET R0 ; endereo de R0 atribudo ao smbolo

APONTADOR SET R1 ; redefinio de APONTADOR para registro R1

VALOR SET 1 ;Inicializao de um smbolo varivel com valor 1

VALOR SET VALOR + 1 ; incremento do contedo do smbolo VALOR

CF BIT 0D7H ; smbolo apontado para a flag carry no registro PSW

OFF_FLAG BIT 6 ; endereo de memria atribudo a uma flag

ON_FLAG BIT OFF_FLAG + 1 ; o prximo bit uma outra flag

RESET CODE 0 ; atribuio de um endereo de cdigo a um smbolo

EXIT0 CODE RESET + (1024/16) ; atribuio de um endereo de cdigo atravs de uma expresso

Microprocessadores
Jump

Estrutura do programa e programao


Assembly com 8051
Categoria Diretiva Sntaxe Funo
para
ASM51
Incializao e DS [LABEL:] DS expresso Reserva espaos em mltiplos de bytes. No
reserva de pode ser utilizado com segmento do tipo
BIT. O valor da expresso deve ser
armazenamento conhecida pelo assembler

DBIT [LABEL:] DBIT expresso Reserva espaos em mltiplos de bits. O valor


da expresso deve ser conhecida pelo
assembler

DB/DW [LABEL:] DB/DW expresso Inicializa a memria de cdigo com valores


do tipo byte/word

Program linkage PUBLIC PUBLIC Smbolo [, smbolo ] [...] Define uma lista de smbolos que tornam
visveis e utilizveis a partir de outros
mdulos

EXTRN EXTRN Tipo_segmento(smbolo Informa o assembler da lista de smbolos


definidos noutros mdulos e que vo ser
[,smbolo] [...], ...) utilizados neste. O tipo de segmento pode ser CODE,
DATA, XDATA, IDATA, BIT e um especial designado
por NUMBER que especifica um smbolo definido por
EQU

NAME NAME Nome_do_mdulo


Seleo de RSEG RSEG Nome_do_segmento Ao encontrar uma diretiva de seleo de
Segmentos segmento, o assembler direciona o cdigo

CSEG CSEG [ AT endereo ] ou dado que lhe segue para o segmento

... DSEG [ AT endereo ] selecionado at que seja selecionado um

XSEG XSEG [ AT endereo ] outro segmento

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
PSW DATA 0D0H ;define o endereo do registro de estado do programa

BUFFER DATA 32 ; definio de um endereo na RAM interna

FREE_SPACE DATA BUFFER + 6 ; definio de endereo usando expresso aritmtica

USER_BASE XDATA 2048 ; definio de um endereo na memria externa

HOST_BASE XDATA USER_BASE+100h ; definio de endereo usando expresso aritmtica

ORG 1000H ; atualizao do contador de localizaes do segmento


;ativa com 4096

ORG RESET ; atualizao do contador de localizao com o valor do


;smbolo j definido

ORG BASE + MODULE_NO ; atualizao do LC usando expresso aritmtica

USING 0 ; seleo dos endereos do banco de registro 0

USING 1+1+1 ; seleo dos endereos do banco de registro 3 atravs de


;expresso aritmtica

ORG ($ + 1000H) AND 0F000H ; atualizao do LC para a prxima fronteira de 4K

DSEG ; seleciona o segmento absoluto de dado diretamente


;enderevel (DATA) usando o valor do LC atual

BSEG AT 32 ; Seleciona o segmento de dado enderevel a bit


;(BITDATA) e atualiza o LC com 32

XSEG AT (USER_BASE *5) MOD 16 ; Seleciona o segmento absoluto de dado externo


;(XDATA) e usa uma expresso aritmtica para atualizar
;o LC

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
DSEG ; seleciona o segmento absoluto de dado (DATA)

DS 32 ; repare que a label opcional

SP_BUFFER: DS 16 ; reserva um buffer de 16 bytes para a comunicao srie

IO_BUFFER: DS 8 ; reserva um buffer de 8 bytes para a entrada/sada

BSEG ; seleciona o segmento absoluto enderevel a bit

DBIT 16 ; a label opcional

IO_MAP: DBIT 32 ; reserva um buffer de 32 bit para operaes de entrada/sada

MENSAGEM: DB (c) Copyright, 1984 ; cadeia de caractere

RUNTIME_CONST:
DB 127, 13, 64, 0, 99 ; tabela de constantes

DB 17, 32, 239, 163, 49 ; a label opcional

MIXED: DB 2*8, MPG, 2+6, ABC ; pode-se misturar nmeros com caracteres ASCII

JUMP_TABLE DW RESET, START, END ; tabela de endereos

DW TRUE, TEST, FALSE ; label opcional

RADIX: DW H, 1000H ; 1byte=0, 2byte=48h, 3byte=10h, 4byte=0

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Uso das diretivas PUBLIC e EXTERN
; declarao de subrotinas externas
EXTRN CODE (HELLO, GOODBYE)
; declarao de um dado externo
EXTRN DATA (BUF)
; torna o smbolo FLAG visvel e utilizvel noutros mdulos
PUBLIC FLAG
; definio de uma constante com valor 10h
FLAG EQU 10H
... ...
; invocar a subrotina HELLO a partir do mdulo 2
CALL HELLO
... ...
; invocar a subrotina GOODBYE a partir do mdulo 2
CALL GOODBYE
... ...
; seleciona o segmento absoluto enderevel a bit
END

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Uso das diretivas PUBLIC e EXTERN
; declarao de uma constante externa
EXTRN NUMBER (FLAG)
; torna as subrotinas e o buffer visveis e utilizveis
PUBLIC HELLO, GOODBYE, BUF ;noutros mdulos

... ...
; incio da subrotina HELLO
HELLO: MOV A, #FLAG
... ...
; concluso da subrotina HELLO
RET

; incio da subrotina GOODBYE


GOODBYE: CLR C
... ...
; concluso da subrotina GOODBYE
RET
;
BUF: DS 10H
; fim do mdulo
END

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Definio e inicializao de segmentos
; declarao de um segmento de dado relocatable
ONCHIP SEGMENT DATA
; declarao de um segmento de cdigo relocatable
EPROM SEGMENT CODE
; inicializao de um segmento absoluto enderevel ao bit a partir do endereo de bit
BSEG AT 70H ;70h que precisamente o bit 0 do endereo 2EH (consultar a rea enderevel ao bit
;visto nas primeiras aulas)
; FLAG1 um bit enderevel pelo endereo 70h
FLAG1: DBIT 1
; FLAG2 enderevel pelo endereo 71h
FLAG2: DBIT 2
;inicializao do segmento relocatable ONCHIP
RSEG ONCHIP
; label que aponta para localizao enderevel ao byte. Qual o endereo?
TOTAL: DS 1
; label que aponta para localizao enderevel ao byte. Qual o endereo?
COUNT: DS 1
; label para uma localizao enderevel a Word. Qual o endereo?
SUM: DS 2
; inicializao de do segmento relocatable EPROM
RSEG EPROM
; Qual o endereo da label BEGIN?
BEGIN: MOV TOTAL, #0
... ... Sendo este smbolos definidos
em segmentos relocatable, s
; fim do mdulo
END sero estabelecidos pelo linker

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Criar um buffer de 40 bytes(a partir do endereo 40H) na
RAM interna e inicializ-la com o ASCII a:
; inicializao do segmento de dado interno (DATA) a partir do endereo 40H
DSEG AT 40H
; smbolo constante com a dimenso do buffer
LEN EQU 40
; 40 bytes so reservadas a partir do endereo 40h do segmento DATA
BUFFER: DS LEN
CSEG AT 0
MOV R7, #LEN ; usa R7 como o contador de posies a inicializar

; aponta R0 para a primeira posio do buffer


MOV R0, #BUFFER
;escrever no endereo apontado por R0 actualmente, o caractere a
LOOP: MOV @R0, #a
; j atingiu a ltima posio? Se no, ento continua a preencher
DJNZ R7, LOOP
; caso contrrio, acabou
...
; fim do mdulo
END

Apresente uma alternativa para a colocao Basta substituir a primeira linha por
do buffer a partir do endereo 40H? DSEG
ORG 40H
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Criar um um buffer de 500 words(a partir do endereo 4000H) na RAM
externa e inicializ-la com zeros
ADDR EQU 4000H ;inicializao de uma constante com o endereo do buffer

LEN EQU 1000 ; inicializao de uma constante com a dimenso do buffer


;(500 words)

XSEG AT ADDR ; inicializao do segmento absoluto XDATA

BUFFER: DS LEN ; alocao de espao para as 500 words

CSEG AT 0000H
MOV DPTR, # BUFFER ; apontar para o incio do buffer a zerar

CLR A ; preparar o caractere de inicializao no acumulador

LOOP: MOV @DPTR, A ; zerar a posio do buffer actualmente apontada por


DPTR

INC DPTR ; aponta para a prxima posio

MOV A, DPL ;aps preencher a ltima posio do buffer dptr apontar

CJNE A, #LOW(BUFFER + LEN +1), LOOP ; uma posio abaixo. Como no existe uma instruo para

MOV A, DPH ;comparar dados de 16-bits, torna-se necessrio efectuar a

CJNE A, #HIGH(BUFFER + LEN +1), LOOP ;comparao do MSB e LSB do DPTR com os do endereo
; que est uma posio aps a ltima posio do buffer

... ; se forem iguais ento acabou ozerar do buffer

END ; fim do mdulo


Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Sabendo que o ASCII A= 41H, ASCII a = 61H e ASCII : =3AH, descreva
o estado da memria de cdigo aps o assembler interpretar as seguintes
diretivas:

CSEG AT 0100H
SQUARES: DB 0, 1, 4, 9, 16, 25 ;quadrados dos nmeros 0-5
MESSAGE: DB Login: , 0 ;string terminado com caractere nulo
Endereo Contedo
L = A + 0Ch 01h = 4Ch 0100h 00h
0101h 01h

o = a + 0Fh 01h = 6Fh 0102h 04h


0103h 09h
0104h 10h
.... 0105h 19h
0106h 4Ch
0107h 6Fh
0108h 67h
0109h 69h
010Ah 6Eh
010Bh 3Ah
010Ch 00h

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Descreva o estado da memria de cdigo aps o assembler interpretar as
seguintes diretivas:

CSEG AT 200H
DW $, A, 1234H, 2 , BC

Endereo Contedo
0200h 00h
0201h 02h
0202h 41h
0203h 00h
0204h 34h
0205h 12h
0206h 02h
0207h 00h
0208h 43h
0209h 42h

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Controles do Controlos do
Assembler assembler
$DATE(data) Coloca a data no cabealho da pgina
$TITLE(string) Coloca uma cadeia de caracteres no cabealho da
Usados para pgina

controlar: $PAGING
$PAGEWIDTH(n)
Dividir o ficheiro de listagem em vrias pginas
Especifica o nmero de colunas (caracteres por
linha) numa pgina de listagem
onde o assembler $SYMBOLS Cria uma tabela formatada de smbolos usada no
obtm os ficheiros programa
de entrada $NOPRINT Impede a criao de ficheiros de listagem
$DEBUG Escreve informao sobre smbolo de depurao
nos ficheiros objetos
onde colocar os $EJECT Continua a listagem na prxima pgina
ficheiros objetos $ERRORPRINT(file) Especifica um ficheiro para as MSGs de erros
$MOD51 Reconhece os SFR pr-definidos para o 8051
como formatar os $LIST Escreve cada linha do ficheiro de cdigo assembly
no ficheiro de listagem
ficheiros de listagem
... ...

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Macros
til quando uma parcela de cdigo usado
repetidamente no programa
i. Escreve-se a parcela de cdigo uma nica vez e ser usada
posteriormente em qualquer parte do programa atravs do
uso do nome da macro (posio onde o assembler expande o cdigo da
macro)

ii. Ao contrrio das macros, as subrotinas so invocadas atravs


de instrues especiais CALLs (o corpo da subrotina no
expandida, mas muda-se o fluxo de execuo)

iii. As macros so usadas no campo das mnemnicas de uma


linha de cdigo assembler como se fosse uma instruo
i. O nome da macro precedido de % para a distinguir de
uma instruo 8051
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Quando usar macro ou subrotina?

1. Subrotinas so normalmente usadas para tarefas


complexas e que envolvam grandes quantidades de
cdigo em que o overhead associado
chamada/retorno seja tolervel
Poupa na memria de cdigo

2. Macros so usadas para tarefas simples ou ento


quando se requer a velocidade do cdigo inline

Consome mais memria de cdigo

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
O que acontece quando uma subrotina
invocada?
1. O apontador de instrues (PC) automaticamente
guardado na pilha

2. PC ser carregado com o endereo inicial da subrotina

3. A subrotina executada

4. Ao concluir a execuo da subrotina, a instruo RET


carrega PC com o endereo anteriormente guardado na
pilha
A execuo continua com a instruo que
segue a instruo CALL

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Sintaxe da Macro
1. Sem passagem de parmetro

%*DEFINE (nome_macro) (corpo da macro)

2. Com Passagem de parmetro

%*DEFINE (nome_macro (lista_parm) ) (corpo da macro)

3. Genrica com etiquetas

%*DEFINE (nome_macro [(lista_parm)] )


[ Local lista_label ] (corpo da macro)
Nota: repare que as listas de argumentos e de etiquetas so opcionais

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Exemplos de Macro %*DEFINE (DEC_DPTR) LOCAL SKIP
(DEC DPL
%*DEFINE (PUSH_DPTR)
MOV A, DPL
( PUSH DPH
CJNE A, #0FFH, %SKIP
PUSH DPL ) DEC DPH
%SKIP:)
%*DEFINE (CMP_NUM (VALOR) )
(CJNE A, #%VALOR, $+3) ...
START: MOV A, #3
%*DEFINE (JGT (VALOR, SALTO) ) %CMP_NUM (20)
(CJNE A, #%VALOR+1, $+3 JNC MAIOR

JNC %SALTO) JMP $


MAIOR: MOV A, #0FFH
CJNE uma instruo de 3 bytes END

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Preservao de dados
1. Deve-se sempre salvaguardar o contedo dos registros
alterados pelas macros/subrotinas, caso sejam
necessrios (com os valores anterior chamada) aps
a chamada da macro/subrotina

2. Uma forma de garantir a preservao destes dados


consiste em armazen-los na pilha (push), no incio do
corpo da macro/subrotina e restaur-los no final (pop)
No caso das funes antes da execuo do RET

Sendo a pilha uma estrutura LIFO (Last In First Out)


a ordem dos PUSHs e POPs devem ser invertidas

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Preservao de dados
%*DEFINE (DEC_DPTR) LOCAL SKIP
( PUSH ACC
DEC DPL
MOV A, DPL Salvaguarda e
restaurao de
CJNE A, #0FFH, %SKIP contexto
DEC DPH
POP ACC
%SKIP:)

START: MOV DPTR, #10F4H


MOVX A, @DPTR Pretende-se efetuar (A) = (10F4H) + 3
e de seguida apontar DPTR para
%DEC_DPTR
10F3H. Ser?
ADD A, #3
END

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Preservao de dados
SDIV: PUSH ACC
PUSH 0F0H
Salvaguarda e
restaurao de DIV AB
contexto ADD A, #2
MOV R0, A

POP 0F0H
(A) = 9 (B) = 3 POP ACC

Pretende-se efetuar (R0) = 2 + (A) / 3 = 5 RET


e 12 = (A) = (A) + (B). Ser?
START: MOV A, #9
MOV B, #3
CALL SDIV
ADD A, 0F0H
END

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Passagem de parmetros atravs da pilha
MAIN: MOV A, #05H ; (A) = 5

MOV B, #4H ; (B) = 4

PUSH 0F0H ; salvaguarda o contedo de B


Pilha
CALL ADD_IT ; invoca a subrotina
SP
POP 00H ; (R0) = (A) + (B)

SJMP $ ; acabou e fica pendurado nesta instruo

ADD_IT: MOV R0, SP ; carrega R0 com o apontador do topo da pilha

DEC R0 ; aponta para a posio aps o endereo de SP


R0 MSB(PCpop)
DEC R0 ; retorno
LSB(PCpop)
ADD A, B ; (A) = (A) + (B)
SP
; troca o contedo de A com o de ((R0)) R0 04H / 09H
XCH A, @R0
; retorna a main SP
RET SP

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Incio: Hex2Ascii Exerccio:Converta um dgito armazenado em R0 para
um caracter ASCII que representa o seu valor
Salvaguarda (A) , aponta R0 aps o endereo de hexadecimal. O valor em R0 contm apenas um dgito
retorno e carrega A com o valor a converter hexadecimal (o MSnibble 0). Guarde o resultado no
( (++SP) ) = ( A ), (R0) = ( SP ) 3 registro B. Deve invocar uma subrotina que recebe o
parmetro e devolve o resultado via pilha.
(A) = ((R0))
Incio

(A) No
Salvaguarda B e R0
Letra?
( (++SP) ) = (B)
Sim
( (++SP) ) = (R0) MAIN: PUSH 0F0H ; salvaguarda (B)
Ajustar Offset para letras PUSH 00H ; salvaguarda (R0)
(A) = (A) + ASCII A ASCII 0 -10
CALL H2Ascii ; converta o
; dgito Hexdecimal
Hex2Ascii
Conclua a converso das letra ou converta o dgito, POP 00H ; restaura (R0)
guarde o resultado na pilha e restaura (A) POP 0F0H ; coloca em B o
(A) = (A) + ASCII 0 Restaura (R0) e (B) ;valor convertido

( (R0)-1 ) = (A) JMP $ ; acabou


(R0) = ( (SP - -) )
(A) =( (SP --) ) (B) = ( (SP --) )

Fim Fim

Microprocessadores
Estrutura do programa e programao
Assembly com 8051
; Subrotina: Hex2Ascii
; Descrio: Converso de um dgito Hexadecimal para o correspondente caractere ASCII
; Entrada: Na pilha, logo aps o endereo de retorno estar o dgito a converter
; Sada: Na pilha, logo aps o parmetro de entrada ser colocado o resultado da converso
; Registo(s) Afectado(s): R0
; Exemplo: entrada = 06h sada = 36h ( 6 )

Hex2Ascii: PUSH ACC ; salvaguardar o (A)


MOV R0, SP ; 1 apontar R0 para topo da pilha
DEC R0 ; e depois aponta-o para
DEC R0 ; o valor a converter localizado
DEC R0 ; aps o endereo de retorno
MOV A, @R0 ; carregar A com o valor a converter
CJNE A, #10, $+3 ; verificar se letra ou dgito
JNC LETRA ; sendo letra, vai ajustar o offset
JMP GUARDA ; sendo dgito no precisa ajustar o offset, apenas vai concluir a converso
LETRA: ADD A, # (A - 0 - 10) ; ajustar o offset no caso de letra
GUARDA: ADD A, #0 ; concluir a converso tanto para letra como dgito
DEC R0 ; apontar R0 para a localizao da pilha onde foi salvaguadado B
MOV @R0, A ; guardar o valor convertido nesta localizao
POP ACC ; restaurar o (A)
RET ; retornar ao main
Microprocessadores