Perguntas Potenciais e Respostas para a Prova de
Linguagem Assembly e Microcontroladores
Elaborado por Diogo Garcia
1 de junho de 2025
Bloco 1: Conceitos Fundamentais da Linguagem Assem-
bly
1. Teórica (Múltipla Escolha): Qual das seguintes afirmações MELHOR define a Lin-
guagem Assembly?
a) Uma linguagem de alto nível independente de hardware.
b) Uma representação simbólica da linguagem de máquina específica de um processador.
c) Uma linguagem usada primariamente para desenvolvimento web.
d) Um conjunto de instruções que não precisa de um montador para ser executado.
2. Teórica (Discursiva): Apesar de ser considerada uma linguagem antiga, por que o
estudo da Linguagem Assembly ainda é relevante para engenheiros eletricistas e de com-
putação? Cite duas aplicações onde seu uso é vantajoso.
3. Identificação: Quais são os quatro elementos principais que podem compor uma sen-
tença em linguagem Assembly? Indique quais são opcionais.
Exemplo: Loop: ADD EAX, EBX ;adiciona os valores
4. Diferenciação: Explique a diferença fundamental entre uma "instrução"e uma "dire-
tiva"em Assembly. Dê um exemplo de uma diretiva e sua finalidade.
5. Vantagens e Desvantagens: Cite uma principal vantagem e uma principal desvantagem
do uso da linguagem Assembly no desenvolvimento de software.
Bloco 2: Microcontroladores e Registradores (Foco no
PIC)
6. Teórica (Múltipla Escolha): O que é um microcontrolador?
a) Um software para simular circuitos eletrônicos.
b) Um componente que incorpora em um só CI elementos como microprocessador,
memórias e interfaces.
c) Apenas uma unidade de memória RAM de alta velocidade.
d) Um periférico exclusivo para entrada de dados.
7. Funcionamento: Descreva brevemente o ciclo de busca e o ciclo de execução no funciona-
mento de um microcontrolador. Qual o papel do Program Counter (PC) nesse processo?
8. Registradores (Discursiva): Diferencie Registradores de Propósito Geral (GPR) de
Registradores de Funções Especiais (SFR) em um microcontrolador como o PIC16F628.
Para que serve o registrador W?
1
9. Flags (STATUS Register): Considere o registrador STATUS do PIC16F628. Se uma
operação aritmética resulta em zero, qual bit (flag) deste registrador é afetado e qual será
seu valor?
a) C (Carry) será 1
b) Z (Zero) será 1
c) DC (Digit Carry) será 1
d) Z (Zero) será 0
10. Configuração de Registradores (Leitura): Um programa no PIC16F628 acabou de
executar uma instrução CLRWDT. Qual será o estado (valor binário) dos bits TO e PD no
registrador STATUS?
11. Configuração de Registradores (Escrita): Se você precisa configurar a PORTA do
PIC16F628 de forma que RA0, RA1 e RA2 sejam saídas digitais com nível lógico alto e
RA3 e RA4 sejam entradas, quais valores (aproximados, considerando apenas o dado a
ser escrito no registrador PORTA para os pinos de saída) você carregaria no registrador
TRISA (para direção) e PORTA (para saída)? Nota: Esta pergunta exige inferência sobre
o TRISA, que define a direção (TRISA=0 para saída, TRISA=1 para entrada nos bits
correspondentes). Para os pinos de saída RA0, RA1, RA2 em alto, os bits 0, 1 e 2 de
PORTA seriam 1.
12. Posição de Memória: No PIC16F628, os Registradores de Funções Especiais (SFRs)
possuem endereços na memória de dados. É possível acessar o registrador TMR0 (en-
dereço 01h no Banco 0) usando uma instrução que espera um endereço de GPR qual-
quer? Justifique. Nota: Sim, pois eles estão mapeados na RAM e são acessados por seus
endereços. A anotação "POSICAO DE MEMORIA COM O DOS REGISTRADORES
ESPECIFICOS NAO PODE"pode se referir a tentar usar um endereço de SFR de forma
incompatível com a instrução, ou tentar modificar bits reservados/read-only, ou ainda
confusão sobre bancos de memória se não selecionados corretamente.
Bloco 3: Análise e Interpretação de Código Assembly
(PIC)
13. Carregando Valores: Qual instrução é usada para carregar um valor literal (imediato)
diretamente no registrador W no PIC16F628?
a) MOVWF
b) MOVF
c) MOVLW
d) ADDLW
14. Interpretação de Código Simples: O que o seguinte trecho de código faz?
MOVLW 0x10 ; Linha 1
MOVWF TEMP ; Linha 2
INCF TEMP, 1 ; Linha 3
2
a) Carrega 0x10 em TEMP e depois decrementa TEMP.
b) Carrega 0x10 em W, move para TEMP, e então incrementa TEMP, armazenando o
resultado em TEMP.
c) Soma 0x10 ao valor atual de TEMP.
d) Limpa o registrador TEMP.
15. Resultado em Registrador: Considere o código abaixo. Qual será o valor no regis-
trador W e no registrador REG_A após a sua execução? (Suponha que REG_A está no
endereço 0x20 e inicialmente contém 0x05, e o registrador W inicialmente contém 0x02).
MOVLW 0x0A ; W = 0x0A
ADDWF REG A, 0 ; W = W + REG_A (0x0A + 0x05 = 0x0F), REG_A permanece 0x
_
16. Análise de Flags: Após a execução da instrução SUBLW 0x05, se o registrador W
continha 0x05 antes da instrução, qual será o valor da flag Z (Zero) no registrador
STATUS?
17. Encontre o Erro: Analise o trecho de código abaixo para o PIC16F628. Identifique um
erro potencial e explique por quê. (Dica: Considere os operandos e o funcionamento da
instrução).
MOVLW 0xFF
CLRF PORTA, 0 ; Erro aqui!
18. Lógica e Flags: Se o registrador W contém 0b10101010 e a instrução ANDLW 0b00001111
é executada, qual será o valor de W e da flag Z?
19. Transferência e Bits: O registrador CONFIG (endereço 0x30) contém 0b11001100.
Qual será o valor de CONFIG após a instrução BCF CONFIG, 6?
20. Controle de Fluxo: O que a instrução CALL RotinaSoma faz? O que acontece com
o endereço da próxima instrução após CALL?
21. Instrução e Armazenamento: Após a execução da seguinte sequência:
MOVLW 0x55
MOVWF REG_B ; Suponha REG_B em 0x25
MOVLW 0xAA
SWAPF REG_B, 0 ; Resultado em W, REG_B não muda
Qual valor foi armazenado no registrador W como resultado da instrução SWAPF?
22. Binário/Hexadecimal para Registrador: Se o registrador STATUS está com o valor
hexadecimal 0x18, quais são os estados das flags C, DC e Z (bits 0, 1 e 2 respectivamente)?
3
Respostas das Perguntas
Respostas - Bloco 1
1. b) Uma representação simbólica da linguagem de máquina específica de um processador.
[cite: 4]
2. A Linguagem Assembly ainda é relevante devido à necessidade de controle preciso do
hardware e para otimizar o desempenho em aplicações críticas. [cite: 4, 9] Duas aplicações
onde seu uso é vantajoso são: o desenvolvimento de sistemas operacionais [cite: 9] e a
programação de dispositivos embarcados (como em sistemas de aviação)[cite: 9].
3. Os quatro elementos principais são[cite: 15, 23]:
• Rótulo (Opcional)
• Mnemônico (Nome do opcode - Obrigatório)
• Operando(s) (Zero ou mais, dependendo do mnemônico)
• Comentário (Opcional)
4. Instruções são representações simbólicas de instruções de linguagem de máquina que o
processador executa diretamente. [cite: 24] Diretivas (ou pseudoinstruções) não são tra-
duzidas diretamente em instruções de máquina, mas são comandos para o montador (as-
sembler) realizar tarefas como definir constantes, alocar memória ou controlar o processo
de montagem. [cite: 24, 25] Exemplo de diretiva: EQU (Equate), usada para definir um
símbolo para um valor constante [cite: 30] (ex: MSGLEN EQU 25).
5. Uma principal vantagem é a otimização de velocidade do código [cite: 12] ou o acesso
direto a instruções de hardware inacessíveis por linguagens de alto nível[cite: 12]. Uma
principal desvantagem é o tempo de desenvolvimento consideravelmente mais longo [cite:
13] ou a baixa portabilidade do código, que é específico da plataforma ou processador[cite:
13].
Respostas - Bloco 2
6. b) Um componente que incorpora em um só CI elementos como microprocessador, memó-
rias e interfaces. [cite: 40]
7. O ciclo de busca (fetch cycle) é a operação de leitura do opcode de uma instrução da
memória de programa, a partir do endereço contido no Program Counter (PC). [cite:
45] O opcode lido é armazenado no Registrador de Instrução (RI) para ser decodificado.
[cite: 46] O ciclo de execução (execute cycle) é quando a instrução (já decodificada) é
efetivamente realizada pela unidade de controle e ULA. [cite: 46] O PC aponta para o
endereço da próxima instrução a ser buscada e é incrementado após a busca (ou durante
a execução, dependendo do tamanho da instrução) para sequenciar o programa. [cite: 43,
44, 47]
8. Registradores de Propósito Geral (GPR - General Purpose Registers) são usados pelo pro-
gramador para armazenar dados temporários e variáveis durante a execução do programa.
[cite: 80] Registradores de Funções Especiais (SFR - Special Function Registers) são usa-
dos para configurar e controlar as operações do microcontrolador e seus periféricos, como
temporizadores, portas de I/O, comunicação serial, interrupções, etc. [cite: 68, 79] O
4
Respostas das Perguntas
registrador W (acumulador no PIC) é um registrador de trabalho fundamental usado em
muitas operações aritméticas e lógicas, servindo como um dos operandos e/ou como des-
tino para o resultado dessas operações antes de ser movido para outro local, se necessário.
[cite: 100, 148, 197]
9. b) Z (Zero) será 1. A flag Z é setada (vai para 1) quando o resultado de uma operação
aritmética ou lógica é zero. [cite: 84]
10. Após a instrução CLRWDT, os bits TO (Time-out bit) e PD (Power-down bit) no regis-
trador STATUS são setados para 1. [cite: 96, 262] Portanto, o estado binário será: TO
= 1, PD = 1.
11. Para configurar RA0, RA1, RA2 como saídas e RA3, RA4 como entradas:
• TRISA (endereço 85h, Banco 1 [cite: 78]): Para configurar um pino como saída,
o bit correspondente no TRISA deve ser ’0’. Para entrada, deve ser ’1’. Então,
para RA0-RA2 (saídas) e RA3-RA4 (entradas), e assumindo que RA5-RA7 não
são usados ou são entradas por padrão: TRISA teria bits 0,1,2 = 0 e bits 3,4 =
1. Exemplo: TRISA = 0b...11000 (os bits mais significativos dependeriam da
configuração desejada para RA5-RA7, que não foi especificada).
• PORTA (endereço 05h, Banco 0 [cite: 72]): Para que as saídas RA0, RA1, RA2
tenham nível lógico alto, os bits 0, 1 e 2 do registrador PORTA devem ser setados
para ’1’. Exemplo: PORTA = 0b...00111 (os bits mais significativos seriam o
estado dos pinos configurados como entrada ou outras saídas).
Valores a carregar (assumindo os demais bits de TRISA como entrada e de PORTA como
baixo): MOVLW 0b00011100; MOVWF TRISA (após selecionar Banco 1), e MOVLW
0b00000111; MOVWF PORTA (após selecionar Banco 0).
12. Sim, é possível acessar o registrador TMR0 (endereço 01h no Banco 0 [cite: 72]) usando
uma instrução que espera um endereço de GPR, pois no PIC16F628 os SFRs estão ma-
peados na mesma área de memória de dados (RAM) que os GPRs. [cite: 69, 78, 80]
O programador precisa apenas garantir que o banco de memória correto esteja selecio-
nado (para TMR0, é o Banco 0, que geralmente é o padrão ou pode ser explicitamente
selecionado) e que a instrução seja apropriada para a operação desejada no TMR0 (por
exemplo, ler seu valor com MOVF TMR0, W). A anotação "POSICAO DE MEMORIA
COM O DOS REGISTRADORES ESPECIFICOS NAO PODE"provavelmente se refere
a erros como: tentar escrever em bits de um SFR que são somente leitura, tentar acessar
um SFR em um banco de memória incorreto sem a devida seleção de banco, ou usar uma
instrução de forma incompatível com a função do SFR.
5
Respostas das Perguntas
Respostas - Bloco 3
13. c) MOVLW. Esta instrução significa "Move Literal to W". [cite: 96, 198]
14. b) Carrega 0x10 em W, move para TEMP, e então incrementa TEMP, armazenando o
resultado em TEMP.
• MOVLW 0x10: Carrega o valor literal 0x10 no registrador W. [cite: 198]
• MOVWF TEMP: Move o conteúdo do registrador W (que é 0x10) para o registrador
de arquivo TEMP. [cite: 209]
• INCF TEMP, 1: Incrementa o conteúdo do registrador de arquivo TEMP e arma-
zena o resultado de volta em TEMP (porque d=1). [cite: 126]
15.
• MOVLW 0x0A: W ← 0x0A. [cite: 198]
• ADDWF REG_A, 0: Adiciona o conteúdo de W (0x0A) ao conteúdo de REG_A
(0x05). O resultado (0x0A + 0x05 = 0x0F) é armazenado em W (porque d=0).
O conteúdo de REG_A não é alterado. [cite: 107]
Portanto: Valor em W: 0x0F. Valor em REG_A: 0x05.
16. A instrução SUBLW k subtrai W de k (literal) e armazena o resultado em W (k - (W)
→ W). [cite: 114] Se W era 0x05 e k é 0x05, a operação é 0x05 - 0x05 = 0x00.
Quando o resultado de uma operação aritmética é zero, a flag Z (Zero) no registrador
STATUS é setada (colocada em 1). [cite: 84] Portanto, a flag Z será 1.
17. Erro: A instrução CLRF f (Clear f) limpa (zera) o conteúdo de um registrador de arquivo
’f’. Ela espera apenas um operando, que é o nome ou endereço do registrador de arquivo.
[cite: 96, 187, 188] O operando adicional ", 0"é inválido para a sintaxe da instrução
CLRF. Correção: CLRF PORTA
18. A instrução ANDLW k realiza uma operação E lógica bit a bit entre o conteúdo do regis-
trador W e o literal k, armazenando o resultado em W ((W) AND k → W). [cite: 149]
W = 0b10101010
k = 0b00001111
Resultado (W) = 0b00001010 (que é 0x0A em hexadecimal). A flag Z é setada se o
resultado da operação lógica for zero. [cite: 150] Como 0b00001010 não é zero, a flag
Z será 0. Valor em W: 0b00001010 (ou 0x0A). Flag Z: 0.
19. A instrução BCF f, b (Bit Clear f) zera (coloca em 0) o bit ’b’ do registrador de arquivo
’f’. [cite: 96, 229, 230] CONFIG = 0b11001100 Queremos limpar o bit 6 (contando o bit
menos significativo como bit 0). O bit 6 é o sétimo bit da direita para a esquerda, que atu-
almente é ’1’. CONFIG antes: 0b11001100 (Bit 7 é 1, Bit 6 é 1) Após BCF CONFIG,
6, o bit 6 torna-se 0: CONFIG depois: 0b10001100 (ou 0x8C em hexadecimal).
20. A instrução CALL k (Call subroutine) desvia o fluxo de execução do programa para o
endereço da sub-rotina especificada pelo literal ’k’ (no caso, o endereço associado ao rótulo
RotinaSoma). [cite: 96, 255] Antes do desvio, o endereço da instrução imediatamente
seguinte à instrução CALL (ou seja, PC+1) é salvo no topo da pilha (stack). [cite: 256]
6
Respostas das Perguntas
Isso permite que o programa retorne ao ponto onde a chamada foi feita após a conclusão
da sub-rotina (usando instruções como RETURN ou RETLW).
21.
• MOVLW 0x55: W ← 0x55.
• MOVWF REG_B: REG_B ← W (ou seja, REG_B = 0x55).
• MOVLW 0xAA: W ← 0xAA (este valor em W não será usado pela instrução SWAPF
seguinte, pois SWAPF opera sobre REG_B).
• SWAPF REG_B, 0: Esta instrução troca os nibbles (4 bits superiores com os 4 bits
inferiores) do registrador de arquivo REG_B e armazena o resultado no registrador
W (porque d=0). O conteúdo de REG_B em si não é alterado por esta variante da
instrução. [cite: 96, 225, 226]
REG_B contém 0x55, que em binário é 0b01010101. Nibble superior: 0101 Nibble infe-
rior: 0101 Trocando os nibbles: o nibble superior se torna o inferior e vice-versa. Neste
caso específico, como os nibbles são iguais, o valor após a troca ainda é 0b01010101,
que é 0x55. Portanto, o valor armazenado no registrador W será 0x55.
22. O valor hexadecimal 0x18 em binário é 00011000. O registrador STATUS no PIC16F628
tem a seguinte estrutura de bits (da direita para a esquerda, bit 0 a 7)[cite: 83]: C (bit
0), DC (bit 1), Z (bit 2), PD (bit 3), TO (bit 4), RP0 (bit 5), RP1 (bit 6), IRP (bit 7).
Analisando 00011000:
• Bit 0 (C - Carry): 0 [cite: 84]
• Bit 1 (DC - Digit Carry): 0 [cite: 84, 85]
• Bit 2 (Z - Zero): 0 [cite: 84]
(E também: PD (bit 3) = 1, TO (bit 4) = 1, RP0 (bit 5) = 0, RP1 (bit 6) = 0, IRP (bit
7) = 0). [cite: 84]