Você está na página 1de 11

Questes de fixao para a prova

1 - Realize as operaes aritmticas abaixo em BINRIO, e indique quando houver overflow.


Se os operandos forem decimais, converta-os para binrio e realize aritmtica em binrio.
Considere uma palavra de 8 bits e a representao em complemento de dois.
a) 45
10
+ 33
10

b) 45
10
+ 123
10

c) 89
10
78
10


a) O primeiro passo converter os operandos de nmero decimal para nmeros na base 2. Em
seguida, completar com zeros at preencher um total de 8 bits (tamanho da palavra) e fazer a
adio dos nmeros seguindo as regras da aritmtica binria:
0+0 = 0
0+1 = 1
1+0 = 1
1+1 = 0 e vai 1
1 + 1 + 1 = 1 e vai 1



Para detectar se houve overflow, basta analisar o sinal dos operandos e do resultado. Na
notao de complemento de dois, o sinal descrito pelo bit menos significativo:

O overflow ocorre quando somamos dois nmeros negativos e produzimos um nmero
positivo, ou quando somamos dois nmeros positivos e o resultado d negativo. Observe na
figura acima que os operandos da soma so positivos (ambos com bit zero), e o resultado da
soma tambm positivo. Portanto, no houve overflow.

b) J temos o primeiro operando, 45, em binrio, agora basta calcular o segundo e proceder
com a soma em binrio.

123 (base 10) = 1111011 (base 2)


Observe que somamos dois nmeros positivos (bit de sinal igual a zero), e produzimos um
nmero negativo (bit de sinal igual a 1). Isso indica que ocorreu um overflow.

c)
Para realizar uma subtrao em binrio, transformamos o segundo valor para a notao em
complemento de 2, e fazemos uma soma com este valor obtido. Portanto, para resolver esta
operao: 1 transforme o primeiro nmero de decimal para binrio normalmente; 2-
converta o segundo nmero em notao de complemento de dois; 3 some os dois nmeros
anteriores em binrio.

1:

2:


Para converter um nmero na notao de complemento de dois. Realizamos os seguintes
passos:
1. Converter o valor absoluto do nmero (78) para a base dois e preencher com
zeros at completar o tamanho da palavra (8 bits)
2. Inverter os bits: tudo que for zero vira um e vice-versa
3. Somar 1 ao valor obtido no passo 2

3:

Observe que a adio produziu um valor de 9 bits, por causa do carry a mais. Entretanto, como
se trata da adio de nmeros de sinais diferentes (o primeiro positivo, e o segundo
negativo), esta operao nunca poder causar um overflow. Assim, descartamos o carry extra
e obtemos como resultado da subtrao o valor: 00001011
2 - Construa a tabela verdade e desenhe o circuito lgico da expresso booleana abaixo:
(A.B.C) + (~A.~B) + (A.~C)

Para desenhar o circuito desta expresso, primeiro analise a sua forma. Observe que ela
corresponde soma de trs produtos. O primeiro passo representar os trs produtos
utilizando a porta lgica AND. Os sinais de entrada precisam ser invertidos com uma porta NOT
caso seja necessrio (~A, ~B e ~C). Represente cada expresso AND com os respectivos sinais
de entrada (invertidos se for necessrio), na vertical, conforme a figura abaixo:

Para finalizar, basta somar os sinais de sadas das trs portas AND acima, conectando em uma
porta OU, de acordo com a figura abaixo:


Para construir a tabela verdade, inicialmente crie trs colunas para A, B e C, e preencha os
valores com todas as combinaes de 0s e 1s (000, 001, 010, 011, etc.):

A B C
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

Agora o que voc tem a fazer criar a coluna S, que corresponde a sada gerada por cada
combinao de valores de A, B e C avaliados na expresso. Embora voc possa calcular o valor
direto, uma forma alternativa consiste em criar colunas adicionais para cada sub-expresso
para facilitar os clculos. Primeiro fazemos as mais diretas: A.B.C, ~A,~B, ~C:




A B C A.B.C ~A ~B ~C
0 0 0 0 1 1 1
0 0 1 0 1 1 0
0 1 0 0 1 0 1
0 1 1 0 1 0 0
1 0 0 0 0 1 1
1 0 1 0 0 1 0
1 1 0 0 0 0 1
1 1 1 1 0 0 0

Agora os produtos : (~A.~B)
A B C A.B.C ~A ~B ~C ~A.~B
0 0 0 0 1 1 1 1
0 0 1 0 1 1 0 1
0 1 0 0 1 0 1 0
0 1 1 0 1 0 0 0
1 0 0 0 0 1 1 0
1 0 1 0 0 1 0 0
1 1 0 0 0 0 1 0
1 1 1 1 0 0 0 0

E (A.~C):
A B C A.B.C ~A ~B ~C ~A.~B A.~C
0 0 0 0 1 1 1 1 0
0 0 1 0 1 1 0 1 0
0 1 0 0 1 0 1 0 0
0 1 1 0 1 0 0 0 0
1 0 0 0 0 1 1 0 1
1 0 1 0 0 1 0 0 0
1 1 0 0 0 0 1 0 1
1 1 1 1 0 0 0 0 0

Por ltimo, tendo avaliado todas as sub-expresses, avaliamos a expresso completa
S = (A.B.C) + (~A.~B) + (A.~C)
A B C A.B.C ~A ~B ~C ~A.~B A.~C S
0 0 0 0 1 1 1 1 0 1
0 0 1 0 1 1 0 1 0 1
0 1 0 0 1 0 1 0 0 0
0 1 1 0 1 0 0 0 0 0
1 0 0 0 0 1 1 0 1 1
1 0 1 0 0 1 0 0 0 0
1 1 0 0 0 0 1 0 1 1
1 1 1 1 0 0 0 0 0 1

O site abaixo pode ser til para verificar se a tabela montada acima est correto:
http://turner.faculty.swau.edu/mathematics/materialslibrary/truth/

Basta digitar a equao usando os operadores: & para o conectivo E, + para o conectivo
OU e o ~ para a negao NO. Marque a entrada da tabela para ser gerada como 0 e 1,
conforme na figura acima. Clique o boto Generate Truth Table e obtenha a tabela:

3 - Converta o cdigo C abaixo para cdigo em Assembly MIPS.
a = B[10] - 20;
if ( a == 0 ){
B[10] = A[0] + A[2] - A[4];
}else{
B[10] = A[1] + A[3] + A[7];
}

Considere que:

A varivel "a" corresponde ao registrador "$s0"
O vetor "A" tem endereo base em "$s4"
O vetor "B" tem endereo base em "$s5".

A linha 1 precisa de um operando da memria, do vetor B. Precisamos carregar esse valor em
uma varivel temporria "$t0":

lw $t0, 40( $s4 )

Lembrando de multiplicar o ndice 10 vezes 4 para obter a cosntante correta: 40.

Agora precisamos fazer uma soma do valor de "$t0" com uma constante -20. Para isso,
utilizamos o comando "addi" (add imediato), que permite somar um registrador com uma
constante, e o resultado gravado em outro registrador:

addi $s0, $t0, -20

Ou seja, $s0 = $t0 - 20

A seguir, temos a estrutura de um comando condicional if com else, em Assembly do MIPS:

beq $s1, $zero IF
j ELSE
IF:
# bloco do if
j ENDIF
ELSE:
#bloco do else
ENDIF:

O comando "beq" compara os registradores "$s1" (varivel "a") e "$zero" (valor zero), e pula
para o label "IF" se os valores forem iguais. Se no forem iguais, o beq no produz efeito e o
prximo comando ser executado, o "j ELSE". Este o desvio incondicional, que pula para o
label "ELSE" sem fazer nenhum teste.

Para completar o cdigo, basta inserir os comandos dentro do corpo do if e do else nos
respectivos lugares.

Primeiro o if:

O comando "B[10] = A[0] + A[2] - A[4];" pega 3 valores da memria, soma os dois primeiros,
subtrai pelo terceiro, e grava o resultado na posio 10 do vetor B. Precisamos ler cada
elemento da memria em registradores temporrios para poder somar estes valores.

lw $t0, 0($s4)
lw $t1, 4($s4)
lw $t2, 16($s4)

Em seguida, desmembrar a expresso matemtica nas somas parciais: ( A[0] + A[2]), e a
subtrao deste valor intermedirio por A[4], pois as instrues do MIPS s somam dois
valores de cada vez.

add $t0, $t0, $t1
sub $t0, $t0, $t2

Por ltimo, o valor obtido gravado em "$t0" deve ser armazenado na memria, na posio 10
do vetor B. Para isso utilizamos o comando sw (store word):

sw $t0, 40($s5).

O cdigo do else semelhante. A seguir, apresentamos o cdigo completo:



lw $t0, 40( $s4 )
addi $s0, $t0, -20

beq $s1, $zero IF
j ELSE

IF:

lw $t0, 0($s4)
lw $t1, 4($s4)
lw $t2, 16($s4)

add $t0, $t0, $t1
sub $t0, $t0, $t2

sw $t0, 40($s5)

j ENDIF
ELSE:

lw $t0, 4($s4)
lw $t1, 12($s4)
lw $t2, 28($s4)

add $t0, $t0, $t1
add $t0, $t0, $t2

sw $t0, 40($s5)

ENDIF: