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:
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: