Sie sind auf Seite 1von 43

Microprocessadores www.corradi.junior.nom.

br - COTUCA
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
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
Programa.src
(echo.src)
A
S
M
5
1
Passo 1 (Tabela de smbolos)
1. (LC) =0 / ORG
2. (LC) +=length(inst) ou
(LC) +=length(DB/DW/DS)
3. SymT[...] =( label,(LC) ) ou
SymT[...] =( symbol,(EQU) )
Passo 2
1. Mnemnica opcode
2. Determinao dos operandos
Todos os smbolos so
substitudos pelo valor
na tabela de smbolos
Echo.lst
Programa.lst
Echo.obj
Programa.obj
LC = Location Counter
Usado pelo assembler como
endereo da instruo ou valor
da label
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
Pertencem a outros mdulos, e
por isso s o linker pode
determinar o endereo absoluto
Informa ao ASM51 que as subrotinas foram definidas
noutro mdulo
A resolver pelo
linker ( assembler
desconhece 0
endereo do
segmento
relocatable)
Opcode das instrues
Identifica o fim de um
programa assembler
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:usode 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:
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
Pg. 164: errado
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Exemplo de ficheiro .Map criado pelo Linker
Esta tabela de
smbolos aparece no
ficheiro .M51 porque
os ficheiros .src
comeam com a
diretiva $DEBUG
1. Do ficheiro echo.lst, linha 14 obtm-
se o opcode da instruo como sendo
12H
2. Da tabela de smbolos do ficheiro
example.M51 obtm-se o endereo
absoluto de INIT como sendo 8024H
3. Sendo CALL de 3 bytes(porqu?) a
respectiva codificao seria 12 8024h
Diga como apareceria
no ficheiro executvel a
codificao da instruo
CALL INIT, invocada
no mdulo MAIN?
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
ilegal / controlo do assembler SEGMENT TITLE
ilegal / operador do assembler 19 DW MOD
1 caractere ilegal 3 DS 1st_var
legal 12 DBIT ?_?_?
contm caractere ilegal 00FFh DW ALPHA#
ilegal /instruo assembly
ilegal / operador do assembly
ilegal/directiva assembly
ilegal /duplicado
legal
legal
legal
legal
legal
IDATA MOV
80H CODE LOW
100 EQU DATA
etiqueta THERE JMP Start:
Etiqueta 16 DBIT BitVar:
Etiqueta 10 DS VAR:
Etiqueta Help DB Mensagem:
Etiqueta A, #0FFH MOV START:
Smbolo 500 EQU PAR
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
ilegal A, #01FFH MOV
ilegal A, 0FE00H MOV
legal A, #00D8H MOV
legal A, #0FF00H MOV
legal 40H, #CONSTANTE ORL
legal A, #0FEH MOV
100 EQU CONSTANTE
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Como especificar o endereo de um bit numa
instruo?
TI, $
C
J NB
CLR
Usando um smbolo pr-definido
ACC.7
224.ON
0E0H.7
SETB
SETB
SETB
Usando o operador .
0E7H
99H, $
SETB
J NB
Explicitamente pelo endereo
7 EQU ON
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Bases nmericas
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
A, #0FH
A, #0A5H
A, #A5H
Hexadecimal
A, #17Q
A, #17O
Octal
#1111B Binrio
A, #15
A, #15D
Decimal
?
Para diferenciar um
dado hexadecimal
imediato de um smbolo
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Cadeias de caractere
Ambas as instrues carregam o DPTR com a cadeia
de caractere AB
DPTR, #AB
DPTR, #4142H
MOV
MOV
Converte dgito ASCII para dgito binrio
A, #0 SUBB
Fica a espera que (A) seja do caractere Q
A, #Q, AGUARDE CJ NE
AGUARDE:
Armazenar na memria de cdigo 8, 0, 5,1
8051 DB
Define ASPAS como sendo 22h

EQU
ASPAS
carrega A com 06Dh, valor do ASCII m
A, #m MOV
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Operadores de expresso
Maior que GT, >
Maior ou igual GE, >=
Menor ou igual
LE, <=
Menor que
LT, <
Diferente
NE, <>
Igual a
EQ, =
Obter o LSB LOW
Obter o MSB HIGH
Rodar esquerda SHL
Rodar direita SHR
Complemento NOT
Ou-exclusivo XOR
E-lgico AND
Ou-lgico OR
Resto da diviso MOD
Diviso, multiplicao /, *
Adio, subtrao +, -,
Operao Smbolo do
Operador
OR, XOR
AND
Operadores com mesma precedncia so avaliados da esquerda
para direita
NOT
EQ, NE, LT, LE, GT, GE, =, <>, <, <=, >, >=
+, -
* , /, MOD, SHL, SHR
HIGH, LOW
( )
Precedncia do Operadores
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
0041H HIGH(A SHL 8)
0000H HIGH A SHL 8
4141H A OR A SHL 8
0FFBFH NOT A 1
1000B 1101B XOR 0101B
0FFFFH 7 NE 4 ou 7<>4
0FFFFH -1
0FFFFH 3 <= 3
0FFFFH A LT B
0000H 5 EQ 8
4100H A SHL 8
0FFFEH NOT 1
0010B 1000B SHR 2
3 7 MOD 4
0DDH LOW(0AADDH)
0AAH HIGH(0AADDH)
0001H A B
Resultado Expresso
A, #$ > 0 MOV
A, #HIGH 1234H MOV
A, #5 = 5 MOV
A, #12H MOV
A, #100 GE 50 MOV
A, #10H MOV
A, #8 SHL 1 MOV
A, #11111101B MOV
A, #MTRES MOV
A, # (NOT TRES) + 1 MOV
A, #9 MOV
A, #9 AND 0FH MOV
A, #4 MOV
A, #25 MOD 7 MOV
A, #1AH MOV
A, #10 + 10H MOV
-3 EQU MTRES
3 EQU TRES
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
expresso
expresso
expresso
expresso
expresso
expresso
expresso
tipo_de_segmento
expresso
expresso
CODE
BIT
XDATA
IDATA
DATA
SET
EQU
SEGMENT
USING
END
ORG
Sntaxe
Smbolo
Smbolo
Smbolo
Smbolo
Smbolo
Smbolo
Smbolo
Smbolo
Atribu um endereo da memria de cdigo ao
smbolo
CODE
Atribu um endereo direto da rea de memria
enderevel ao bit a um smbolo
BIT
Atribui ao smbolo um endereo da memria
externa
XDATA
Atribui um endereo indiretamente enderevel
da RAM interna ao smbolo
IDATA
Atribui ao smbolo um endereo direto da RAM
interna
DATA
Igual ao EQU, exceptuando o fato de permitir a
redefinio o smbolo
SET
Atribu um valor a um smbolo
EQU
Declara um smbolo como sendo um segmento
relocatable de um dado tipo. Para comear a usar
o segmento, deve-se usar a diretiva RSEG
SEGMENT
Definio de
smbolos
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
USING
Indica ao assembler o fim do programa fonte
END
Especifica um valor para contador de localizao
do segmento ativo
ORG
Controle do
estado
Funo Diretiva
para
ASM51
Categoria
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
; atribuio de um endereo de cdigo a um smbolo
0 CODE RESET
; endereo de memria atribudo a uma flag
6 BIT OFF_FLAG
; o prximo bit uma outra flag
OFF_FLAG +1 BIT ON_FLAG
; atribuio de um endereo de cdigo atravs de uma expresso
RESET +(1024/16) CODE EXIT0
; smbolo apontado para a flag carry no registro PSW
0D7H BIT CF
; incremento do contedo do smbolo VALOR
VALOR +1 SET VALOR
;Inicializaode um smbolo varivel com valor 1
1 SET VALOR
; redefinio de APONTADOR para registro R1
R1 SET APONTADOR
; endereo de R0 atribudo ao smbolo
R0 SET APONTADOR
; declarao do smbolo como sendo um segmento de cdigo
CODE SEGMENT EPROM
; valor do contador de localizao atribudo ao smbolo
$ EQU HERE
; smbolo atribudo o valor do caractere ASCII D
D EQU ASCII_D
; A_REG pode ser usado legalmente onde A normalmente usado
A EQU A_REG
; smbolo atribudo o valor de uma expresso aritmtica
DEZ / 2 EQU CINCO
; smbolo atribudo o valor de outro smbolo jdefinido
DEZ EQU NOVO_DEZ
; INC R7 pode agora ser substitudo por INC CONTADOR
R7 EQU CONTADOR
; O smbolo DEZ passa a ser uma constante de valor 10
10 EQU DEZ
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
[ AT endereo ]
[ AT endereo ]
[ AT endereo ]
Nome_do_segmento
Nome_do_mdulo
Tipo_segmento(smbolo
[,smbolo] [...], ...)
Smbolo [, smbolo ] [...]
expresso
expresso
expresso
XSEG
DSEG
CSEG
RSEG
NAME
EXTRN
PUBLIC
DB/DW
DBIT
DS
Sntaxe
[LABEL:]
[LABEL:]
[LABEL:]
outro segmento
XSEG
selecionado at que seja selecionado um
...
ou dado que lhe segue para o segmento
CSEG
Ao encontrar uma diretiva de seleo de
segmento, o assembler direcionao cdigo
RSEG Seleo de
Segmentos
NAME
Informa o assembler da lista de smbolos
definidos noutros mdulos e que vo ser
utilizados neste. O tipo de segmento pode ser CODE,
DATA, XDATA, IDATA, BIT e umespecial designado
por NUMBER que especifica umsmbolo definido por
EQU
EXTRN
Define uma lista de smbolos que tornam
visveis e utilizveis a partir de outros
mdulos
PUBLIC Program linkage
Inicializaa memria de cdigo com valores
do tipo byte/word
DB/DW
Reserva espaos em mltiplos de bits. O valor
da expresso deve ser conhecida pelo
assembler
DBIT
Reserva espaos em mltiplos de bytes. No
pode ser utilizado com segmento do tipo
BIT. O valor da expresso deve ser
conhecida pelo assembler
DS Incializao e
reserva de
armazenamento
Funo Diretiva
para
ASM51
Categoria
Jump
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
; Seleciona o segmento absoluto de dado externo
;(XDATA) e usa uma expresso aritmtica para atualizar
;o LC
AT (USER_BASE *5) MOD 16 XSEG
; Seleciona o segmento de dado enderevel a bit
;(BITDATA) e atualiza o LC com 32
AT 32 BSEG
; seleciona o segmento absoluto de dado diretamente
;enderevel (DATA) usando o valor do LC atual
DSEG
; atualizao do LC para a prxima fronteira de 4K
($ +1000H) AND 0F000H ORG
; seleo dos endereos do banco de registro 3 atravs de
;expresso aritmtica
1+1+1 USING
; seleo dos endereos do banco de registro 0
0 USING
; atualizao do LC usando expresso aritmtica
BASE +MODULE_NO ORG
; atualizao do contador de localizao com o valor do
;smbolo jdefinido
RESET ORG
; atualizao do contador de localizaes do segmento
;ativa com 4096
1000H ORG
; definio de endereo usando expresso aritmtica
USER_BASE+100h XDATA HOST_BASE
; definio de um endereo na memria externa
2048 XDATA USER_BASE
; definio de endereo usando expresso aritmtica
BUFFER +6 DATA FREE_SPACE
; definio de um endereo na RAM interna
32 DATA BUFFER
;define o endereo do registro de estado do programa
0D0H DATA PSW
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
; label opcional
TRUE, TEST, FALSE DW
; 1byte=0, 2byte=48h, 3byte=10h, 4byte=0
H, 1000H DW RADIX:
; tabela de endereos
RESET, START, END DW J UMP_TABLE
; pode-se misturar nmeros com caracteres ASCII
2*8, MPG, 2+6, ABC DB MIXED:
; a label opcional
17, 32, 239, 163, 49 DB
; tabela de constantes
127, 13, 64, 0, 99 DB
RUNTIME_CONST:
; cadeia de caractere
(c) Copyright, 1984 DB MENSAGEM:
; reserva um buffer de 32 bit para operaes de entrada/sada
32 DBIT IO_MAP:
; a label opcional
16 DBIT
; seleciona o segmento absoluto enderevel a bit
BSEG
; reserva um buffer de 8 bytespara a entrada/sada
8 DS IO_BUFFER:
; reserva um buffer de 16 bytes para a comunicao srie
16 DS SP_BUFFER:
; repare que a label opcional
32 DS
; seleciona o segmento absoluto de dado (DATA)
DSEG
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
; declarao de um dado externo
DATA (BUF) EXTRN
; torna o smbolo FLAG visvel e utilizvel noutros mdulos
FLAG PUBLIC
; seleciona o segmento absoluto enderevel a bit
END
; invocar a subrotina GOODBYE a partir do mdulo 2
GOODBYE
...
CALL
...
; invocar a subrotina HELLO a partir do mdulo 2
HELLO
...
CALL
...
; definio de uma constante com valor 10h
10H
...
EQU
...
FLAG
; declarao de subrotinas externas
CODE (HELLO, GOODBYE) EXTRN
Uso das diretivas PUBLIC e EXTERN
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
;
10H DS BUF:
; concluso da subrotina GOODBYE
RET
; torna as subrotinas e o buffer visveis e utilizveis
;noutros mdulos
HELLO, GOODBYE, BUF
...
PUBLIC
...
; fim do mdulo
END
; incio da subrotina GOODBYE
C
...
CLR
...
GOODBYE:
; concluso da subrotina HELLO
RET
; incio da subrotina HELLO
A, #FLAG
...
MOV
...
HELLO:
; declarao de uma constante externa
NUMBER (FLAG) EXTRN
Uso das diretivas PUBLIC e EXTERN
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
; FLAG2 enderevel pelo endereo 71h
2 DBIT FLAG2:
; Qual o endereo da label BEGIN?
TOTAL, #0
...
MOV
...
BEGIN:
; label para uma localizao enderevel a Word. Qual o endereo?
2 DS SUM:
; inicializaode do segmento relocatable EPROM
EPROM RSEG
;inicializaodo segmento relocatable ONCHIP
ONCHIP RSEG
; label que aponta para localizao enderevel ao byte. Qual o endereo?
1 DS TOTAL:
; label que aponta para localizao enderevel ao byte. Qual o endereo?
1 DS COUNT:
; FLAG1 um bit enderevel pelo endereo 70h
1 DBIT FLAG1:
; inicializaode um segmento absoluto enderevel ao bit a partir do endereo de bit
;70h que precisamente o bit 0 do endereo 2EH (consultar a rea enderevel ao bit
;visto nas primeiras aulas)
AT 70H BSEG
; fim do mdulo
END
; declarao de um segmento de cdigo relocatable
CODE SEGMENT EPROM
; declarao de um segmento de dado relocatable
DATA SEGMENT ONCHIP
Definio e inicializao de segmentos
Sendo este smbolos definidos
em segmentos relocatable, s
sero estabelecidos pelo linker
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
; caso contrrio, acabou
...
; aponta R0 para a primeira posio do buffer
R0, #BUFFER MOV
;escrever no endereo apontado por R0 actualmente, o caractere a
@R0, #a MOV LOOP:
; jatingiu a ltima posio? Se no, ento continua a preencher
R7, LOOP DJ NZ
; usa R7 como o contador de posies a inicializar
0
R7, #LEN
CSEG AT
MOV
; 40 bytes so reservadas a partir do endereo 40h do segmento DATA
LEN DS BUFFER:
; fim do mdulo
END
; smbolo constante com a dimenso do buffer
40 EQU LEN
; inicializaodo segmento de dado interno (DATA) a partir do endereo 40H
AT 40H DSEG
Criar um buffer de 40 bytes(a partir do endereo 40H) na
RAM interna e inicializ-la com o ASCII a:
Basta substituir a primeira linha por
DSEG
ORG 40H
Apresente uma alternativa para a colocao
do buffer a partir do endereo 40H?
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
AT 0000H CSEG
;comparao do MSB e LSB do DPTR com os do endereo
; que estuma posio aps a ltima posio do buffer
A, #HIGH(BUFFER +LEN +1), LOOP CJ NE
;comparar dados de 16-bits, torna-se necessrio efectuar a
A, DPH MOV
; aponta para a prxima posio
DPTR INC
;aps preencher a ltima posio do buffer dptr apontar
A, DPL MOV
; uma posio abaixo. Como no existe uma instruo para
A, #LOW(BUFFER +LEN +1), LOOP CJ NE
; se forem iguais ento acabou ozerar do buffer
...
; apontar para o incio do buffer a zerar
DPTR, #BUFFER MOV
; preparar o caractere de inicializaono acumulador
A CLR
; zerar a posio do buffer actualmente apontada por
DPTR
@DPTR, A MOV LOOP:
; alocao de espao para as 500 words
LEN DS BUFFER:
; inicializaodo segmento absoluto XDATA
AT ADDR XSEG
; fim do mdulo
END
; inicializaode uma constante com a dimenso do buffer
;(500 words)
1000 EQU LEN
;inicializaode uma constante com o endereo do buffer
4000H EQU ADDR
Criar um um buffer de 500 words(a partir do endereo 4000H) na RAM
externa e inicializ-la com zeros
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
L = A + 0Ch 01h = 4Ch
o = a + 0Fh 01h = 6Fh
....
00h 010Ch
3Ah 010Bh
6Eh 010Ah
69h 0109h
67h 0108h
6Fh 0107h
4Ch 0106h
19h 0105h
10h 0104h
09h 0103h
04h 0102h
01h 0101h
00h 0100h
Contedo Endereo
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
42h 0209h
43h 0208h
00h 0207h
02h 0206h
12h 0205h
34h 0204h
00h 0203h
41h 0202h
02h 0201h
00h 0200h
Contedo Endereo
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Controles do
Assembler
Usados para
controlar:
onde o assembler
obtm os ficheiros
de entrada
onde colocar os
ficheiros objetos
como formatar os
ficheiros de listagem
... ...
Escreve cada linha do ficheiro de cdigo assembly
no ficheiro de listagem
$LIST
Reconhece os SFR pr-definidos para o 8051 $MOD51
Especifica um ficheiro para as MSGsde erros $ERRORPRINT(file)
Continua a listagem na prxima pgina $EJECT
Escreve informao sobre smbolo de depurao
nos ficheiros objetos
$DEBUG
Impede a criao de ficheiros de listagem $NOPRINT
Cria uma tabela formatada de smbolos usada no
programa
$SYMBOLS
Especifica o nmero de colunas (caracteres por
linha) numa pgina de listagem
$PAGEWIDTH(n)
Dividir o ficheiro de listagem em vrias pginas $PAGING
Coloca uma cadeia de caracteres no cabealho da
pgina
$TITLE(string)
Coloca a data no cabealho da pgina $DATE(data)
Controlos do
assembler
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 envolvamgrandes 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 (PUSH_DPTR)
( PUSH DPH
PUSH DPL )
%*DEFINE (CMP_NUM(VALOR) )
(CJNE A, #%VALOR, $+3)
%*DEFINE (DEC_DPTR) LOCAL SKIP
(DEC DPL
MOV A, DPL
CJNE A, #0FFH, %SKIP
DEC DPH
%SKIP:)
...
START: MOV A, #3
%CMP_NUM (20)
JNC MAIOR
JMP $
MAIOR: MOV A, #0FFH
END
%*DEFINE (JGT (VALOR, SALTO) )
(CJNE A, #%VALOR+1, $+3
JNC %SALTO)
CJNE uma instruo de 3 bytes
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
(
DEC DPL
MOV A, DPL
CJNE A, #0FFH, %SKIP
DEC DPH
%SKIP:)
START: MOV DPTR, #10F4H
MOVX A, @DPTR
%DEC_DPTR
ADD A, #3
END
Pretende-se efetuar (A) = (10F4H) + 3
e de seguida apontar DPTR para
10F3H. Ser?
PUSH ACC
POP ACC
Salvaguarda e
restaurao de
contexto
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Preservao de dados
(A) = 9 (B) = 3
Pretende-se efetuar (R0) = 2 + (A) / 3 = 5
e 12 = (A) = (A) + (B). Ser?
SDIV:
DIV AB
ADD A, #2
MOV R0, A
RET
START: MOV A, #9
MOV B, #3
CALL SDIV
ADD A, 0F0H
END
PUSH ACC
PUSH 0F0H
POP 0F0H
POP ACC
Salvaguarda e
restaurao de
contexto
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Passagem de parmetros atravs da pilha
; (A) =(A) +(B)
A, B ADD
; retorno
R0 DEC
; aponta para a posio aps o endereo de
R0 DEC
; troca o contedo de A com o de ((R0))
A, @R0 XCH
; retorna a main
RET
; carrega R0 com o apontador do topo da pilha
R0, SP MOV ADD_IT:
; acabou e fica pendurado nesta instruo
$
SJ MP
; (R0) =(A) +(B)
00H POP
; invoca a subrotina
ADD_IT CALL
; salvaguarda o contedo de B
0F0H PUSH
; (B) =4
B, #4H MOV
; (A) =5
A, #05H MOV MAIN:
Pilha
SP
R0
R0
SP
SP
SP
04H
SP
MSB(PCpop)
LSB(PCpop)
/ 09H
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Fim
(A)
Letra?
Sim
No
Incio: Hex2Ascii
Salvaguarda (A) , aponta R0 aps o endereo de
retorno e carrega A com o valor a converter
( (++SP) ) = ( A ), (R0) = ( SP ) 3
(A) = ((R0))
Ajustar Offset para letras
(A) = (A) + ASCII A ASCII 0 -10
Conclua a converso das letra ou converta o dgito,
guarde o resultado na pilha e restaura (A)
(A) = (A) + ASCII 0
( (R0)-1 ) = (A)
(A) =( (SP --) )
Exerccio:Converta um dgito armazenado em R0 para
um caracter ASCII que representa o seu valor
hexadecimal. O valor em R0 contm apenas um dgito
hexadecimal (o MSnibble 0). Guarde o resultado no
registro B. Deve invocar uma subrotina que recebe o
parmetro e devolve o resultado via pilha.
Salvaguarda B e R0
( (++SP) ) = (B)
( (++SP) ) = (R0)
Incio
Fim
Restaura (R0) e (B)
(R0) = ( (SP - -) )
(B) = ( (SP --) )
Hex2Ascii
MAIN: PUSH 0F0H ; salvaguarda (B)
PUSH 00H ; salvaguarda (R0)
CALL H2Ascii ; converta o
; dgito Hexdecimal
POP 00H ; restaura (R0)
POP 0F0H ; coloca em B o
;valor convertido
JMP $ ; acabou
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
; restaurar o (A) ACC POP
; apontar R0 para a localizao da pilha onde foi salvaguadadoB R0 DEC
; guardar o valor convertido nesta localizao @R0, A MOV
; ajustar o offset no caso de letra A, #(A - 0 - 10) ADD LETRA:
; sendo dgito no precisa ajustar o offset, apenas vai concluir a converso GUARDA J MP
; sendo letra, vai ajustar o offset LETRA J NC
; concluir a converso tanto para letra como dgito A, #0 ADD GUARDA:
; retornar ao main RET
; verificar se letra ou dgito A, #10, $+3 CJ NE
; carregar A com o valor a converter A, @R0 MOV
; aps o endereo de retorno R0 DEC
; o valor a converter localizado R0 DEC
; e depois aponta-o para R0 DEC
; 1apontar R0 para topo da pilha R0, SP MOV
; salvaguardar o (A) ACC PUSH Hex2Ascii:
; 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 )

Das könnte Ihnen auch gefallen