assembly diretrizes
TRANSCRIPT
Estrutura do programa e programaoAssembly 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 binrioMicroprocessadores Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly 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. Assemblera. 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. Linkera. 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 smbolosMicroprocessadores Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly 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.srcPasso 1 (Tabela de smbolos)1. 2. (LC) =0 / ORG (LC) += length(inst) ou (LC) += length(DB/DW/DS)
LC = Location CounterUsado 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.lstPasso 21. 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 programaoAssembly com 8051
Contador de localizao (Location Counter) O assembler possui um contador de localizao para cada um dos cincos segmentos1. 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 $-TABLEMicroprocessadores Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly com 8051
Ficheiro .lst e tabela de smbolosControlos do assemblerInforma 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 assemblerOpcode 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 programaoAssembly com 8051
Saltos e chamadas genricasASM51 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 localizaesforward 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 1Microprocessadores Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly com 8051
Ficheiro .lst e tabela de smbolosTorna as subrotinas visveis a outros mdulos
Microprocessadores
Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly 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 programaoAssembly 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 programaoAssembly 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 programaoAssembly com 8051
Exemplo de ficheiro .Map criado pelo LinkerDiga 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 programaoAssembly 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 programaoAssembly com 8051
Exemplo de smbolosPAR 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 programaoAssembly 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 LSBNeste caso todos os bits do MSB devem ser iguaisCONSTANTE 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 programaoAssembly com 8051
Como especificar o endereo de um bit numa instruo?ONExplicitamente pelo endereo
EQU 0E7H 99H, $ ACC.7 224.ON 0E0H.7 TI, $ C
7
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 programaoAssembly com 8051
Bases nmericasDecimal 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 programaoAssembly com 8051
Cadeias de caractereMOVASPAS
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 programaoAssembly com 8051
Operadores de expresso
Smbolo do Operador+, -, /, * MOD
OperaoAdio, 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, GE, >= Microprocessadores
Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly com 8051ExpressoA B HIGH(0AADDH) LOW(0AADDH) 7 MOD 4 1000B SHR 2 NOT 1 A SHL 8 5 EQ 8 A LT B 3 0 A, #100 GE 50Prof. Adriano (DEI-Universidade do Minho)
Microprocessadores
Estrutura do programa e programaoAssembly com 8051Categoria Directiva para ASM51ORG
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 expressoMicroprocessadores
EQU SET DATA IDATA XDATA BIT CODE
Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly com 8051DEZ 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 programaoAssembly com 8051Categoria Directiva para ASM51DS
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 ]MicroprocessadoresAo 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 programaoAssembly com 8051PSW 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 programaoAssembly com 8051DSEG 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 programaoAssembly com 8051
Uso das directivas PUBLIC e EXTERNEXTRN 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 programaoAssembly com 8051
Uso das directivas PUBLIC e EXTERNEXTRN 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 programaoAssembly com 8051
Definio e inicializao de segmentosONCHIP 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 linkerProf. Adriano (DEI-Universidade do Minho)
Microprocessadores
Estrutura do programa e programaoAssembly 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 40HMicroprocessadores Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly com 8051 Criar um um buffer de 500 words(a partir do endereo 4000H) na RAM externa e inicializ-la com zerosEQU 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 programaoAssembly 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 nuloEndereo Contedo00h 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 programaoAssembly com 8051 Descreva o estado da memria de cdigo aps o assembler interpretar as seguintes directivas:CSEG AT 200H
DW
$, A, 1234H, 2 , BC
Endereo0200h 0201h 0202h 0203h 0204h 0205h 0206h 0207h 0208h 0209h
Contedo00h 02h 41h 00h 34h 12h 02h 00h 43h 42h
Microprocessadores
Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly com 8051
Controlos do AssemblerUsados 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 programaoAssembly com 8051
Macrostil quando uma parcela de cdigo usado repetidamente no programai. 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 8051Microprocessadores Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly 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 programaoAssembly 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 CALLMicroprocessadores Prof. Adriano (DEI-Universidade do Minho)
2. 3. 4.
Estrutura do programa e programaoAssembly com 8051
Sintaxe da Macro1. 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 programaoAssembly 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 ENDMicroprocessadores Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly com 8051
Preservao de dados1. 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 invertidasMicroprocessadores Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly 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 ENDMicroprocessadores 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 programaoAssembly com 8051
Preservao de dadosSDIV: 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 ENDMicroprocessadores Prof. Adriano (DEI-Universidade do Minho)
Estrutura do programa e programaoAssembly com 8051
MAIN:
Passagem de parmetros atravs da pilhaMOV 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
SJMPADD_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 programaoAssembly com 8051Incio: 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
Hex2AsciiConclua 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 programaoAssembly 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 R0entrada = 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