Baixe o app para aproveitar ainda mais
Prévia do material em texto
Arquitetura e Organização de Computadores Aritmética Computacional Parte II Prof. Sílvio Fernandes UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO DEPARTAMENTO DE CIÊNCIAS EXATAS E NATURAIS CURSO DE CIÊNCIA DA COMPUTAÇÃO 1 Multiplicação Multiplicando número em decimais Multiplicando Multiplicador Produto 2 Multiplicação Observações: número de bits do produto é muito maior que do multiplicando e multiplicador se ignorarmos os bits de sinal, e o tamanho do multiplicando for n bits e multiplicador for m bits, o produto terá n+m bits 3 Multiplicação Usando o algoritmo anterior 4 Multiplicação Construindo o hardware Suponha multiplicando e multiplicador em registradores de 32 bits e produto em registrador de 64 bits inicializado com 0 Precisamos mover o multiplicando para a esquerda um dígito a cada passo Durante 32 etapas, um multiplicando de 32 bits moveria 32 bits para esquerda Precisamos de um registrador Multiplicando de 64 bits, inicializado com o multiplicando de 32 bits na metade direita e 0 na metade esquerda Esse registrador é deslocado à esquerda a cada etapa, com a soma sendo acumulada no registrador Produto de 64 bits 5 Multiplicação Construindo o hardware 6 Multiplicação 7 Paso 0: Inicialização 8 Passo 1: verifica 9 Passo 1: soma 10 Passo 1: desloca 11 Passo 2: verifica 12 Passo 2: soma 13 Passo 2: desloca 14 Passo 3: verifica 15 Passo 3: apenas desloca 16 Passo 4: verifica 17 Passo 4: apenas desloca 18 Multiplicação Refinando para usar menos registradores O multiplicador inicia na metade direita do produto 19 Multiplicação Refinada 20 Passo 0: Inicialização 21 Passo 1: verifica e soma 22 Passo 1: desloca 23 Passo 2: verifica e soma 24 Passo 2: desloca 25 Passo 3: verifica e não soma 26 Passo 3: desloca 27 Passo 4: verifica e não soma 28 Passo 4: desloca 29 Multiplicação Multiplicando número negativos Solução 1: Converta para positivo, se for preciso. Multiplique como antes. Se sinais diferentes, negue a resposta. Solução 2: Algoritmo de Booth. 30 Multiplicação Booth 31 32 Contador=4 Passo 0 (7 x 3): Inicialização Passo 1 (7 x 3) 33 Contador=4 Passo 1 (7 x 3) 34 Contador=4 Passo 1 (7 x 3) 35 Contador=3Observe que repetimos o último número no deslocamento Passo 1 (7 x 3) 36 Contador=3 Passo 2 (7 x 3) 37 Contador=3 Passo 2 (7 x 3) 38 Contador=2Viu novamente? Passo 2 (7 x 3) 39 Contador=2 Passo 3 (7 x 3) 40 Contador=2 Passo 3 (7 x 3) 41 Contador=2 Passo 3 (7 x 3) 42 Contador=1 Passo 3 (7 x 3) 43 Contador=1 Passo 4 (7 x 3) 44 Contador=1 Passo 4 (7 x 3) 45 Contador=0 Passo 4 (7 x 3) 46 Contador=0 Passo 4 (7 x 3 = 21) 47 Multiplicação O MIPS oferece um par separado de registradores de 32 bits, para conter o produto de 64 bits, chamados Hi e Lo Instrução multiply (mult): com sinal Instrução multiply unsigned (multu): sem sinal Para apanhar o produto de 32 bits inteiro, o programador usa move from lo (mflo) O montador MIPS gera uma pseudo-instrução para multiplicar, que especifica 3 registradores de uso geral, gerando instruções mflo e mfhi para colocar o produto nos registradores 50 Divisão A operação recíproca da multiplicação EX: Dividir 1.001.010dec por 1000dec: Dividendo = Quociente x divisor + resto 51 Divisor 1000dec Quociente Dividendo Resto Divisão Algoritmo e Hardware da divisão 52 Divisor Deslocar à direita ALU 64 bits Resto Escrever Teste de controle Quociente Deslocar à esquerda Divisão Algoritmo e Hardware da divisão 53 Início 1. Subtrai o registrador Divisor do registrador Resto e colocar o resultado no registrador Resto Testar Resto Resto ≥ 0 Resto < 0 2a. Deslocar o registrador Quociente para esquerda, definindo o novo bit mais à direita com 1 2b. Restaurar o valor original, somando o registrador Divisor ao registrador Resto, e colocar a soma no registrador Resto. Também deslocar o registrador Quociente para esquerda, definindo o novo bit menos significativo como 0 3. Deslocar o registrador Divisor 1 bit para a direita 33ª opera ção? Não: < 33 repetições Sim: 33 repetições Fim 54 Tentar dividir 7dec por 2dec ou 0000 0111bin por 0010bin usando 4 bits Iteração Etapa Quociente Divisor Resto Valores Iniciais 1: Resto = Resto – Div 2b: Resto < 0 => +Div, sll Q, Q0 = 0 3: Deslocar Div direita 1: Resto = Resto – Div 2b: Resto < 0 => +Div, sll Q, Q0 = 0 3: Deslocar Div direita 1: Resto = Resto – Div 2b: Resto < 0 => +Div, sll Q, Q0 = 0 3: Deslocar Div direita 1: Resto = Resto – Div 2a: Resto ≥ 0 => sll Q, Q0 = 1 3: Deslocar Div direita 1: Resto = Resto – Div 2a: Resto ≥ 0 => sll Q, Q0 = 1 3: Deslocar Div direita Divisão Até aqui, ignoramos os número com sinal na divisão. A solução mais simples é lembrar os sinais do divisor e do dividendo e depois negar o quociente se os sinais forem diferentes Fazer com que o sinal do resto diferente de zero corresponda ao dividendo 55 Divisão Uma versão melhorada do Hardware 56 Divisor ALU 32 bits Resto Deslocar à direita Deslocar à esquerda Escrever Divisão Versão melhorada do Hardware Pode ser o mesmo usado para multiplicação O único requisito é um registrador de 64 bits, que pode deslocar para a esquerda ou para direita e uma ALU de 32 bits que soma ou subtraia 57 Divisão O MIPS utiliza os registradores Hi e Lo de 32 bits, tanto para multiplicação quanto para divisão Hi contém o resto Lo contém o quociente O MIPS possui 2 instruções Divide (div) Divide unsigned (divu) O montador MIPS permite que as instruções de divisão especifiquem 3 registradores, gerando as instruções mflo ou mfhi para colocar o resultado desejado em um registrador de uso geral 58 Divisão Instruções de divisão no MIPS ignoram o overflow, de modo que o software precisa determinar se o quociente é muito grande O software também precisa verificar se o divisor é igual a zero 59 Instruções MIPS reveladas até aqui 60 Categoria Instrução Exemplo Significado Comentário Aritmética Add add $s1, $s2, $s3 $s1 = $s2+$s3 3 operandos; overflow detectado Subtract sub $s1, $s2, $s3 $s1 = $s2-$s3 3 operandos; overflow detectado Add Immediate dddi $s1, $s2, 100 $s1 = $s2+100 +constante; overflow detectado Add unsigned addu $s1, $s2, $s3 $s1 = $s2 + $s3 3 operandos; overflow não detectado Subtract unsigned subu $s1, $s2, $s3 $s1 = $s2 - $s3 3 operandos; overflow não detectado Add immediate unsigned addiu $s1, $s2, 10 $s1 = $s2 + 10 +contante; overflow não detectado move from coprocessor register mfc0 $s1, $epc $s1 = $epc Usado para copiar PC de exceção mais outros registradores especiais multiply mult $s2, $s3 Hi, Lo = $s2*$s3 Produto com sinal, 64 bits, em Hi e Lo Multiply unsigned multu $s2, $s3 Hi, Lo = $s2*$s3 Produto sem sinal, 64 bits, em Hi e Lo Divide div $s2, $s3 Lo = $s2/$s3 Hi = $s2 mod $s3 Lo = quociente, Hi = resto Divide unsigned divu $s2, $s3 Lo = $s2/$s3 Hi = $s2 mod $s3 Quociente e resto sem sinal move from Hi mfhi $s1 $s1 = Hi Usado para obter cópia de Hi move from Lo mflo $s1 $s1 = Lo Usado para objer cópia de Lo Instruções MIPS reveladas até aqui61 Categoria Instrução Exemplo Significado Comentário Lógica And and $s1, $s2, $s3 $s1 = $s2 & $s3 3 operandos em reg; AND bit a bit Or or $s1, $s2, $s3 $s1 = $s2 | $s3 3 operandos em reg; OR bit a bit Nor nor $s1, $s2, $s3 $s1 = ~($s2 | $s3) 3 operandos em reg; NOR bit a bit And Immediate andi $s1, $s2, 100 $s1 = $s2 & 100 AND bit a bit entre reg. e constante Or Immediate ori $s1, $s2, 100 $s1 = $s2 | 100 OR bit a bit entre reg. e constante Shift left logical sll $s1, $s2, 10 $s1 = $s2 << 10 Deslocamento à esquerda por const. Shift rigth logical srl $s1, $s2, 10 $s1 = $s2 >> 10 Deslocamento à direita por const. Transferência de dados Load word lw $s1, 100($s2) $s1 = Mem[$s2+100] Dados da mem. para o registrador Store Word sw $s1, 100($s2) Mem[$s2+100] = $s1 Dados do registrador para a mem. load half lh $s1, 100($s2) $s1 = Mem[$s2+100] Halfword da memória para registrador store half sh $s1, 100($s2) Mem[$s2+100] = $s1 Halfword de um reg. para memória load byte lb $s1, 100($s2) $s1 = Mem[$s2+100] Byte da memória para registrador store byte sb $s1, 100($s2) Mem[$s2+100] = $s1 Byte de um registrador para memória load upper immed. lui $s1, 100 $s1 = 100 * 216 Carrega constante nos 16 bits mais altos Instruções MIPS reveladas até aqui 62 Categoria Instrução Exemplo Significado Comentário Desvio Condicional Branch on equal beq $s1, $s2, L If($s1 == $s2) go to L Testa igualdade e desvia Branch on not equal bne $s1, $s2, L If($s1 != $s2) go to L Testa desigualdade e desvia Set on less than stl $s1, $s2, $s3 If($s2 < $s3) $s1 = 1; Else $s1 = 0 Compara menor que Set less than immediate stli $s1, $s2, 100 If($s2 < 100) $s1 = 1; Else $s1 = 0 Compara menor que constante Desvio incondicional Jump j L go to L Desvia para endereço de destino Jump register jr $ra go to $ra Para switch e retorno de procedimento Jump and link jal L $ra = PC + 4 go to L Para chamada de procedimento Referências PATTERSON, D. A. ; HENNESSY, J.L. Organização e projeto de computadores – a interface hardware software. 3. ed. Editora Campus, 2005. STALLINGS, W. Arquitetura e organização de computadores: projeto para o desempenho. 8. ed. Prentice Hall, 2009. 63
Compartilhar