sub-rotinas

Propaganda
Sistemas
Embarcados:
Microcontroladores
Prof. Protásio
Laboratório de Microengenharia/DEE/CEAR/UFPB
Sub-rotinas
8051
Sub-rotina
▪ É uma sequência de instruções com uma
finalidade específica.
▪ O uso de sub-rotinas possibilita:
▪ Modularizar o programa
▪ Facilitar o reaproveitamento de programa
▪ Facilitar a manutenção de programa
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
3
Sub-rotina
▪ As sub-rotinas são utilizadas para evitar
trechos repetitivos de rotinas dentro do
programa principal
Com sub-rotina
:
:
Raiz
Programa
Principal
Programa
Principal
Raiz
Raiz
Raiz
:
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
:
Raiz
4
Sub-rotina
▪ Sub-rotinas são armazenadas em uma
faixa de endereço separada da faixa do
programa principal
0000H
:
0030H
Programa
Principal
:
Sub-rotinas
FFFFH
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
:
5
Sub-rotina
▪ Instruções de chamada de sub-rotina
▪ ACALL <endereço inicial da sub-rotina de 11 bits>
▪ LCALL <endereço inicial da sub-rotina de 16 bits >
▪ Instrução de retorno de sub-rotina
▪ RET
Programa
Principal
:
ORG 100H
:
LCALL RAIZ
:
END
RAIZ:
Sub-rotina
:
RET
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
6
Sub-rotina X Sub-rotina de tratamento de
interrupção (STI)
▪ Sub-rotina
▪ Sempre chamada por SW
▪ ACALL, LCALL e finalizada por RET
▪ Sub-rotina de tratamento de interrupção
▪ Chamada por uma interrupção
▪ Após a interrupção, opera de maneira similar ao
tratamento de uma sub-rotina
▪ Interrompe o programa e chama a STI específica
▪ O endereço da STI depende do tipo da interrupção
▪ A STI finaliza com RETI
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
7
Sub-rotina
▪ Operação das instruções ACALL e LCALL
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
8
Sub-rotina
▪ Operação da instrução RET
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
9
Estrutura de um programa Assembly
Início
Definição das subrotinas
Início do programa principal:
Inicialização de variáveis e configurações de
hardware
Laço do programa principal
:
Jump incondicional para o início do laço
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
10
Estrutura de um programa Assembly
;Definição das sub-rotinas
ADDR1: sub-rotina 1
:
ret
:
ADDR2: sub-rotina N
:
ret
;Inicialização de variáveis e configurações de hardware
INICIO: instrução 1
:
instrução j
; Laço do programa principal
LOOP: instrução 1
:
instrução k
call ADDR1
:
call ADDRN
:
jmp LOOP
END
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
11
Exemplo 1
▪ Programa que calcula a quantidade de valores iguais a FFH na faixa de
memória de 60H a 64H e salva o resultado na posição 65H.
ORG
0000H
LJMP
INICIO
; Pula para INICIO
;Subrotina que calcula a quantidade de FFH
ORG 070H
SUB1:
mov
R0,#60H ; endereço inicial da faixa de memória (buffer)
mov
R1,#05H ; Quantidade de elementos do buffer
mov
65H,#00 ; Zera a posição de memória 65H
ADR2:
clr
C
; Zera carry (C) para não influenciar na subtração
mov
A,@R0 ; A  elemento do buffer
subb
A,#0FFH ; A  A – FFH
jnz
ADR1
; Se A ≠ 0, pula para ADR1
inc
65H
; Se A = 0, incrementa o dado em 65H
ADR1:
inc
R0
; próxima posição do buffer
djnz
R1, ADR2 ; decrementa e pular para ADR2 se ≠ 0
ret
; retorna da sub-rotina
; Programa Principal
ORG 100H
INICIO: mov
PSW,#00H ; Zera o PSW
mov
SP, #30H ; Define o Stack Point para 70H
ACALL
SUB1
; Chama a subrotina SUB1
mov
A, 65H
; Salva o resultado em A
END
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
12
Exemplo 1
▪ Programa que soma os valores da faixa de memória de 40H a 50H e salva o
resultado na posição 51 e 52H.
ORG
0000H
LJMP
INICIO
; Pula para INICIO
;Subrotina de soma de 16 bits
ORG 050H
SOMA:
mov
R0,#40H ; endereço inicial do buffer
mov
R1,#11H ; Quantidade de elementos do buffer a serem somados ( = 50H – 40H +1)
mov
A,#00
; Zera A
mov
52H,A
; Zera endereço 52H dos dados mais significativos do resultado
ADR2:
add
A,@R0 ; A  A + @R0
jnc
ADR1
; Se C ≠ 0 (não ocorreu Carry), pula para ADR1
inc
52H
; Se C = 0, incrementa o valor em 52H (parte mais significativa do resultado)
ADR1:
inc
R0
; próxima posição do buffer
djnz
R1, ADR2 ; decrementa e pular para ADR2 se ≠ 0
mov
51H,A
; salva a parte menos significativa do resultado
ret
; retorna da sub-rotina
; Programa Principal
ORG 100H
INICIO: mov
PSW,#00H ; Zera o PSW
mov
SP, #30H ; Define o Stack Point para 70H
ACALL
SOMA
; Chama a subrotina SOMA
END
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
13
Exercícios
▪ Modifique os programas dos exercícios da
última aula para que as operações de
saída para LEDs ou Display sejam subrotinas
Prof. Protásio / Laboratório de Microengenharia/DEE/CEAR/UFPB
14
Download