Escolar Documentos
Profissional Documentos
Cultura Documentos
/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
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:
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:
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
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)