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
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)
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)
Torna as subrotinas
visveis a outros mdulos
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Ficheiro .lst e tabela de smbolos (cont.)
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Qual a principal diferena entre um ficheiro
objeto absoluto e um relocatable?
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?
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
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Exemplo de smbolos
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
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
A, #A5H?
imediato de um smbolo
MOV
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Cadeias de caractere
AGUARDE: CJNE A, #Q, AGUARDE Fica a espera que (A) seja do caractere Q
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
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
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
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
A_REG EQU A ; A_REG pode ser usado legalmente onde A normalmente usado
EXIT0 CODE RESET + (1024/16) ; atribuio de um endereo de cdigo atravs de uma expresso
Microprocessadores
Jump
Program linkage PUBLIC PUBLIC Smbolo [, smbolo ] [...] Define uma lista de smbolos que tornam
visveis e utilizveis a partir de outros
mdulos
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
PSW DATA 0D0H ;define o endereo do registro de estado do programa
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
DSEG ; seleciona o segmento absoluto de dado (DATA)
RUNTIME_CONST:
DB 127, 13, 64, 0, 99 ; tabela de constantes
MIXED: DB 2*8, MPG, 2+6, ABC ; pode-se misturar nmeros com caracteres ASCII
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
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
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
CSEG AT 0000H
MOV DPTR, # BUFFER ; apontar para o incio do buffer a zerar
CJNE A, #LOW(BUFFER + LEN +1), LOOP ; uma posio abaixo. Como no existe uma instruo para
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
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
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)
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
3. A subrotina executada
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Sintaxe da Macro
1. Sem passagem de parmetro
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
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
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:)
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
Microprocessadores
Estrutura do programa e programao
Assembly com 8051
Passagem de parmetros atravs da pilha
MAIN: MOV A, #05H ; (A) = 5
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
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 )