Exercício: multiplicar dois números usando o seguinto procedimento: 1. Carrega o valor de A em $s0 2. Carrega o valor de B em $s1 3. Zerar o registrador $s2 que conterá o resultado (usar xor) 4. Carrega o registrador $t0 com 1, para servir como máscara para comparação 5. Verifica se B ($s1) for zero. 5.1. Se afirmativo terminou a multiplicação, salta para passo 10 6. verifica se o bit menos significativo de B ($s1) e' igual a '1' ($t0) 6.1 Se afirmativo acumula o resultado ($s2) com A ($s0) 7. desloca B ($s1) um bit para a direita 8. desloca A ($s0) um bit para a esquerda 9. volta para 5 10. grava o conteúdo de $s2 no endereço res Pergunta: Qual o problema deste multiplicador? (DICA: pense nas limitações do mesmo) SOLUÇÃO: # # multiplicacao atraves de deslocamentos # .data A: .word 0x01234ABC B: .word 0x004A5F32 res: .word 0x00 .text .globl main main: la $s0, A lw $s0, 0($s0) # multiplicando em $s0 la $s1, B lw $s1, 0($s1) # multiplicador em $s1 xor $s2, $s2, $s2 # zera o resultado # outras opções de instrução para fazer a mesma coisa #addu $s2, $zero, $zero #ori $s2, $zero, 0 li $t0, 1 # máscara para comparação usando pseudo-intrução # outras opções de instrução para fazer a mesma coisa #addiu $t0, $zero, 1 #ori $t0, $zero, 1 #xori $t0, $zero, 1 loop: beq $s1,$zero, fim # quando B ($s1) for zero terminou a multiplicacao and $t1,$s1,$t0 # verifica se o bit menos significatvo de B ($s1) e' igual a '1' ($t0) beq $t1,$zero, n_soma # Se não evita soma, pulando a próxima instrução addu $s2, $s2, $s0 # se o bit for 1, soma ao resultado parcial n_soma: srl $s1,$s1,1 # desloca B para direita 1 bit sll $s0,$s0,1 # desloca A para esquerda 1 bit j loop # retorna ao início do laço fim: la $t0, res # toma endereço de memória onde colocar resultado sw $s2, 0($t0) # escreve resultado na memória ff: j ff # jump aqui para trancar simulação