Você está na página 1de 5

GABARITO AP2 – 2023.

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

i. (0,5 ponto) Preencha as lacunas. Explique claramente sua resposta, mostrando


passo a passo do seu raciocínio.

Respondido acima (em destaque)

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

Descrevendo em detalhes a execução dos passos citados:


1) subtrair o número dado por 0x10:
Operações de subtração exigem um hardware mais complexo e caro do que uma operação de soma,
assim os projetistas de processadores implementam a conversão de operações de subtração em
operações de soma, bastando inverter o sinal do subtraendo (2º termo da subtração).
Na representação de C2 (complemento a 2) a inversão de sinal é feita em 2 passos: inversão binária
e logo depois, soma 1.
0x10 (00010002) que com sinal invertido, após os 2 passos, passa para (111100002)
A operação de subtração é convertida para soma, ficando assim:
Valor de entrada + 111100002
Por exemplo, usando o valor de entrada do item anterior: 0x08 (000010002)
000010002 + 111100002 = Soma binária = 1 0000 10002 = +810
OBS: o bit 1 em destaque é desconsiderado

2) se o resultado for maior ou igual a 0, sair sem fazer nada


Para o exemplo dado com o valor de entrada = 000010002
O resultado é maior que zero => Sai do procedimento sem fazer nada

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

Entrada e Saída por programa:


Overhead = atividade . total de operações/s . ciclos por operação / total de ciclos/s
Overhead = 1 . 250K . 400 / 500M = 100 M / 500 M = 0,20 = 20,0%

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?

Total de operações de E/S (atendimentos) = 250K


Atividade = 50% = 0,5

Entrada e Saída por interrupção:


Overhead = atividade . total de operações/s . ciclos por operação / total de ciclos/s
Overhead = 0,5 . 250K . 800 / 500M = 100 M / 500 M = 0,20 = 20,0%

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.

Total de operações de E/S (atendimentos)= 500K

Entrada e saída por interrupção:


Overhead = atividade . total de operações/s . ciclos por operação / total de ciclos/s
Overhead = X . 250K . 800 / 500M = 200 M . X / 500 M = 0,4 X

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.

3. (2,5 pontos) Considere um computador que possua 6 registradores acessíveis


diretamente pelo usuário: A, B, C, D, E e T, sendo este último um registrador temporário.
Além disso, o sistema também possui um registrador ACC, que serve como acumulador, e
que é acessível apenas indiretamente, conforme visto em aula, e indicado abaixo.

● 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.

Linha Comando Descrição

1 LD Y (ACC) <- (Y)

2 STR Y (Y) <- (ACC)

3 ADD Y (ACC) <- (ACC) + (Y)

4 SUB Y (ACC) <- (ACC) - (Y)

5 MUL Y (ACC) <- (ACC) * (Y)

6 DIV Y (ACC) <- (ACC) / (Y)

a) (1,0 ponto) Preencha as células faltantes na tabela. No caderno de resposta, basta


indicar, em ordem, para cada linha, o que precisa constar nas células faltantes, de cima
para baixo, explicando o seu raciocínio.

Respondido acima (em destaque)

b) (1,0 ponto) Assuma que os registradores A e B armazenem dois valores inteiros.


Assuma que se deseje armazenar no registrador D o triplo de A-B, ou seja, D = 3 (A-B).
Escreva um programa para atingir tal fim, usando o conjunto de instruções desta questão,
sem usar a instrução MUL de multiplicação, sem usar a instrução DIV de divisão, e sem
fazer nenhuma hipótese sobre os conteúdos dos demais registradores diferentes de A e B.
LD A => (ACC) <- (A) lê o valor de A
SUB B => (ACC) <- (ACC) - (B) calcula (A–B)
STR T => (T) <- (ACC) armazena em T
ADD T => (ACC) <- (ACC) + (T) calcula (A-B)+(A-B)
ADD T => (ACC) <- (ACC) + (T) calcula (A-B)+(A-B)+(A-B)
STR D => (D) <- (ACC)

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.

LD A => (ACC) <- (A) lê o valor de A


SUB B => (ACC) <- (ACC) - (B) calcula (A–B)
STR T => (T) <- (ACC) armazena em T
MUL E => (ACC) <- (ACC) * (E) calcula (A-B)*2
ADD T => (ACC) <- (ACC) + (T) calcula (A-B)*2+(A-B)
STR D => (D) <- (ACC)
4. (2,5 pontos) No contexto de arquiteturas RISC e CISC, responda:

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ê.

 Uma Arquitetura RISC


 Por ter um conjunto de instruções reduzido e otimizado, a arquitetura RISC requer hardware mais simples
que exige menor consumo de energia e dispersão térmica. Assim, a arquitetura RISC permite que os
processadores executem operações de forma mais eficiente em termos de energia, importante principalmente
para dispositivos móveis.

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

Você também pode gostar