Вы находитесь на странице: 1из 43

Estrutura do programa e programao

Assembly com 8051

O que entende por linguagem assembly?


i. Apresenta um nvel de abstraco 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 Prof. Adriano (DEI-Universidade do Minho)

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. b. Traduz um programa em assembly para programa em linguagem mquina (cdigo objecto) O cdigo objecto pode estar na forma absoluta ou forma relocatable

ii. Linker
a. b. Combina vrios programas objectos na forma relocatable, produzindo um programa executvel atravs da atribuio de endereos absolutos Produz tambm um ficheiro contendo o mapa de memria e tabela de smbolos
Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

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 [controlos do assembler] Exemplo: ASM51 echo.src
Passo 1 (Tabela de smbolos)
1. 2. (LC) =0 / ORG (LC) += length(inst) ou (LC) += length(DB/DW/DS)

LC = Location Counter
Usado pelo assembler como endereo da instruo ou valor da label

ASM51

3.

SymT[...] = ( label,(LC) ) ou SymT[...] = ( symbol,(EQU) ) Echo.lst

Programa.src (echo.src)

Programa.lst
Passo 2
1. 2. Mnemnica opcode Determinao dos operandos Todos os smbolos so substitudos pelo valor na tabela de smbolos Microprocessadores Prof. Adriano (DEI-Universidade do Minho) Echo.obj

Programa.obj

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. 2. 3. 4. 5. CODE DATA IDATA BIT XDATA (0000h - FFFFH) (00H FFH)/(00H 7FH) (00H FFH)/(00H 7FH) (00H FFH)/(20H 2FH) (0000H FFFFH) (0000h) (30h) (80h) (00h) (0000h)

Cada contador de localizao inicializado com o valor zero e pode posteriormente ser alterado usando as directivas para o assembler O smbolo $ pode ser usado para especificar o valor do contador de localizao do segmento activo:
TABLE: LEN DB EQU 1,2,3,4,5,6,7,8,9 $-TABLE
Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Ficheiro .lst e tabela de smbolos


Controlos 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 programa assembler


Opcode das instrues

Pertencem a outros mdulos, e por isso s o linker pode determinar o endereo absoluto

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


Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

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 Caso contrrio, ser usado a converso para LJMP/LCALL

3.
r)

Resposta pergunta do slide anterior: sendo o salto para trs com deslocamento (offset) inferior a 128 bytes, aplica-se a condio 1
Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Ficheiro .lst e tabela de smbolos


Torna as subrotinas visveis a outros mdulos

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Ficheiro .lst e tabela de smbolos (cont.)

Reserva espao para 40 caracteres

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Qual a principal diferena entre um ficheiro objecto absoluto e um relocatable?


1. O ficheiro objecto 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

Prof. Adriano (DEI-Universidade do Minho)

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. 2. 3. Ficheiros relocatable: echo.obj, io.obj Programa executvel: example Os mdulos apresentam dois segmentos relocatable EPROM para cdigo localizado em 8000H e ONCHIP para dados localizado a partir de 30H

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

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 obtmse o opcode da instruo como sendo 12H Da tabela de smbolos do ficheiro example.M51 obtm-se o endereo absoluto de INIT como sendo 8024H Sendo CALL de 3 bytes (porqu?) a respectiva codificao seria 12 8024h

Esta tabela de smbolos aparece no ficheiro .M51 porque os ficheiros .src comeam com a directiva $DEBUG

2.

3.

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Qual o formato da linguagem assembly?


1. Um programa assembly contm os seguintes elementos:
1. 2. 3. 4. Instrues mquina Directivas para o assembler Controlos do assembler Comentrios

2. O formato genrico para cada linha o seguinte:


1.
2. 3. 4. 5.

[ smbolo ] mnemnica [operando] [,operando] [...] [;comentrio]


A mnemnica pode ser uma instruo ou uma directiva para o assembler O operando contm o endereo ou dado usado pela instruo 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 Uma etiqueta (label) um smbolo que termina obrigatoriamente com o caractere :.
Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

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

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

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 MOV ORL MOV MOV MOV MOV 100 A, #0FEH 40H, #CONSTANTE A, #0FF00H A, #00D8H A, 0FE00H A, #01FFH legal legal legal legal ilegal ilegal

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Como especificar o endereo de um bit numa instruo?


ON
Explicitamente pelo endereo

EQU 0E7H 99H, $ ACC.7 224.ON 0E0H.7 TI, $ C

SETB JNB SETB SETB SETB JNB CLR

Usando o operador .

Usando um smbolo pr-definido

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Bases nmericas
Decimal Binrio Octal MOV MOV MOV A, #15 A, #15D #1111B A, #17Q A, #17O A, #0FH A, #0A5H A, #A5H?
Microprocessadores

MOV MOV Hexadecimal MOV MOV MOV

Para diferenciar um dado hexadecimal imediato de um smbolo

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Cadeias de caractere
MOV
ASPAS

A, #m 8051 A, #Q, AGUARDE A, #0 DPTR, #AB DPTR, #4142H

carrega A com 06Dh, valor do ASCII m Define ASPAS como sendo 22h Armazenar na memria de cdigo 8, 0, 5,1 Fica a espera que (A) seja do caractere Q Converte dgito ASCII para dgito binrio Ambas as instrues carregam o DPTR com a cadeia de caractere AB

EQU DB

AGUARDE:

CJNE SUBB MOV MOV

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Operadores de expresso

Smbolo do Operador
+, -, /, * MOD

Operao
Adio, subtraco Diviso, multiplicao Resto da diviso Ou-lgico E-lgico Ou-exclusivo Complemento Rodar direita Rodar esquerda Obter o MSB Obter o LSB Igual a Diferente Menor que Menor ou igual Maior que Maior ou igual

Precedncia do Operadores
() HIGH, LOW * , /, MOD, SHL, SHR +, EQ, NE, LT, LE, GT, GE, =, <>, <, <=, >, >= NOT AND OR, XOR Operadores com mesma precedncia so avaliados da esquerda para direita

OR AND XOR NOT SHR SHL HIGH LOW

EQ, = NE, <> LT, < LE, <=


GT, > GE, >= Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051
Expresso
A B HIGH(0AADDH) LOW(0AADDH) 7 MOD 4 1000B SHR 2 NOT 1 A SHL 8 5 EQ 8 A LT B 3 <= 3 -1 7 NE 4 ou 7<>4 1101B XOR 0101B HIGH(A SHL 8) HIGH A SHL 8 A OR A SHL 8 NOT A 1

Resultado
0001H 0AAH 0DDH 3 0010B 0FFFEH 4100H 0000H 0FFFFH 0FFFFH 0FFFFH 0FFFFH 1000B 0041H 0000H 4141H 0FFBFH

TRES MTRES

EQU EQU MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV

3 -3 A, #10 + 10H A, #1AH A, #25 MOD 7 A, #4 A, #9 AND 0FH A, #9 A, # (NOT TRES) + 1 A, #MTRES A, #11111101B A, #8 SHL 1 A, #10H A, #12H A, #HIGH 1234H A, #5 = 5 A, #$ > 0 A, #100 GE 50
Prof. Adriano (DEI-Universidade do Minho)

Microprocessadores

Estrutura do programa e programao


Assembly com 8051
Categoria Directiva para ASM51
ORG

Sntaxe

Funo

Controlo do estado

ORG END USING

expresso

Especifica um valor para contador de localizao do segmento activo Indica ao assembler o fim do programa fonte

END USING

expresso

Indica ao assembler o banco de registo usado no cdigo que vem a seguir directiva. Repare que a comutao do banco de registo deve ser efectuada usando apenas instrues do 8051 Declara um smbolo como sendo um segmento relocatable de um dado tipo. Para comear a usar o segmento, deve-se usar a directiva RSEG Atribu um valor a um smbolo Igual ao EQU, exceptuando o facto de permitir a redefinio o smbolo Atribui ao smbolo um endereo directo da RAM interna Atribui um endereo indirectamente enderevel da RAM interna ao smbolo Atribui ao smbolo um endereo da memria externa Atribu um endereo directo da rea de memria enderevel ao bit a um smbolo Atribu um endereo da memria de cdigo ao smbolo

Definio de smbolos

SEGMENT

Smbolo Smbolo Smbolo Smbolo Smbolo Smbolo Smbolo Smbolo

SEGMENT EQU SET DATA IDATA XDATA BIT CODE

tipo_de_segmento expresso expresso expresso expresso expresso expresso expresso


Microprocessadores

EQU SET DATA IDATA XDATA BIT CODE

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051
DEZ CONTADOR NOVO_DEZ CINCO A_REG ASCII_D HERE EPROM APONTADOR APONTADOR VALOR VALOR CF OFF_FLAG ON_FLAG RESET EXIT0 EQU EQU EQU EQU EQU EQU EQU SEGMENT SET SET SET SET BIT BIT BIT CODE CODE 10 R7 DEZ DEZ / 2 A D $ CODE R0 R1 1 VALOR + 1 0D7H 6 OFF_FLAG + 1 0 RESET + (1024/16)
; O smbolo DEZ passa a ser uma constante de valor 10 ; INC R7 pode agora ser substitudo por INC CONTADOR ; smbolo atribudo o valor de outro smbolo j definido ; smbolo atribudo o valor de uma expresso aritmtica ; A_REG pode ser usado legalmente onde A normalmente usado ; smbolo atribudo o valor do caractere ASCII D ; valor do contador de localizao atribudo ao smbolo ; declarao do smbolo como sendo um segmento de cdigo ; endereo de R0 atribudo ao smbolo ; redefinio de APONTADOR para registo R1 ;Inicializao de um smbolo varivel com valor 1 ; incremento do contedo do smbolo VALOR ; smbolo apontado para a flag carry no registo PSW ; endereo de memria atribudo a uma flag ; o prximo bit uma outra flag ; atribuio de um endereo de cdigo a um smbolo ; atribuio de um endereo de cdigo atravs de uma expresso

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Jump

Estrutura do programa e programao


Assembly com 8051
Categoria Directiva para ASM51
DS

Sntaxe

Funo

Incializao e reserva de armazenamento

[LABEL:]

DS

expresso

Reserva espaos em mltiplos de bytes. No pode ser utilizado com segmento do tipo BIT. O valor da expresso deve ser conhecida pelo assembler Reserva espaos em mltiplos de bits. O valor da expresso deve ser conhecida pelo assembler Inicializa a memria de cdigo com valores do tipo byte/word Define uma lista de smbolos que tornam visveis e utilizveis a partir de outros mdulos 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 um especial designado por NUMBER que especifica um smbolo definido por EQU

DBIT

[LABEL:] [LABEL:]

DBIT DB/DW PUBLIC EXTRN

expresso expresso Smbolo [, smbolo ] [...] Tipo_segmento(smbolo [,smbolo] [...], ...)

DB/DW Program linkage PUBLIC

EXTRN

NAME Seleco de Segmentos RSEG CSEG ... XSEG

NAME RSEG CSEG DSEG XSEG

Nome_do_mdulo Nome_do_segmento [ AT endereo ] [ AT endereo ] [ AT endereo ]


Microprocessadores
Ao encontrar uma directiva de seleco de segmento, o assembler direcciona o cdigo ou dado que lhe segue para o segmento seleccionado at que seja seleccionado um outro segmento

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051
PSW BUFFER FREE_SPACE USER_BASE HOST_BASE DATA DATA DATA XDATA XDATA ORG ORG ORG USING USING ORG DSEG BSEG XSEG AT 32 AT (USER_BASE *5) MOD 16 0D0H 32 BUFFER + 6 2048 USER_BASE+100h 1000H RESET BASE + MODULE_NO 0 1+1+1 ($ + 1000H) AND 0F000H
;define o endereo do registo de estado do programa ; definio de um endereo na RAM interna ; definio de endereo usando expresso aritmtica ; definio de um endereo na memria externa ; definio de endereo usando expresso aritmtica ; actualizao do contador de localizaes do segmento ;activa com 4096 ; actualizao do contador de localizao com o valor do ;smbolo j definido ; actualizao do LC usando expresso aritmtica ; seleco dos endereos do banco de registo 0 ; seleco dos endereos do banco de registo 3 atravs de ;expresso aritmtica ; actualizao do LC para a prxima fronteira de 4K ; selecciona o segmento absoluto de dado directamente ;enderevel (DATA) usando o valor do LC actual ; Selecciona o segmento de dado enderevel a bit ;(BITDATA) e actualiza o LC com 32 ; Selecciona o segmento absoluto de dado externo ;(XDATA) e usa uma expresso aritmtica para actualizar ;o LC

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051
DSEG DS SP_BUFFER: IO_BUFFER: DS DS BSEG DBIT IO_MAP: MENSAGEM: RUNTIME_CONST: DB DB MIXED: JUMP_TABLE DB DW DW RADIX: DW 127, 13, 64, 0, 99 17, 32, 239, 163, 49 2*8, MPG, 2+6, ABC RESET, START, END TRUE, TEST, FALSE H, 1000H
; tabela de constantes ; a label opcional ; pode-se misturar nmeros com caracteres ASCII ; tabela de endereos ; label opcional ; 1byte=0, 2byte=48h, 3byte=10h, 4byte=0 ; selecciona o segmento absoluto de dado (DATA)

32 16 8

; repare que a label opcional ; reserva um buffer de 16 bytes para a comunicao srie ; reserva um buffer de 8 bytes para a entrada/sada ; selecciona o segmento absoluto enderevel a bit

16 32 (c) Copyright, 1984

; a label opcional ; reserva um buffer de 32 bit para operaes de entrada/sada ; cadeia de caractere

DBIT DB

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Uso das directivas PUBLIC e EXTERN


EXTRN EXTRN PUBLIC FLAG EQU ... CALL ... CALL ... END CODE (HELLO, GOODBYE) DATA (BUF) FLAG 10H ... HELLO ... GOODBYE ...
; declarao de subrotinas externas ; declarao de um dado externo ; torna o smbolo FLAG visvel e utilizvel noutros mdulos ; definio de uma constante com valor 10h

; invocar a subrotina HELLO a partir do mdulo 2

; invocar a subrotina GOODBYE a partir do mdulo 2

; selecciona o segmento absoluto enderevel a bit

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Uso das directivas PUBLIC e EXTERN


EXTRN PUBLIC ... HELLO: MOV ... RET NUMBER (FLAG) HELLO, GOODBYE, BUF ... A, #FLAG ...
; declarao de uma constante externa ; torna as subrotinas e o buffer visveis e utilizveis ;noutros mdulos

; incio da subrotina HELLO

; concluso da subrotina HELLO

GOODBYE:

CLR ... RET

C ...

; incio da subrotina GOODBYE

; concluso da subrotina GOODBYE ; ; fim do mdulo

BUF:

DS END

10H

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Definio e inicializao de segmentos


ONCHIP EPROM SEGMENT SEGMENT BSEG FLAG1: FLAG2: TOTAL: COUNT: SUM: BEGIN: DBIT DBIT RSEG DS DS DS RSEG MOV ... END DATA CODE AT 1 2 ONCHIP 1 1 2 EPROM TOTAL, #0 ... 70H
; declarao de um segmento de dado relocatable ; declarao de um segmento de cdigo relocatable ; inicializao de 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) ; FLAG1 um bit enderevel pelo endereo 70h ; FLAG2 enderevel pelo endereo 71h ;inicializao do segmento relocatable ONCHIP ; label que aponta para localizao enderevel ao byte. Qual o endereo? ; label que aponta para localizao enderevel ao byte. Qual o endereo? ; label para uma localizao enderevel a Word. Qual o endereo? ; inicializao de do segmento relocatable EPROM ; Qual o endereo da label BEGIN?

; fim do mdulo

Sendo este smbolos definidos em segmentos relocatable, s sero estabelecidos pelo linker
Prof. Adriano (DEI-Universidade do Minho)

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:
DSEG LEN EQU CSEG AT MOV MOV LOOP: MOV DJNZ ... END BUFFER: DS AT 40H 40 LEN 0 R7, #LEN R0, #BUFFER @R0, #a R7, LOOP
; inicializao do segmento de dado interno (DATA) a partir do endereo 40H ; smbolo constante com a dimenso do buffer ; 40 bytes so reservadas a partir do endereo 40h do segmento DATA

; usa R7 como o contador de posies a inicializar ; aponta R0 para a primeira posio do buffer ;escrever no endereo apontado por R0 actualmente, o caractere a ; j atingiu a ltima posio? Se no, ento continua a preencher ; caso contrrio, acabou ; fim do mdulo

Apresente uma alternativa para a colocao do buffer a partir do endereo 40H?

Basta substituir a primeira linha por DSEG ORG 40H


Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

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
EQU EQU XSEG BUFFER: DS CSEG MOV CLR LOOP: MOV INC MOV CJNE MOV CJNE ... END 4000H 1000 AT ADDR LEN AT 0000H DPTR, # BUFFER A @DPTR, A DPTR A, DPL A, #LOW(BUFFER + LEN +1), LOOP A, DPH A, #HIGH(BUFFER + LEN +1), LOOP
; apontar para o incio do buffer a zerar ; preparar o caractere de inicializao no acumulador ; zerar a posio do buffer actualmente apontada por DPTR ; aponta para a prxima posio ;aps preencher a ltima posio do buffer dptr apontar ; uma posio abaixo. Como no existe uma instruo para ;comparar dados de 16-bits, torna-se necessrio efectuar a ;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 ; fim do mdulo ;inicializao de uma constante com o endereo do buffer ; inicializao de uma constante com a dimenso do buffer ;(500 words) ; inicializao do segmento absoluto XDATA ; alocao de espao para as 500 words

ADDR LEN

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

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 directivas:
CSEG AT 0100H ;quadrados dos nmeros 0-5 ;string terminado com caractere nulo
Endereo Contedo
00h 01h 04h 09h 10h 19h 4Ch 6Fh 67h 69h 6Eh 3Ah 00h

SQUARES: DB MESSAGE: DB

0, 1, 4, 9, 16, 25 Login: , 0

L = A + 0Ch 01h = 4Ch o = a + 0Fh 01h = 6Fh ....

0100h 0101h 0102h 0103h 0104h 0105h 0106h 0107h 0108h 0109h 010Ah 010Bh 010Ch

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051
Descreva o estado da memria de cdigo aps o assembler interpretar as seguintes directivas:
CSEG AT 200H

DW

$, A, 1234H, 2 , BC

Endereo
0200h 0201h 0202h 0203h 0204h 0205h 0206h 0207h 0208h 0209h

Contedo
00h 02h 41h 00h 34h 12h 02h 00h 43h 42h

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Controlos do Assembler
Usados para controlar:
onde o assembler obtm os ficheiros de entrada onde colocar os ficheiros objectos como formatar os ficheiros de listagem

Controlos do assembler
$DATE(data) $TITLE(string) $PAGING $PAGEWIDTH(n) $SYMBOLS $NOPRINT $DEBUG $EJECT $ERRORPRINT(file) $MOD51 $LIST ... Coloca a data no cabealho da pgina Coloca uma cadeia de caracteres no cabealho da pgina Dividir o ficheiro de listagem em vrias pginas Especifica o nmero de colunas (caracteres por linha) numa pgina de listagem Cria uma tabela formatada de smbolos usada no programa Impede a criao de ficheiros de listagem Escreve informao sobre smbolo de depurao nos ficheiros objectos Continua a listagem na prxima pgina Especifica um ficheiro para as MSGs de erros Reconhece os SFR pr-definidos para o 8051 Escreve cada linha do ficheiro de cdigo assembly no ficheiro de listagem ...

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

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 Prof. Adriano (DEI-Universidade do Minho)

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

Prof. Adriano (DEI-Universidade do Minho)

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 PC ser carregado com o endereo inicial da subrotina A subrotina executada 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 Prof. Adriano (DEI-Universidade do Minho)

2. 3. 4.

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 Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Exemplos de Macro
%*DEFINE (PUSH_DPTR) ( PUSH DPH PUSH DPL )

%*DEFINE (DEC_DPTR) LOCAL SKIP (DEC DPL MOV A, DPL CJNE A, #0FFH, %SKIP DEC DPH %SKIP:)

%*DEFINE (CMP_NUM (VALOR) ) (CJNE A, #%VALOR, $+3) %*DEFINE (JGT (VALOR, SALTO) ) (CJNE A, #%VALOR+1, $+3 JNC %SALTO)
CJNE uma instruo de 3 bytes

... START: MOV A, #3 %CMP_NUM (20) JNC MAIOR JMP $ MAIOR: MOV A, #0FFH END
Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Preservao de dados
1. Deve-se sempre salvaguardar o contedo dos registos 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 Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

Preservao de dados
%*DEFINE (DEC_DPTR) LOCAL SKIP ( PUSH ACC DEC DPL MOV A, DPL CJNE A, #0FFH, %SKIP DEC DPH POP ACC %SKIP:) START: MOV DPTR, #10F4H MOVX A, @DPTR %DEC_DPTR ADD A, #3 END
Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

Salvaguarda e restaurao de contexto

Pretende-se efectuar (A) = (10F4H) + 3 e de seguida apontar DPTR para 10F3H. Ser?

Estrutura do programa e programao


Assembly com 8051

Preservao de dados
SDIV: Salvaguarda e restaurao de contexto PUSH ACC PUSH 0F0H DIV AB ADD A, #2 MOV R0, A POP 0F0H POP ACC RET

(A) = 9 (B) = 3 Pretende-se efectuar (R0) = 2 + (A) / 3 = 5 e 12 = (A) = (A) + (B). Ser?

START: MOV A, #9 MOV B, #3 CALL SDIV ADD A, 0F0H END


Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051

MAIN:

Passagem de parmetros atravs da pilha


MOV MOV PUSH CALL POP A, #05H B, #4H 0F0H ADD_IT 00H $
; (A) = 5 ; (B) = 4 ; salvaguarda o contedo de B ; invoca a subrotina ; (R0) = (A) + (B) SP

Pilha

SJMP
ADD_IT: MOV DEC DEC ADD XCH RET

; acabou e fica pendurado nesta instruo

R0, SP R0 R0 A, B A, @R0

; carrega R0 com o apontador do topo da pilha ; aponta para a posio aps o endereo de R0 ; retorno ; (A) = (A) + (B) ; troca o contedo de A com o de ((R0)) ; retorna a main SP R0 SP SP SP MSB(PCpop) LSB(PCpop) 04H / 09H

Microprocessadores

Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


Assembly com 8051
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))

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 registo B. Deve invocar uma subrotina que recebe o parmetro e devolve o resultado via pilha.
Incio

(A) Letra? Sim

No

Salvaguarda B e R0 ( (++SP) ) = (B) ( (++SP) ) = (R0) MAIN: PUSH PUSH CALL 0F0H ; salvaguarda (B) 00H ; salvaguarda (R0) H2Ascii ; converta o
; dgito Hexdecimal

Ajustar Offset para letras


(A) = (A) + ASCII A ASCII 0 -10

Hex2Ascii
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 --) ) Restaura (R0) e (B) (R0) = ( (SP - -) ) (B) = ( (SP --) ) JMP $ POP POP 00H

; restaura (R0)

0F0H ; coloca em B o
;valor convertido ; acabou

Fim

Fim Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

Estrutura do programa e programao


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

PUSH MOV DEC DEC DEC MOV CJNE JNC JMP

ACC R0, SP R0 R0 R0 A, @R0 A, #10, $+3 LETRA GUARDA A, # (A - 0 - 10) A, #0 R0 @R0, A ACC

; salvaguardar o (A) ; 1 apontar R0 para topo da pilha ; e depois aponta-o para ; o valor a converter localizado ; aps o endereo de retorno ; carregar A com o valor a converter ; verificar se letra ou dgito ; sendo letra, vai ajustar o offset ; sendo dgito no precisa ajustar o offset, apenas vai concluir a converso ; ajustar o offset no caso de letra ; concluir a converso tanto para letra como dgito ; apontar R0 para a localizao da pilha onde foi salvaguadado B ; guardar o valor convertido nesta localizao ; restaurar o (A) ; retornar ao main Microprocessadores Prof. Adriano (DEI-Universidade do Minho)

LETRA: GUARDA:

ADD ADD DEC MOV POP RET

Вам также может понравиться