Você está na página 1de 6

Sistemas Microprocessados – Prova 1

Prof. Daniel Café – turma A – 2022/2

Nome: ___________________________________________________ Matrícula: ____________________

Questão 1 Questão 2 Questão 3 Total

/3 /4 /3 /10
Questão 1
Desenhe o fluxograma de uma subrotina que calcula a derivada discreta de um sinal de números de 16 bits.
Por derivada, vamos considerar apenas a diferença e(n) – e(n-1). Note que um vetor de X elementos terá
como resultado X-1 elementos. No seu fluxograma, não coloque nenhuma referência aos registradores,
nem às instruções do assembly do MSP430. A subrotina tem como parâmetros de entrada: o endereço do
vetor “e”; seu tamanho “X” e o endereço do vetor de saída “s”. (3 pontos)

diff

i = X - 1

s(i-1) = e(i) - e(i-1)

i = i - 1

Não
i = 0?

Sim
Questão 2
Considere o algoritmo de divisão por deslocamentos, visto de forma resumida em sala de aula. O algoritmo
recebe dois números: N p/ o numerador e D p/ o divisor e aplica a divisão inteira N/D, resultando num
quociente Q e um resto R. O fluxograma é dado pela figura 1. Traduza esse fluxograma para código
assembly. Faça primeiro um mapeamento entre as variáveis e os registros que irá usar (1 ponto), em
seguida, escreva o seu código (4 pontos).

uDiv16

R = 0; i = 16

Desloca N e R,
colocando o MSB
de N no LSB de R

[R << 1]  [N << 1]

Não Sim
R ≥ D?

R = R - D

[Q << 1]  0 [Q << 1]  1

i = i - 1

i = 0?
Questão 3
Imagine uma subrotina que recebe 5 argumentos. Os 4 primeiros serão passados pelos registros R12 a R15.
O 5º argumento será passado pela pilha. A chamada dessa subrotina e sua implementação parcial estão
representadas abaixo:

1 mov #arg1, R12 20 subrot:


2 mov #arg2, R13 21 push R4
3 mov #arg3, R14 22 push R5
4 mov #arg4, R15 23 ...
5 push #arg5 54 ...
6 call #subrot 55 pop R5
7 add #'A', R12 56 pop R4
8 ... 57
58 ret

Desenhe o estado da pilha quando o programa estiver executando a linha 23, logo depois de ter executado
o último empilhamento de backup dos registradores internos (prólogo da subrotina). Lembre-se que a
chamada call também empilha algo. (1 ponto)

SP R5 Memória
R4 RAM
2(SP)
4(SP) PC

6(SP) #arg5
Memória ROM

Como posso recuperar o 5º argumento se a subrotina já estiver executando entre as linhas 23 e 54? Escreva
a instrução para colocar esse elemento em R4. (1 ponto)

O 5º argumento está na posição 6(SP) como mostrado na pilha acima. Para recuperar esse argumento e
colocá-lo em R4, basta mover o seu valor para o registrador em questão, da seguinte forma:

MOV.W 6(SP), R4
O retorno dessa subrotina deve funcionar sem problemas, entretanto irá gerar vazamento de memória. Se
executarmos 10 vezes essa subrotina, teremos 10 espaços irrecuperáveis na memória. Explique por que
isso ocorre e como devemos corrigir esse problema fazendo uma manipulação da pilha e de seu ponteiro.
(1 ponto)

O vazamento acontece devido a uma instrução push sem o seu equivalente pop. Esse descasamento entre
push e pop é necessário, uma vez que não temos registradores suficientes para passagem dos parâmetros.
A pilha é uma região na memória RAM que possui bastante espaço disponível para passagem de
parâmetros e pode ser usado nesse caso. Essa é, aliás, a opção que a GNU usa no compilador GCC. É tarefa
da subrotina, restaurar a pilha para o seu estado inicial antes de sua chamada. Para fazer isso, é necessário
mover o endereço de retorno que está na posição 4(SP) para a posição 6(SP) e ajustar o ponteiro da pilha
para que, antes do retorno, esteja na posição 6(SP). Isso pode ser feito, acrescentando-se as seguintes
instruções à linha 57 do código exemplo.

ATENÇÃO, depois dos POPs, o valor de SP avança duas posições (4 bytes). Dessa forma, é necessário levar
isso em consideração no código abaixo:

MOV.W 0(SP), 2(SP)


ADD.W #2, SP

Outra opção é fazer o ajuste da pilha, antes dos POPs que restauram o valor de R4 e R5. Então, antes da
linha 55, eu colocaria

MOV.W 4(SP), 6(SP)

Em seguida, na linha 57, eu colocaria

ADD.W #2, SP
Folha adicional para a questão: ______
Folha de consulta – Conjunto de Instruções do MSP430
15 14 13 12 11 10 9 8 7 6 5 4 3 0
0 0 0 1 0 0 Opcode 𝐵/𝑤̅ Ad DST Formato 2
0 0 1 Condition PC offset (10 bit) Saltos
Opcode SRC Ad 𝐵/𝑤̅ As DST Formato 1
• Formato 1 – Até 3 palavras (Instrução + Source/Dest offset + Destination offset)
• Formato 2 – Até 2 palavras (Instrução + Destination offset)

Instrução Bits de Status


Args Op-code Descrição
(.B/.W) V N Z C
Formato1
MOV src,dst 0x4 src → dst - - - -
ADD src,dst 0x5 src + dst → dst * * * *
ADDC src,dst 0x6 src + dst + C → dst * * * *
SUBC src,dst 0x7 dst + not(src) + C → dst * * * *
SUB src,dst 0x8 dst + not(src) + 1 → dst * * * *
CMP src,dst 0x9 dst - src * * * *
DADD src,dst 0xA src + dst + C → dst (decimally) * * * *
BIT src,dst 0xB src .and. dst 0 * * 𝑧̅
BIC src,dst 0xC not(src) .and. dst → dst - - - -
BIS src,dst 0xD src .or. dst → dst - - - -
XOR src,dst 0xE src .xor. dst → dst * * * 𝑧̅
AND src,dst 0xF src .and. dst → dst 0 * * 𝑧̅
Formato 2
RRC dst 000b Cn-1 → MSB →.......LSB → C 0 * * *
SWPB dst 001b bit 15...bit 8 ↔ bit 7...bit 0 - - - -
RRA dst 010b MSB → MSB →....LSB → C 0 * * *
SXT dst 011b Extend sign bits (B/W/A) 0 * * 𝑧̅
PUSH dst 100b SP - 2 → SP, src → SP - - - -
CALL dst 101b PC+2→ TOS ; #addr →PC - - - -
RETI dst 110b Return from interruption * * * *
Jumps
JNE,JNZ label 000b1 Jump if zero is reset - - - -
JEQ,JZ label 001b1 Jump if zero/equal - - - -
JNC, JLO label 010b1 Jump if carry is reset - - - -
JC, JHS label 011b1 Jump if carry is set - - - -
JN label 100b1 Jump if negative set - - - -
JGE label 101b1 Jump if (N xor V) = 0 - - - -
JL label 110b1 Jump if (N xor V) = 1 - - - -
JMP label 111b1 Jump unconditionally - - - -
Instruções emuladas
ADC dst ADDC #0,dst Add carry to dst * * * *
BR dst MOV dst,PC Branch - - - -
CLR dst MOV #0,dst Clear dst - - - -
CLR[C/N/Z] BIC #[1/4/2],SR Clear [Carry/Neg/Zero] bit - [0] [0] [0]
DADC dst DADD #0,dst Add Carry to dst decimally * * * *
DEC(D) dst SUB #[1/2],dst Decrement by 1 (by 2) * * * *
[D/E]INT BI[C/S] #8,SR [Disable/Enable] Interrupts - - - -
INC(D) dst ADD #[1/2],dst Increment by 1 (by 2) * * * *
INV dst XOR #–1,dst Invert DST * * * *
NOP MOV R3,R3 No operation - - - -
POP dst MOV @SP+,dst Pop operand from stack - - - -
RET MOV @SP+,PC Return from subroutine - - - -
RL[A/C] dst ADD[C] dst,dst C ← MSB← ... ← LSB ← [0/Cn-1] * * * *
SBC dst SUBC #0,dst Subtract carry from dst * * * *
SET[C/N/Z] BIS #[1/4/2],SR Set [Carry/Negative/Zero] bit - [1] [1] [1]
TST dst CMP(.B) #0,dst Test dst (compare with 0) 0 * * 1
(1) – No caso de instruções de salto, a coluna op-code deve ser lida como condição de salto.

As (SRC) Ad (DST) Modo de endereçamnento Sintaxe R2 R3


00 0 Registro Rn SR 0
01 1 Indexado | Simbólico | Absoluto X(Rn) | ADDR | &ADDR 0 +1
10 - Indireto @Rn +4 +2
11 - Indireto c/ auto-incremento | Imediato @Rn+ | #value +8 -1

Você também pode gostar