Académique Documents
Professionnel Documents
Culture Documents
Princípios de arquitetura
de computadores
1
Sumário
2 Sumário
Soluções dos problemas do Capítulo 1
1.1 A potência (ou a capacidade) computacional aumenta duas vezes a cada 18 meses, o que po-
demos generalizar para um fator de 2x a cada 18x meses. Se quisermos descobrir o período
de tempo em que a capacidade computacional aumenta 100 vezes, precisaremos resolver a
equação 2x = 100, que se reduz a x = 6,644. Portanto, temos 18x = 18 ´ (6,644 meses) =
120 meses, que corresponde a 10 anos.
(b) 0,001 (Observe que o erro é metade da precisão, o que corresponderia a 0,001/2 =
0,0005 para esse problema.)
2.2 (a) 101111
(b) 111011
(c) 531
(d) 22,625
(e) 202,22
2.3 (a) 27
(b) 000101
(c) 1B
(d) 110111,111
(e) 1E,8
2.4 2´3–1 + 0´3–2 + 1´3–3 = 2/3 + 0 + 1/27 = 19/27
2.5 37,3
2.7 –8
2.8 0
2.14 (a)–0,02734375
(b) –1,0 ´ 21
(c)–0
(d) –¥
(e) +NaN
(f) +1,1001 ´ 2–126
(g)+1,01101 ´ 2–124
2.19 (a) 0 10000100 1011 0000 0000 0000 0000 000
Valores iniciais
Somar M a A
Deslocar
Deslocar
Somar M para A
Deslocar
Deslocar
Produto
Valores iniciais
Somar M a A
Deslocar para a direita
Somar M a A
Deslocar para a direita
Deslocar para a direita
Corrigir decimal
Produto
3.6
Divisor (M):
Valores iniciais
Resto Quociente
3.7
Divisor (M):
Valores iniciais
Quociente
3.9 (a) O transporte de cada CLA é gerado em apenas três retardos de portas depois de fixadas
as entradas. O caminho mais longo através de um CLA corresponde a cinco retardos de por-
tas. O caminho mais longo através do CLA/somador ripple de 16 bits é 14 (nove para gerar
c12, mais cinco para gerar s15).
(b) s0 é gerado em apenas dois retardos de portas.
(c) s12 é gerado em 11 retardos de portas. Ele leva 3 retardos de portas para gerar c4, que é
necessário para gerar c 3 retardos de portas mais tarde, que é preciso para gerar c12 3 retar-
dos de portas depois disso, dando um total de 9 retardos de portas antes de c12 poder ser usa-
do no CLA mais à esquerda. A saída s12 é gerada 2 retardos de portas depois, dando um total
de 11 retardos de portas.
3.10
0 1 0 0 1 1 Multiplicando
´ +1 0 –1 +1 0 –1 Multiplicador codificado de Booth
1 1 1 1 1 1 0 1 1 0 1 Multiplicando negativo
0 0 0 0 1 0 0 1 1 0 0 Multiplicando deslocado à esquerda duas unidades
1 1 1 0 1 1 0 1 0 0 0 Multiplicando negativo deslocado à esquerda 3 unidades
+ 0 1 0 0 1 1 0 0 0 0 0 Multiplicando deslocado à esquerda 5 unidades
0 1 0 0 0 0 0 0 0 0 1 Produto
3.11
0 1 0 0 1 1 Multiplicando
0 1 1 0 1 1 Multiplicador
+1 0 –1 +1 0 –1 Multiplicador codificado de Booth
+2 –1 –1 Multiplicador de par de bits recodificado
0 1 0 0 1 1 Multiplicando
´ +2 –1 –1 Multiplicador de par de bits recodificado
1 1 1 1 1 1 1 0 1 1 0 1 (–1 ´ 19 ´ 1)
1 1 1 1 1 0 1 1 0 1 0 0 (–1 ´ 19 ´ 4)
+ 0 0 1 0 0 1 1 0 0 0 0 0 (+2 ´ 19 ´ 16)
0 0 1 0 0 0 0 0 0 0 0 1 Produto
Somador de Somador de
quatro bits (FBA) quatro bits (FBA)
(b) Suponha que um MUX introduza dois retardos de portas, como vimos no Capítulo 3. O
número de retardos de portas para a abordagem de carry lookahead é 8 (c4 é gerado em três
retardos de portas, e s7 é gerado em mais cinco retardos de portas). Para a configuração de
carry-select, existem cinco retardos de portas para os FBAs, e dois retardos de portas para o
MUX, resultando em um total de 5 + 2 = 7 retardos de portas.
3.15 3p
3.16 Há mais de uma solução. Aqui está uma: a idéia básica é tratar cada operando de 16 bits
como se ele fosse composto por dois dígitos de 8 bits, e depois executar a multiplicação
como faríamos normalmente à mão. Então, A0:15 = A8:15A0:7 = AHIALO e B0:15 = B8:15B0:7
= BHIBLO, e assim o problema pode ser representado como:
Produtos parciais
de 16 bits
Multiplicadores
Somador
Somador
Somador
Produto de 32 bits
4.4
.begin
.org 2048
swap: ld [x], %r1
ld [N], %r2
st %r1, [Y]
st %r2, [x]
jmpl %r15 + 4, %r0
x: 25
y: 50
.end
4.5 (a) O código soma 10 elementos de array armazenados em a e 10 elementos de array arma-
zenados em b, e coloca o resultado no array que começa em c.
Para esse tipo de problema, estude o fluxo lógico a partir da primeira instrução. A primeira
linha carrega k=40 em %r1. A próxima linha subtrai 4 desse valor, deixando 36 em %r1, e a li-
nha seguinte armazena esse valor de volta em k. Se o resultado (+36 nesse momento) for ne-
gativo, então bneg se desvia para X, que retorna ao procedimento de chamada via jmpl. Caso
contrário, o código que segue bneg é executado, o que adiciona elementos correspondentes
dos arrays a e b, colocando os resultados no array c.
Modo Modo
de de
Opcode orig. Origem dest. Dest. Operando/Endereço
0 0 0
Área livre
Área livre %sp n
m Área livre
%r15
%sp c c
d d
a a
%sp
Pilha Pilha Pilha
4.8 Todas as instruções têm 32 bits de largura. Dez desses bits precisam ser usados para o
opcode e o registrador de destino, o que deixa apenas 22 bits para o campo imm22.
4.9 A convenção adotada nesse exemplo utiliza uma área “hardwired” (embutida no código) do
link de dados, que começa na posição 3000. Essa é uma variação da passagem do endereço da
área de link de dados em um registrador, o que é feito no exemplo mostrado na Figura 4-16.
4.10 O SPARC é big-endian, mas o Pentium é little-endian. O arquivo precisa passar por uma
“troca de bytes” antes de ser usado na outra arquitetura (ou, o que é equivalente, o progra-
ma precisa reconhecer o formato do arquivo e trabalhar com ele da maneira apropriada
para o formato big/little-endian).
4.11
aload_0
invokespecial 3 // Igual a: invokespecial <init>
return
4.13
main:
mov 15,%r16
mov 9,%r17
st %r16, [%sp+68] ! 15 na pilha
st %r17, [%sp+72] ! 9 na pilha
call addtwoints
nop
ld [%sp–4],%r9 ! resultado carregado da pilha em %r9
! printf("ans is %d \n", result);
! printf espera valor em %r9 e string de formato em %r8.
sethi %hi (.L17),%r8
or %r8,%lo(.L17),%r8
call printf
nop
jmp %r31+8
...
addtwoints:
ld [%fp+68],%r16 ! primeiro parâmetro em %r16
ld [%fp+72],%r17 ! segundo parâmetro em %10
add %r16, %r17, %r16
st %r16, [%fp–4] ! resultado na pilha
nop
jmp %r31+8
4.15 Não é certo que um programa de bytecode venha a ser executado tão rapidamente quanto o
programa equivalente escrito na linguagem nativa. Mesmo que o programa seja executado
com o uso de um compilador just-in-time (JIT), ele ainda utilizará operações baseadas na pi-
lha, e portanto não será capaz de tirar proveito das operações baseadas em registradores da
máquina nativa.
4.17
ld [B], %r1
ld [C], %r2
ld [D], %r3
ld [E], %r4
subcc %r1, %r2, %r2
subcc %r3, %r4, %r4
smul %r2, %r4, %r4
st %r4, [A]
5.2 Note que o campo rd para a instrução st na última linha é usado para o registrador de ori-
gem.
5.4
5.5
ld %r14, %r1
addcc %r14, 4, %r14 ! Esta linha pode ser excluída
addcc %r14, –4, %r14 ! Esta linha pode ser excluída
st % r2, %r14
5.7
.macro return
jmpl %r15 + 4, %r0
.endmacro
5.8
.
.
.
st %r1, [x]
st %r2, [x+4]
sethi .high22(x), %r5
addcc %r5, .low10(x), %r5
call add_2
ld [x+8], %r3
.
.
.
x: .dwb 3
5.9
.begin
.org 2048
add_128: ld [x+8], %r1 ! Carrega bits 32 a 63 de x
ld [x+12], %r2 ! Carrega bits 0 a 31 de x
ld [y+8], %r3 ! Carrega bits 32 a 63 de y
ld [y + 12], %r4 ! Carrega bits 0 a 31 de y
call add_64 ! Soma 64 bits inferiores
st %r5, [z + 8] ! Armazena bits 32 a 63 de resultado
st %r6, [z + 12] ! Armazena bits 0 a 31 de resultado
bcs lo_64_carry
addcc %r0, %r0, %r8 ! Limpa transporte
ba hi_words
lo_64_carry: addcc %r0, 1, %r8 ! Define transporte
hi_words: ld [x], %r1 ! Carrega bits 96 a 127 de x
ld [x + 4], %r2 ! Carrega bits 64 a 95 de x
ld [y], %r3 ! Carrega bits 96 a 127 de y
ld [y + 4], %r4 ! Carrega bits 64 a 95 de y
call add_64 ! Soma 64 bits superiores
bcs set_carry
addcc %r6, %r8, %r6 ! Soma em transporte baixo
st %r5, [z] ! Armazena bits 96 a 127 de resultado
st %r6, [z + 4] ! Armazena bits 64 a 95 de resultado
5.10 Nota: No código a seguir, arg2 deve ser um registrador (ele não pode ser um imediato).
5.12 A abordagem permite o uso de um registrador arbitrário como uma pilha, em lugar de ape-
nas %r14. O perigo é que um programador involuntariamente poderia tentar invocar a ma-
cro com uma declaração como push X, Y. Isto é, instanciar uma pilha na posição de memória
Y. A armadilha é que isso resultará em uma tentativa de definir a declaração de linguagem as-
sembly addcc Y, –4, Y, que é inválida em linguagem assembly ARC.
Decodificador
de 2 para 4
Saída
Z
Função
Seleção
Saída de
transporte
Entradas Entrada
de dados de Função
Somador
transporte
total
Entrada de
Saída de Soma
transporte
transporte
6.3
Não parada Parada
6.4 O registrador %r0 não pode ser alterado, e assim ele não precisa ter uma linha de ativação de
gravação.
6.5 (a)
0 1 0 0 0 1 0 0 0 0 0 0 1 1 0
1 0 0 0 1 0 0 0 0 1 0 0 0 0 1
1 0 0 0 1 0 0 0 0 0 0 1 0 0 2
0 1 2 3 0 1 2 3 0 1 2 3 F0 F1 Tempo
0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 Salvar r0
1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 Calcular r1
1 0 0 0 1 0 0 0 0 0 1 0 0 1 2 Calcular r0 r1
1 0 0 0 1 0 0 0 0 0 0 0 1 1 3 Calcular r0 r1
0 0 1 0 0 0 1 0 0 0 0 0 1 1 4 Calcular r0
0 0 1 0 0 0 1 0 0 1 0 0 0 1 5 Calcular r0 r1
0 0 1 0 0 0 1 0 0 0 0 0 1 1 6 Calcular r0 r1
1 0 0 0 1 0 0 0 0 0 1 0 0 1 7 Calcular r0 r1 r0 r1
1 0 0 0 1 0 0 0 0 0 0 0 1 1 8 Calcular r0 r1 r0 r1
6.6
A B C
M M M
U U U RW
60 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
61 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
6.7
R[temp0] ¬ SEXT13(R[ir]);
R[temp0] ¬ ADD(R[rs1],R(temp0]); GOTO 1793;
R[temp0] ¬ ADD(R[rs1],R[rs2]); IF IR(13) THEN GOTO 1810;
6.8
(b) 0, 1, 2, 19
6.14
Push
Top of Stack
Pop
Data Out
Clock
6.16 Não.
6.17
Cond
ALU Barr. A Barr. B Barr. C Endereço de salto Próximo endereço
zi Carry zi Carry
Out Out
0 0 1 0
0 0 1 0
1 0 0 1
1 0 0 1
1 0 d d
1 0 d d
0 1 d d
0 1 d d
6.21 temp0 deve ser multiplicado por 4 (deslocando-se temp0 dois bits para a esquerda) antes de
somar temp0 ao PC na linha 12.
7.2
Endereço Dados
7.4
Decodificador
de 2 para 4
Ativar
7.5
Endereço
Ativar
7.6
7 7 4
(b)
# erros: 13 (na primeira iteração do loop)
# acertos: 173 (primeiro loop)
# acertos depois do primeiro loop 9 ´ 186 = 1674
# total de acertos = 173 + 1674 = 1847
# acessos = acertos + erros = 1860
razão de acertos = 1847/1860 = 99,3%
(c) Tempo de acesso médio = [(1847)(10 ns) + (13)(210 ns)]/1860
= 11,4 ns
7.8 (a) O número de blocos na memória principal é 216/8 = 213. O campo de tag tem 13 bits de
largura e o campo de palavra tem 3 bits de largura.
Tag Palavra
13 3
7.10 (a) O tamanho do cache é 214 slots ´ 25 palavras/bloco = 219 palavras, que é o espaçamento
mínimo necessário para ocorrer um erro em cada acesso ao cache.
(b) Todo acesso ao cache causa um erro, e assim o tempo de acesso efetivo é 1000 ns.
7.11 (a) LRU 0 2 4 5 2 4 3 11 2 10
Erros:
(b) FIFO 0 2 4 5 2 4 3 11 2 10
Erros:
7.12 Se a tabela de páginas for trocada com o disco, o próximo endereço de memória causará
uma falha, porque o gerenciador de memória precisa conhecer a localização física desse en-
dereço virtual e, como a tabela de páginas está no disco, o gerenciador de memória não sabe
onde obter a página que contém a tabela de páginas. Ocorrerá uma seqüência infinita de fa-
lhas de páginas. O uso da norma de substituição de páginas da LRU impedirá que isso acon-
teça, pois a página que contém a tabela de páginas sempre estará na memória, mas isso só irá
funcionar se a tabela de páginas for pequena o bastante para caber em uma única página (o
que em geral não acontece).
(b) (M –F)/M
(c)[(N – M)T1 + (M – F)T2 + FT3]/N
7.15 Os endereços virtuais tendem a ser grandes (em geral, 32 bits). Se endereços virtuais forem
colocados no cache, os campos de tags serão correspondentemente grandes, bem como o
hardware que examina as tags. Se endereços físicos forem colocados no cache, toda referên-
cia de memória percorrerá a tabela de páginas. Isso tornará o cache mais lento, mas os cam-
pos de tags serão menores, o que simplificará o hardware.
Se agruparmos a memória virtual e a memória do cache em uma única unidade de gerencia-
mento de memória (MMU), poderemos colocar no cache endereços físicos e pesquisar si-
multaneamente o cache e a tabela de páginas, usando os bits de mais baixa ordem do endere-
ço (que são idênticos para endereços físicos e virtuais). Se a pesquisa na tabela de páginas ti-
ver sucesso, isso significa que o bloco de cache correspondente (se encontramos um bloco) é
o bloco que queremos. Desse modo, poderemos obter os benefícios do tamanho pequeno na
colocação de endereços físicos no cache, e ao mesmo tempo não sermos forçados a acessar a
memória principal para examinar a tabela de páginas, porque agora essa tabela está em
hardware. Em termos mais simples: esse é o propósito de um buffer de conversão lookaside.
7.16 Há 232 bytes/212 bytes/página = 220 páginas. Existe uma entrada de tabela de páginas cor-
respondente a cada página, e assim o tamanho da tabela de páginas é 220 ´ 8 bytes = 223
bytes.
7.17 Para o caso de 2D, cada porta AND do decodificador precisa de um fan-in igual a 6, supon-
do-se que o decodificador tenha uma forma semelhante ao da Figura 7-4. Há 26 portas AND
e 6 inversores, perfazendo uma contagem total de entradas de portas de 26 ´ 6 + 6 = 390
para o caso de 2D. Para o caso de 2–1/2D, existem dois decodificadores, cada um com 23
portas AND e 3 inversores, e um fan-in igual a 3 para as portas AND. A contagem total de
entradas de portas é então 2 ´ (23 ´ 3 + 3) = 54 para o caso de 2-1/2D.
7.18 1og4(220) = 10
(b) 211
7.20 Palavras F1A0028 e DFA0502D
7.21 32
Voltagem
Tempo
8.4 4.
8.5 (a)
Tempo de acesso
9.2
1 0 1 1 1 0 0 0 1 1
(b) 10 9 8 7 6 5 4 3 2 1
C8 C4 C2 C1
(c) 11
(d) 101111011001
9.4 k + r + 1 £ 2r para k= 1024. A simplificação produz: 1025 + r £ 2r onde r = 11 é o menor
valor que satisfaz à relação.
9.5
Código Caractere
11100101 V
11100110 W
11100111 X
11101000 Y
11101001 Z
(b) 8
9.7 Primeiro, procuramos erros nos cálculos de bits de verificação para o código SEC. Se todos
os cálculos de bits de verificação estiverem corretos, então não haverá nenhum erro de bit
único nem erros de bits duplos. Se qualquer dos cálculos de bits de verificação SEC estiver
errado, então haverá um erro de bit único ou um erro de bit duplo.
9.9 32 bits
9.10 Classe B
9.12 63 ns para transferência serial de bits, 32 ns para transferência paralela de palavras. A versão
de palavras em paralelo exige 32 vezes mais hardware, mas apenas metade do tempo de
transmissão, como resultado do retardo de tempo de transmissão pela conexão.
9.13 (Lugar reservado para solução.)
10.5
1
S= = 16,8
1 - 0,05
0,05 +
100
16,8
= 0,168 ou 16,8%
100
A.2
A.3
A B C F G
0 0 0 0 1
0 0 1 1 0
0 1 0 0 1
0 1 1 1 0
1 0 0 0 0
1 0 1 1 0
1 1 0 1 1
1 1 1 1 0
A B C XOR
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 0
1 1 1 1
A.5 18
A.6
A.7
A B C F G
0 0 0 0 0
0 0 1 0 0
0 1 0 1 0
0 1 1 0 1
1 0 0 0 0
1 0 1 0 0
1 1 0 0 1
1 1 1 1 0
g ( A , B , C) = ( A Å C)B
= ( AC + AC)B
= ABC + ABC
¹ f ( A , B , C)
A.9
A B C F
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 0
1 1 0 0
1 1 1 0
F ( A , B , C) = A B C
A.10
A.11
A.13
A.14
A.15
A.16
A.18
A.20
A.22
A.23
A.24
y + y =1
x + y + y =1
1x + y + y = 1
(x + x )(x + y ) + y = 1
x + x y + y =1
x y + (x + y) = 1
(x + y) + (x + y) = x y + (x + y)
(x + y) = x y
A.26 Não, um flip-flop de S-R não pode ser construído desse modo. Não existe nenhuma manei-
ra de se forçar uma saída alta ou baixa com base apenas em S ou R. Embora a combinação de
11 nas entradas forneça um estado quiescente, o resultado da aplicação de 00 é indefinido, e
10 e 01 são instáveis.
A.27 (Lugar reservado para solução não incluída.)
A.28
A.29
A entrada A entrada
anterior é 0 anterior é 1
Entrada
A.31
A.32
A.33
Paridade Paridade
par ímpar
B.2
B.3 Não. Os don’t cares (não importam) são usados durante o processo de projeto. Uma vez que
o projeto é fixo, os don’t cares assumem valores 0 ou 1.
B.4
B.5
Todos os implicantes primos são essenciais; então, não construímos uma tabela reduzida prefe-
rida.
f ( A , B , C , D) = BCD + AC + BD
B.7
Função Implicante primo Função Implicante primo
nenhum
Termos
mínimos
Implicantes
primos
B.9
B.10
Entrada atual X
Estado atual 0 1
B.11
Entrada atual XY
Entrada atual XY
B.13
B.14
B.15