organizacao_proj_computad_3a_solucao_exerc

4541 palavras 19 páginas
Soluções do Capítulo 2

Soluçõ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

Relacionados