Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Instruções de Assembly Microcontroladores: Descrição e Sintaxe, Notas de estudo de Engenharia Elétrica

Uma descrição e sintaxe de várias instruções de assembly para microcontroladores. As instruções abrangem operações aritméticas, lógicas, de controle de flags, de entrada/saída e de manipulação de registros. Além disso, é fornecido um exemplo para cada instrução, explicando o resultado obtido após a execução.

Tipologia: Notas de estudo

2011

Compartilhado em 12/01/2011

jurandir-goncalves-9
jurandir-goncalves-9 🇧🇷

1 documento

1 / 14

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Microcontroladores PIC
on-line GRÁTIS!
Indice
Sistema de desenvolvimento
Contacte-nos
Apêndice A
Conjunto de Instruções
A.1 MOVLW Escrever constante no registo W
A.2 MOVWF Copiar W para f
zA.1 MOVLW
zA.2 MOVWF
zA.3 MOVF
zA.4 CLRW
zA.5 CLRF
zA.6 SWAPF
zA.7 ADDLW
zA.8 ADDWF
zA.9 SUBLW
zA.10 SUBWF
zA.11 ANDLW
zA.12 ANDWF
zA.13 IORLW
zA.14 IORWF
zA.15 XORLW
zA.16 XORWF
zA.17 INCF
zA.18 DECF
zA.19 RLF
zA.20 RRF
zA.21 COMF
zA.22 BCF
zA.23 BSF
zA.24 BTFSC
zA.25 BTFSS
zA.26 INCFSZ
zA.27 DECFSZ
zA.28 GOTO
zA.29 CALL
zA.30 RETURN
zA.31 RETLW
zA.32 RETFIE
zA.33 NOP
zA.34 CLRWDT
zA.35 SLEEP
Sintaxe: [rótulo] MOVLW k
Descrição: A constante de 8-bits k vai para o registo W.
Operação: k ( W )
Operando: 0 k 255
Flag: -
Número de palavras: 1
Número de ciclos: 1
Exemplo 1: MOVLW 0x5A
Depois da instrução: W= 0x5A
Exemplo 2: MOVLW REGISTAR
Antes da instrução: W = 0x10 e REGISTAR = 0x40
Depois da instrução: W = 0x40
Sintaxe: [rótulo] MOVWF f
Descrição: O conteúdo do registo W é copiado para o registo f
Operação: W ( f )
Operando: 0 f 127
Flag: -
Número de palavras: 1
Número de ciclos: 1
Exemplo 1: MOVWF OPTION_REG
Antes da instrução: OPTION_REG = 0x20
W = 0x40
Depois da instrução: OPTION_REG = 0x40
W = 0x40
Exemplo 2: MOVWF INDF
Antes da instrução: W = 0x17
FSR = 0xC2
Conteúdo do endereço 0xC2 = 0x00
Depois da instrução: W = 0x17
FSR = 0xC2
g
ina 1 de 14A
p
êndice A - Con
j
unto de Instruções
12/8/2003http://www.i-magazine.com.br
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe

Pré-visualização parcial do texto

Baixe Instruções de Assembly Microcontroladores: Descrição e Sintaxe e outras Notas de estudo em PDF para Engenharia Elétrica, somente na Docsity!

Microcontroladores PIC

on-line GRÁTIS!

Indice Sistema de desenvolvimento Contacte-nos

Apêndice A

Conjunto de Instruções

A.1 MOVLW Escrever constante no registo W

A.2 MOVWF Copiar W para f

z A.1 MOVLW z A.2 MOVWF z A.3 MOVF z A.4 CLRW z A.5 CLRF z A.6 SWAPF z A.7 ADDLW z A.8 ADDWF z A.9 SUBLW

z A.10 SUBWF z A.11 ANDLW z A.12 ANDWF z A.13 IORLW z A.14 IORWF z A.15 XORLW z A.16 XORWF z A.17 INCF z A.18 DECF

z A.19 RLF z A.20 RRF z A.21 COMF z A.22 BCF z A.23 BSF z A.24 BTFSC z A.25 BTFSS z A.26 INCFSZ z A.27 DECFSZ

z A.28 GOTO z A.29 CALL z A.30 RETURN z A.31 RETLW z A.32 RETFIE z A.33 NOP z A.34 CLRWDT z A.35 SLEEP

Sintaxe: [rótulo] MOVLW k Descrição: A constante de 8-bits k vai para o registo W.

Operação: k ⇒ ( W )

Operando: 0 ≤ k ≤ 255

Flag: - Número de palavras: 1 Número de ciclos: 1 Exemplo 1: MOVLW 0x5A Depois da instrução: W= 0x5A Exemplo 2: MOVLW REGISTAR Antes da instrução: W = 0x10 e REGISTAR = 0x Depois da instrução: W = 0x

Sintaxe: [rótulo] MOVWF f Descrição: O conteúdo do registo W é copiado para o registo f

Operação: W ⇒ ( f )

Operando: 0 ≤ f ≤ 127

Flag: - Número de palavras: 1 Número de ciclos: 1 Exemplo 1: MOVWF OPTION_REG Antes da instrução: OPTION_REG = 0x W = 0x Depois da instrução: OPTION_REG = 0x W = 0x Exemplo 2: MOVWF INDF Antes da instrução: W = 0x FSR = 0xC Conteúdo do endereço 0xC2 = 0x Depois da instrução: W = 0x FSR = 0xC

A.3 MOVF Copiar f para d

A.4 CLRW Escrever 0 em W

A.5 CLRF Escrever 0 em f

Conteúdo do endereço 0xC2 = 0x

Sintaxe: (^) [rótulo] MOVF f, d Descrição: O conteúdo do registo f é guardado no local determinado pelo operando d Se d = 0 , o destino é o registo W Se d = 1 , o destino é o próprio registo f A opção d = 1 , é usada para testar o conteúdo do registo f , porque a execução desta instrução afecta a flag Z do registo STATUS.

Operação: f ⇒ ( d )

Operando: 0 ≤ f ≤ 127, d ∈ [0, 1]

Flag: (^) Z Número de palavras: (^) 1 Número de ciclos: (^) 1 Exemplo 1: MOVF FSR, 0 Antes da instrução: FSR = 0xC W = 0x Depois da instrução: W = 0xC Z = 0 Exemplo 2: MOVF INDF, 0 Antes da instrução: W = 0x FSR = 0xC conteúdo do endereço 0xC2 = 0x Depois da instrução: W = 0x FSR = 0xC conteúdo do endereço 0xC2 = 0x Z = 1

Sintaxe: [rótulo] CLRW Descrição: O conteúdo do registo W passa para 0 e a flag Z do registo STATUS toma o valor 1.

Operação: 0 ⇒ ( W )

Operando: - Flag: Z Número de palavras: 1 Número de ciclos: 1 Exemplo: CLRW Antes da instrução: W = 0x Depois da instrução: W = 0x Z = 1

Sintaxe: [rótulo] CLRF f Descrição: O conteúdo do registo ‘f’ passa para 0 e a flag Z do registo STATUS toma o valor 1.

Operação: 0 ⇒ f

Operando: 0 ≤ f ≤ 127

A.8 ADDWF Adicionar W a f

A.9 SUBLW Subtrair W a uma constante

A.10 SUBWF Subtrair W a f

Sintaxe: [rótulo] ADDWF f , d Descrição: Adicionar os conteúdos dos registos W e f Se d=0 , o resultado é guardado no registo W Se d=1 , o resultado é guardado no registo f

Operação: ( W) + ( f ) ⇒ d, d ∈ [0, 1]

Operando: 0 ≤ f ≤ 127

Flag: C, DC, Z Número de palavras: 1 Número de ciclos: 1 Exemplo 1: ADDWF FSR, 0 Antes da instrução: W = 0x FSR = 0xC Depois da instrução: W = 0xD FSR = 0xC Exemplo 2: ADDWF INDF, Antes da instrução: W = 0x FSR = 0xC conteúdo do endereço 0xC2 = 0x Depois da instrução: W = 0x FSR = 0xC Conteúdo do endereço 0xC2 = 0x

Sintaxe: [rótulo] SUBLW k Descrição: O conteúdo do registo W , é subtraído à constante k e, o resultado, é guardado no registo W.

Operação: k - ( W ) ⇒ W

Operando: 0 ≤ k ≤ 255

Flag: C, DC, Z Número de palavras: 1 Número de ciclos: 1 Exemplo 1: SUBLW 0x Antes da instrução: W= 0x01, C = x, Z = x Depois da instrução: W= 0x02, C = 1, Z = 0 Resultado > 0 Antes da instrução: W= 0x03, C = x, Z = x Depois da instrução: W= 0x00, C = 1, Z = 1 Resultado = 0 Antes da instrução: W= 0x04, C = x, Z = x Depois da instrução: W= 0xFF, C = 0, Z = 0 Resultado < 0 Exemplo 2: SUBLW REG Antes da instrução: W = 0x REG = 0x Depois da instrução: W = 0x C = 1 Resultado > 0

Sintaxe: [rótulo] SUBWF f , d Descrição: O conteúdo do registo W é subtraído ao conteúdo do registo f Se d=0 , o resultado é guardado no registo W Se d=1 , o resultado é guardado no registo f

A.11 ANDLW Fazer o “E” lógico de W com uma constante

A.12 ANDWF Fazer o “E” lógico de W com f

Operação: ( f ) - ( W) ⇒ d

Operando: 0 ≤ f ≤ 127 , d ∈ [0, 1]

Flag: C, DC, Z Número de palavras: 1 Número de ciclos: 1 Exemplo: SUBWF REG, 1 Antes da instrução: REG= 3, W= 2, C = x, Z = x Depois da instrução: REG= 1, W= 2, C = 1, Z = 0 Resultado > 0 Antes da instrução: REG= 2, W= 2, C = x, Z = x Depois da instrução: REG=0, W= 2, C = 1, Z = 1 Resultado = 0 Antes da instrução: REG=1, W= 2, C = x, Z = x Depois da instrução: REG= 0xFF, W=2, C = 0, Z = 0 Resultado < 0

Sintaxe: [rótulo] ANDLW k Descrição: É executado o “E” lógico do conteúdo do registo W , com a constante k O resultado é guardado no registo W.

Operação: ( W ) .AND. k ⇒ W

Operando: 0 ≤ k ≤ 255

Flag: Z Número de palavras: 1 Número de ciclos: 1 Exemplo 1: ANDLW 0x5F Antes da instrução: W= 0xA3 ; 0101 1111 (0x5F) ; 1010 0011 (0xA3) Depois da instrução: W= 0x03; 0000 0011 (0x03) Exemplo 2: ANDLW REG Antes da instrução: W = 0xA3 ; 1010 0011 (0xA3) REG = 0x37 ; 0011 0111 (0x37) Depois da instrução: W = 0x23 ; 0010 0011 (0x23)

Sintaxe: [rótulo] ANDWF f , d Descrição: Faz o “E” lógico dos conteúdos dos registos W e f Se d=0 , o resultado é guardado no registo W Se d=1 , o resultado é guardado no registo f

Operação: ( W) .AND. ( f ) ⇒ d

Operando: 0 ≤ f ≤ 127 , d ∈ [0, 1]

Flag: Z Número de palavras: 1 Número de ciclos: 1 Exemplo 1: ANDWF FSR, 1 Antes da instrução: W= 0x17, FSR= 0xC2; 0001 1111 (0x17) ; 1100 0010 (0xC2) Depois da instrução: W= 0x17, FSR= 0x02 ; 0000 0010 (0x02) Exemplo 2: ANDWF FSR, 0 Antes da instrução: W= 0x17, FSR= 0xC2; 0001 1111 (0x17) ; 1100 0010 (0xC2) Depois da instrução: W= 0x02, FSR= 0xC2; 0000 0010 (0x02)

A.16 XORWF “OU-EXCLUSIVO” de W com f

A.17 INCF Incrementar f

Depois da instrução: W= 0x1A; 0001 1010 (0x1A) Exemplo 2: XORLW REG Antes da instrução: W = 0xAF ; 1010 1111 (0xAF) REG = 0x37 ; 0011 0111 (0x37) Depois da instrução: W = 0x98 ; 1001 1000 (0x98) Z = 0

Sintaxe: [rótulo] XORWF f , d Descrição: Faz o “OU-EXCLUSIVO” dos conteúdos dos registos W e f Se d=0 , o resultado é guardado no registo W Se d=1 , o resultado é guardado no registo f

Operação: ( W) .XOR. ( f ) ⇒ d

Operando: 0 ≤ f ≤ 127, d ∈ [0, 1]

Flag: Z Número de palavras: 1 Número de ciclos: 1 Exemplo 1: XORWF REG, 1 Antes da instrução: REG= 0xAF, W= 0xB5 ; 1010 1111 (0xAF) ; 1011 0101 (0xB5) Depois da instrução: REG= 0x1A, W= 0xB5 001 1010 (0x1A) Exemplo 2: XORWF REG, 0 Antes da instrução: REG= 0xAF, W= 0xB5; 1010 1111 (0xAF) ; 1011 0101 (0xB5) Depois da instrução: REG= 0xAF, W= 0x1A ; 0001 1010 (0x1A)

Sintaxe: [rótulo] INCF f , d Descrição: Incrementar de uma unidade, o conteúdo do registo f. Se d=0 , o resultado é guardado no registo W Se d=1 , o resultado é guardado no registo f

Operação: ( f ) + 1 ⇒ d

Operando: 0 ≤ f ≤ 127, d ∈ [0, 1]

Flag: Z Número de palavras: 1 Número de ciclos: 1 Exemplo 1: INCF REG, 1 Antes da instrução: REG = 0xFF Z = 0 Depois da instrução: REG = 0x Z = 1 Exemplo 2: INCF REG, 0 Antes da instrução: REG = 0x W = x Z = 0 Depois da instrução: REG = 0x W = 0x Z = 0

A.18 DECF Decrementar f

A.19 RLF Rodar f para a esquerda através do Carry

A.20 RRF Rodar f para a direita através do Carry

Sintaxe: [rótulo] DECF f , d Descrição: Decrementar de uma unidade, o conteúdo do registo f. Se d=0 , o resultado é guardado no registo W Se d=1 , o resultado é guardado no registo f

Operação: ( f ) - 1 ⇒ d

Operando: 0 ≤ f ≤ 127, d ∈ [0, 1]

Flag: Z Número de palavras: 1 Número de ciclos: 1 Exemplo 1: DECF REG, 1 Antes da instrução: REG = 0x Z = 0 Depois da instrução: REG = 0x Z = 1 Exemplo 2: DECF REG, 0 Antes da instrução: REG = 0x W = x Z = 0 Depois da instrução: REG = 0x W = 0x Z = 0

Sintaxe: [rótulo] RLF f , d Descrição: O conteúdo do registo f é rodado um espaço para a esquerda, através de C (flag do Carry). Se d=0 , o resultado é guardado no registo W Se d=1 , o resultado é guardado no registo f

Operação: ( f ) ⇒ d <n+1>, f<7> ⇒ C, C ⇒ d <0>;

Operando: 0 ≤ f ≤ 127, d ∈ [0, 1]

Flag: C Número de palavras: 1 Número de ciclos: (^) 1 Exemplo 1: RLF REG, 0 Antes da instrução: REG = 1110 0110 C = 0 Depois da instrução: REG = 1110 0110 W = 1100 1100 C = 1 Exemplo 2: RLF REG, 1 Antes da instrução: REG = 1110 0110 C = 0 Depois da instrução: REG = 1100 1100 C = 1

Sintaxe: [rótulo] RRF f , d Descrição: O conteúdo do registo f é rodado um espaço para a direita, através de C (flag do Carry).

A.23 BSF Pôr a “1” o bit b de f

A.24 BTFSC Testar o bit b de f, saltar por cima se for = 0

A.25 BTFSS Testar o bit b de f, saltar por cima se for = 1

Exemplo 2: BCF INDF, 3 Antes da instrução: W = 0x FSR = 0xC conteúdo do endereço em FSR (FSR) = 0x2F Depois da instrução: W = 0x

FSR = 0xC

conteúdo do endereço em FSR (FSR) = 0x

Sintaxe: [rótulo] BSF f , b Descrição: Pôr a ‘1’, o bit b do registo f

Operação: 1 ⇒ f

Operando: 0 ≤ f ≤ 127, 0 ≤ b ≤ 7

Flag: - Número de palavras: 1 Número de ciclos: 1 Exemplo 1: BSF REG, 7 Antes da instrução: REG = 0x07 ; 0000 0111 (0x07) Depois da instrução: REG = 0x17 ; 1000 0111 (0x87) Exemplo 2: BSF INDF, 3 Antes da instrução: W = 0x FSR = 0xC conteúdo do endereço em FSR (FSR) = 0x2F Depois da instrução: W = 0x FSR = 0xC conteúdo do endereço em FSR (FSR) = 0x

Sintaxe: [rótulo] BTFSC f , b Descrição: Se o bit b do registo f for igual a zero, ignorar instrução seguinte. Se este bit b for zero, então, durante a execução da instrução actual, a execução da instrução seguinte não se concretiza e é executada, em vez desta, uma instrução NOP, fazendo com que a instrução actual, demore dois ciclos de instrução a ser executada. Operação: Ignorar a instrução seguinte se ( f < b >) = 0

Operando: 0 ≤ f ≤ 127, 0 ≤ b ≤ 7

Flag: - Número de palavras: 1 Número de ciclos: 1 ou 2 dependendo do valor lógico do bit b Exemplo: LAB_01 BTFSC REG, 1; Testar o bit 1 do registo REG LAB_02 ........... ; Ignorar esta linha se for 0 LAB_03 ........... ; Executar esta linha depois da anterior, se for 1 Antes da instrução, o contador de programa contém o endereço LAB_01.

Depois desta instrução, se o bit 1 do registo REG for zero, o contador de programa contém o endereço LAB_03. Se o bit 1 do registo REG for ‘um’, o contador de programa contém o endereço LAB_02.

Sintaxe: [rótulo] BTFSS f , b

A.26 INCFSZ Incrementar f, saltar por cima se der = 0

A.27 DECFSZ Decrementar f, saltar por cima se der = 0

Descrição: Se o bit b do registo f for igual a um, ignorar instrução seguinte. Se durante a execução desta instrução este bit b for um, então, a execução da instrução seguinte não se concretiza e é executada, em vez desta, uma instrução NOP, assim, a instrução actual demora dois ciclos de instrução a ser executada. Operação: Ignorar a instrução seguinte se ( f < b >) = 1

Operando: 0 ≤ f ≤ 127, 0 ≤ b ≤ 7

Flag: - Número de palavras: 1 Número de ciclos: 1 ou 2 dependendo do valor lógico do bit b Exemplo: LAB_01 BTFSS REG, 1; Testar o bit 1 do registo REG LAB_02 ........... ; Ignorar esta linha se for 1 LAB_03 ........... ; Executar esta linha depois da anterior, se for 0 Antes da instrução, o contador de programa contém o endereço LAB_01.

Depois desta instrução, se o bit 1 do registo REG for ‘um’, o contador de programa contém o endereço LAB_03. Se o bit 1 do registo REG for zero, o contador de programa contém o endereço LAB_02.

Sintaxe: [rótulo] INCFSZ f , d Descrição: Descrição: O conteúdo do registo f é incrementado de uma unidade. Se d = 0 , o resultado é guardado no registo W. Se d = 1 , o resultado é guardado no registo f. Se o resultado do incremento for = 0, a instrução seguinte é substituída por uma instrução NOP, fazendo com que a instrução actual, demore dois ciclos de instrução a ser executada.

Operação: ( f) + 1 ⇒ d

Operando: 0 ≤ f ≤ 127, d ∈ [0, 1]

Flag: - Número de palavras: 1 Número de ciclos: 1 ou 2 dependendo do resultado Exemplo: LAB_01 INCFSZ REG, 1; Incrementar o conteúdo de REG de uma unidade LAB_02 ........... ; Ignorar esta linha se resultado = 0 LAB_03 ........... ; Executar esta linha depois da anterior, se der 0 Conteúdo do contador de programa antes da instrução, PC = endereço LAB_01. Se o conteúdo do registo REG depois de a operação REG = REG + 1 ter sido executada, for REG = 0, o contador de programa aponta para o rótulo de endereço LAB_03. Caso contrário, o contador de programa contém o endereço da instrução seguinte, ou seja, LAB_02.

Sintaxe: [rótulo] DECFSZ f , d Descrição: O conteúdo do registo f é decrementado uma unidade. Se d = 0 , o resultado é guardado no registo W. Se d = 1 , o resultado é guardado no registo f. Se o resultado do decremento for = 0, a instrução seguinte é substituída por uma instrução NOP, fazendo assim com que a instrução actual, demore dois ciclos de instrução a ser executada.

Operação: ( f) - 1 ⇒ d

Operando: 0 ≤ f ≤ 127, d ∈ [0, 1]

Flag: - Número de palavras: 1

A.31 RETLW Retorno de um subprograma com uma constante em W

A.32 RETFIE Retorno de uma rotina de interrupção

A.33 NOP Nenhuma operação

Operando: - Flag: - Número de palavras: 1 Número de ciclos: 2 Exemplo: RETURN Antes da instrução: PC = x TOS = x Depois da instrução: PC = TOS TOS = TOS - 1

Sintaxe: [rótulo] RETLW k Descrição: A constante k de 8 bits, é guardada no registo W.

Operação: ( k ) ⇒ W; TOS ⇒ PC

Operando: 0 ≤ k ≤ 255

Flag: - Número de palavras: 1 Número de ciclos: 2 Exemplo: RETLW 0x Antes da instrução: W = x PC = x TOS = x Depois da instrução: W = 0x PC = TOS TOS = TOS – 1

Sintaxe: [rótulo] RETLW k Descrição: Retorno de uma subrotina de atendimento de interrupção. O conteúdo do topo de pilha (TOS), é transferido para o contador de programa (PC). Ao mesmo tempo, as interrupções são habilitadas, pois o bit GIE de habilitação global das interrupções, é posto a ‘1’.

Operação: TOS ⇒ PC ; 1⇒ GIE

Operando: - Flag: - Número de palavras: 1 Número de ciclos: 2 Exemplo: RETFIE Antes da instrução: PC = x GIE = 0 Depois da instrução: PC = TOS GIE = 1

Sintaxe: [rótulo] NOP Descrição: Nenhuma operação é executada, nem qualquer flag é afectada. Operação: - Operando: - Flag: -

© Copyright 2003. i-magazine e mikroElektronika. All Rights Reserved.

A.34 CLRWDT Iniciar o temporizador do watchdog

A.35 SLEEP Modo de repouso

Número de palavras: 1 Número de ciclos: 1 Exemplo: NOP

Sintaxe: [rótulo] CLRWDT Descrição: O temporizador do watchdog é reposto a zero. O prescaler do temporizador de Watchdog é também reposto a 0 e, também, os bits do registo de estado

e são postos a ‘um’.

Operação: 0 ⇒ WDT

0 ⇒ prescaler de WDT

Operando: - Flag: Número de palavras: 1 Número de ciclos: 1 Exemplo: CLRWDT Antes da instrução: Contador de WDT = x Prescaler de WDT = 1: Depois da instrução: Contador do WDT = 0x Prescale do WDT = 0

Sintaxe: [rótulo] SLEEP Descrição: O processador entra no modo de baixo consumo. O oscilador pára. O bit (Power Down) do registo Status é reposto a ‘0’. O bit (Timer Out) é posto a ‘1’. O temporizador de WDT (Watchdog) e o respectivo prescaler são repostos a ‘0’.

Operação: 0 ⇒ WDT

0 ⇒ prescaler do WDT

0 ⇒ PD

Operando: - Flag: Número de palavras: 1 Número de ciclos: 1 Exemplo 1: SLEEP Antes da instrução: Contador do WDT = x Prescaler do WDT = x Depois da instrução: Contador do WDT = 0x Prescaler do WDT = 0