organizacao_proj_computad_3a_solucao_exerc
4541 palavras
19 páginas
Soluções do Capítulo 2Soluções do Capítulo 2
2.1
Instrução
Formato
op
rs
rt
imediato
addi $v0, $zero, 0
I
8
0
2
0
lw $v1, 0($a0)
I
35
4
3
0
sw $v1, 0($a1)
I
43
5
3
0
addi $a0, $a0, 4
I
8
4
4
4
addi $a1, $a1, 4
I
8
5
5
4
beq $v1, $zero, loop
I
4
3
0
–5
2.5 O código carrega a instrução sll, que estava em shifter para um registrador, e mascara o valor deslocado, colocando os 5 bits menos significativos de $s2 em seu lugar. Depois, ele escreve a ins-
trução de volta na memória e prossegue para executá-la. O código é automodificável; assim, ele é muito difícil de depurar e, provavelmente, proibido em muitos sistemas operacionais modernos. Um problema importante é que estaríamos escrevendo na cache de instruções, e isso claramente atrasa as coisas e exigiria uma grande quantidade de trabalho a ser implementado corretamente (ver Capítulos 6 e 7).
2.7 A nova instrução trata $s0 e $s1 como um par de registradores e realiza um deslocamento no qual o bit menos significativo de $s0 se torna o bit mais significativo de $s1, e tanto $s0 quanto $s1
são deslocados para a direita de uma posição.
2.9 O loop C é while (save [i] == k) i += 1;
com i e k correspondendo aos registradores $s3 e $s5 e a base do array save em $s6. O código assembly dado no exemplo é
Código antes
Loop: sll add lw bne addi j Exit:
$t1,
$t1,
$t0,
$t0,
$s3,
Loop
$s3, 2
#
$t1, $s6
#
0($t1)
#
$s5, Exit #
$s3, 1
#
#
Reg
$t1
Reg vai i = vai temp $t1 = 4 * i
= endereço de save [i] temp $t0 = save[i] para Exit se save[i] ¹ k i + 1 para Loop
O número de instruções executadas se save[i + m] não for igual a k para m = 10 e não for igual a k para 0 £ m £ 9, é 10 × 6 + 4 = 64, o que corresponde a 10 iterações completas do loop mais uma passada final, que vai para Exit na instrução bne antes de atualizar i. A reescrita direta