Escolar Documentos
Profissional Documentos
Cultura Documentos
2
1. (2,5 pontos) Representação de valores no computador.
a) (1,0 ponto) Deseja-se escrever um programa para imprimir uma mensagem na tela se um
número inteiro dado for menor que 8. Ao escrever o programa, o compilador de uma máquina
que opera segundo a abordagem de complemento a dois gera o código a seguir. O número
inteiro possui 8 bits e é representado em hexadecimal por 0xWZ, sendo W o valor dos 4
bytes mais significativos e Z os 4 bytes menos significativos (p.ex., o número binário 11101111 é
0xEF e o binário 00010000 é 0x10):
somar o número dado a 0xF8 ( o valor a ser preenchido na lacuna é um valor
em hexadecimal), que corresponde a -8 em decimal (o valor a ser preenchido
nesta lacuna é um valor em decimal)
se o resultado for maior ou igual a 0, sair sem fazer nada
caso contrário, imprimir uma mensagem na tela
ii. (0,5 ponto) Se o usuário der como entrada o valor 8, mostre passo a passo como
seu programa irá funcionar.
1 Somar o número 0xF8 (111110002) ao valor dado como entrada 810 (000010002)
000010002 + 111110002 = Soma binária = 1 0000 00002 = 010
OBS: o bit 1 em destaque é desconsiderado
2 O resultado é igual a zero => Sai do procedimento sem fazer nada
b) (0,5 ponto) Deseja-se escrever um programa para imprimir uma mensagem na tela se um
número dado for menor que 16. Ao escrever o programa, o compilador gera o seguinte código:
● comparar o número dado contra 0x10 (preencher com um número
de 8 bits, representado em hexadecimal)
● se o número for menor ou igual a 0x10, imprimir mensagem na tela
● caso contrário, sair sem fazer nada
Preencha as lacunas, todas com o mesmo valor. Explique claramente sua resposta,
mostrando passo a passo seu raciocínio. Quanto vale o valor preenchido nas lacunas, em
decimal?
Passos do programa:
subtrair o número dado por 0x10, que corresponde a 16 em decimal (o valor a ser preenchido
nesta lacuna é um valor em decimal)
se o resultado for maior ou igual a 0, sair sem fazer nada
caso contrário, imprimir uma mensagem na tela
c) (1,0 ponto) Deseja-se escrever um programa para imprimir uma mensagem na tela se um
número dado for estritamente negativo. Caso o número dado seja zero ou positivo, não se deve
imprimir nada. Ao escrever o programa, o programador gera o seguinte código Assembly:
● comparar o bit mais significado do número dado contra 1
● caso igual, imprimir mensagem
● caso contrário, sair sem fazer nada
A solução descrita é adequada? Por quê? A solução acima funciona caso o número
dado esteja representado em complemento a dois? E caso o número dado esteja
representado em formato sinal/magnitude? Justifique claramente.
Sim, a solução funciona perfeitamente para C2 (complemento a dois), já que nesta representação o 1º bit
(esquerda) leva ao sinal negativo, pois, quando na converso de base, o valor em decimal equivalente a primeira
posição passa a ser totalizado com sinal negativo acrescido aos das demais posições.
Já na representação de sinal/magnitude, o 1º bit é o sinal, entretanto isso leva a 2 combinações para o 0 (zero)
que são 00000000 e 10000000. Esta 2ª combinação do zero seria interpretada como número negativo,
invalidando o programa do enunciado.
2. (2,5 pontos) Entrada e saída: E/S por interrupção versus E/S por programa, e
overheads.
a) (0,75 ponto) Utilização máxima: Um disco rígido está sempre ativo, e transfere dados
para o processador em blocos de 16 bytes e possui uma taxa de transferência de
4MB/segundo. Logo, ele precisa atender 250 K blocos por segundo. Se cada atendimento
de cada bloco consome 400 ciclos de relógio, adotando uma abordagem de E/S por
programa, e o processador utiliza um relógio de 500 MHZ, o overhead, medido como
a fração entre o número de ciclos utilizados sobre o total de ciclos disponíveis, vale quanto?
Total de operações de E/S (atendimentos) = 250K
Atividade = 100% = 1
b) (0,75 ponto) Utilização de 50%: Assuma agora que o disco rígido está ativo apenas
50% do tempo. Na operação de E/S por interrupção, o processador apenas será
interrompido quando o dispositivo de E/S estiver em atividade. Qual será o overhead
nesse caso, usando E/S por interrupção, assumindo que o atendimento de cada bloco,
por cada interrupção, consome 800 ciclos de relógio?
c) (1,0 ponto) No método de E/S por programa o processador é obrigado a gastar ciclos
de relógio para monitorar o dispositivo independentemente do fato de ele estar sendo
acionado ou não. Comparando os cenários a) e b), qual a utilização máxima para valer
a pena adotar E/S por interrupção? Justifique claramente sua resposta.
A operação E/S por interrupção é vantajoso com overhead de interrupção < overhead de programação
Assim,
0,4 X < 0,20 => X < 0,50 => X < 50%
Ou seja, para ser vantajoso em E/S de interrupção, o dispositivo tem de estar ativo em no máximo 50%
do tempo (exclusive).
Com 50% do tempo ambos (interrupção e programação) tem o mesmo overhead.
● O programa considerado nesta questão não faz acesso direto à memória principal para
escrever dados – todas as operações aritméticas são executadas usando registradores
● O operando de uma instrução é um registrador Y, determinado pelo programador
● O registrador Y pode ser igual a A, B, C, D, E ou T
Considere uma máquina com o seguinte conjunto de instruções, notando que algumas entradas
da tabela foram propositalmente removidas.
c) (0,5 ponto) Assuma que o registrador E é inicializado com o valor 2. Repita a questão
anterior, usando a instrução MUL pelo menos uma vez.
a) (1 ,0 ponto) Na Questão 3 , item b), notou-se que é possível executar operações sem
que o conjunto de instruções possua as instruções MUL. Descreva como esse fato se
relaciona com os conceitos das arquiteturas CISC e RISC. Assim, usando como exemplo
a Questão 3 com a instrução MUL, explique como as arquiteturas CISC e RISC diferem
em relação à complexidade da UCP e o tamanho do código gerado.
No item b da questão 2, temos a exclusão da instrução MUL, reduzindo a já limitada lista de instruções
introduzidas no enunciado daquela questão. A opção para um possível compilador seria substituir a instrução
MUL por uma sequência de somas (ADD), solução esta exigida como resposta ao item mencionado. A arquitetura
RISC, em relação ao CISC, busca a redução da complexidade das operações, com o propósito de diminuir também
a complexidade do hardware e aumentar o desempenho e eficiência energética. Podemos notar ainda na resposta
do item b que, na ausência do MUL, a quantidade de instruções (tamanho) do código aumentou, outra diferença
encontrada nas arquiteturas RISC e CISC, a primeira com um conjunto menor de instruções e, normalmente, um
código de maior tamanho em relação à segunda.
b) (0,75 ponto) Suponha que você tenha que projetar uma UCP a ser utilizada em um
dispositivo móvel, que opera com uma bateria, possuindo assim limitações energéticas.
Nesse caso, você escolheria uma arquitetura CISC ou RISC? Explique o porquê.
c) (0 ,75 ponto) Suponha que você tenha que projetar uma UCP para um servidor de alto
desempenho que execute tarefas de análise de imagens, que exigem um alto poder de
processamento. Nesse caso, você escolheria uma arquitetura CISC ou RISC? Explique
o porquê.
No geral, não existe uma resposta única para a escolha entre CISC e RISC para um servidor de alto
desempenho para análise de imagens. É importante considerar os requisitos específicos do sistema, o conjunto
de instruções, o desempenho, a eficiência energética e outros fatores. Em muitos casos, uma arquitetura RISC
pode ser uma escolha sólida devido à sua eficiência e desempenho, face ao número reduzido de instruções, no
entanto a responsabilidade no desempenho recai sobre o compilador. Contudo, ao considerar a análise de
imagens que depende de operações com vetores e matrizes, é importante notar que as instruções comuns nessas
operações são mais eficientemente executadas em modos de endereçamento frequentemente encontrados em
arquiteturas CISC