J
juanma21
Guest
A parte que não estiver correto, após fmult, por favor!Eu tenho dias tentando descobrir por que ele não está funcionando??main.s #
# Testa o funcionamento da função de fmult comparando seu resultado
# Para que de uma instrução mul.s.
. Texto
. Testar globl
# Testa a função fmult.
# 1 de parâmetros (a0) multiplicando precisão simples em ponto flutuante
# 2 parâmetro (a1) de ponto flutuante de precisão simples multiplicador
teste: addi $ sp, $ sp, -16 # make espaço na pilha
sw $ ra, 0 ($ sp) # endereço de retorno preservar
sw $ s0, 4 ($ sp) # s0 preservar registros através s2
sw $ s1, 8 ($ sp)
sw $ s2, 12 ($ sp)
move $ s0, $ a0 # multiplicando em salvar $ s0
move $ s1, $ a1 # salvar multiplicador em $ s1
fmult jal # função chamada multiplicação
move $ s2, $ v0 # salvar resultado em s2
mtc1 $ s0, $ f12 parâmetro # = multiplicando
li $ v0, 2 # carrega a impressão "float" número syscall
syscall
la $ a0, str1 = str1 parâmetro #
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
mtc1 $ s1, $ f12 parâmetro # = multiplicador
li $ v0, 2 # carrega a impressão "float" número syscall
syscall
la $ a0, # parâmetro str2 = str2
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
mtc1 $ s0, $ f2
mtc1 $ s1, $ f4
mul.s $ f0, $ f2, $ f4 # multiplicar
$ F12, $ f0 # = parâmetro de produto mov.s
li $ v0, 2 # carrega a impressão "float" número syscall
syscall
la $ a0, endl parâmetro # = endl
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
la $ a0, str3 parâmetro # = str3
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
mtc1 $ s2, $ f12 parâmetro # = produto
li $ v0, 2 # carrega a impressão "float" número syscall
syscall
la $ a0, endl parâmetro # = endl
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
lw $ ra, 0 ($ sp) # endereço de retorno de restauração
lw $ s0, 4 ($ sp) # restaurar registros s0 através s2
lw $ s1, 8 ($ sp)
lw $ s2, 12 ($ sp)
$ Sp, addi $ sp, 16 # restaura ponteiro da pilha
Jr $ ra retornar #
. Globl principal
# Verifica vários casos de teste
# Em seguida, pede para a entrada de casos de teste adicionais.
addi $ sp: $ sp principal, -12 # make espaço na pilha
sw $ ra, 0 ($ sp) # endereço de retorno preservar
sw $ s0, 4 ($ sp) # preservar registros usados por esta função
sw $ s1, 8 ($ sp)
la $ s0, f1 # endereço do número de ponto flutuante primeiro
la s1, fn $ # endereço do número de ponto flutuante passado
Loop1:
lw $ a0, 0 ($ s0)
lw $ a1, 4 ($ s0)
teste jal
addi $ s0, 4
bne $ s0, $ s1, loop1
loop2:
la $ a0, prompt parâmetro # = prompt
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
li $ v0, 6 # carrega a "ler float syscall número"
syscall
mfc1 $ s0, $ f0 # s0 = multiplicando-ponto flutuante
la $ a0, prompt parâmetro # = prompt
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
li $ v0, 6 # carrega a "ler float syscall número"
syscall
mfc1 $ s1, $ f0 # s1 = multiplicador de ponto flutuante
move $ a0, $ s0
move $ a1, $ s1
teste jal
j loop2 # loop para sempre
li $ v0, 0 valor de retorno #
lw $ ra, 0 ($ sp) # endereço de retorno de restauração
lw $ s0, 4 ($ sp) # restaurar registros usados por esta função
lw $ s1, 8 ($ sp)
$ Sp, addi $ sp, 12 # restaura ponteiro da pilha
Jr $ ra retornar #
. Dados
# Testar casos:
# Verifique todas as 4 combinações de sinais
# Check zero como um dos operandos (ou ambos)
# Check uma operando como um
# Check normalização dos resultados com 01, 10, 11 à esquerda do ponto binário
# Check for expoentes superior a 1
# (De modo que haverá excesso de expoente tendenciosa intermediário)
# Verifique se os resultados com pares e ímpares expoentes
# Check for expoentes negativos
# Verifique o resultado com 1 no bit menos significativo
F1:. float 1.0 # 1,0000 x 2 ^ 0
. Float # -2,0 -1,0000 x 2 ^ 1
. Float # -5,0 -1,2500 x 2 ^ 2
. Float 12,0 # 1,5000 x 2 ^ 3
. Float -14,0 # -1,7500 x 2 ^ 3
. Flutuante 0.0
. Flutuante 0.0
. Float 62,0 # 1,9375 x 2 ^ 5
. Float 112,0 # 1,7500 x 2 ^ 6
fn:. 0xBE000004 palavra resultado # 1 terá em pouco menos significativo
prompt:. asciiz "Digite um número de ponto flutuante:"
str1:. asciiz "multiplicado pelo"
str2:. asciiz "é"
str3:. asciiz "Sua resposta foi"
endl:. asciiz \ n ""float.s #
# Ponto flutuante multiplicação. Texto
. Fmult globl# Pré-requisitos:
# 1 de parâmetros (a0) multiplicando precisão simples em ponto flutuante
# 2 parâmetro (a1) de ponto flutuante de precisão simples multiplicador
Postconditions #:
# resultado (v0), único produto de precisão de ponto flutuantefmult: li $ v0, 0 # v0 = 0, o resultado padrão
beq $ a0, $ zero, fmult retornar # se multiplicando é zero
beq $ a1, $ zero, fmult retorno # if multiplicador é zero# Máscara lugar para pouco mais à esquerda em t5
li $ t5, 0x80000000 # t5 = 0x80000000# Sinal de lugar multiplicando em t0
e US $ t0, $ a0, $ t5 máscara # fora expoente e significand# Sinal local de multiplicadores em t1
e US $ t1, $ a1, $ t5 máscara # fora expoente e significand# Sinal local do produto em t2
xor $ t2, $ t0, $ t1 # t2 = xor de sinais# Expoente multiplicando em lugar de t0
t0, $ a0, 1 # shift para remover bit de sinal $ sll
srl $ t0, $ t0, 24 # shift para remover bits significand
li $ t6, 127 # viés expoente subtrair
sub $ t0, $ t0, $ t6# Expoente local de multiplicadores em t1
t1, $ a1, 1 # shift para remover bit de sinal $ sll
srl $ t1, $ t1, 24 shift # para remover pedaços significand
li $ t7, 127 # viés expoente subtrair
sub $ t1, $ t1, $ t7# Expoente local do produto em t3
# Ignore a possibilidade de overflow ou underflow
add $ t3, $ t1, $ t0 # t3 = soma dos expoentes
addi $ t3, $ t3, 127 # adicionar viés expoente# significando lugar de multiplicando em t0
sll $ t0, $ a0, 9 shift # para remover expoente
srl $ t0, $ t0, 9
li $ t5, 0x00800000 # restaurar implícita de 1 a esquerda do significand
ou US $ t0, $ t5, $ t0# significando lugar de multiplicadores em t1
sll $ t1, $ a1, 9 shift # para remover expoente
srl $ t1, $ t1, 9
ou US $ t1, $ t5, $ t1 # restaurar implícita de 1 a esquerda do significand
# significando lugar de produto em t4
# Ignore arredondamento e overflow
multu $ t0, $ t1 # multiplicar significands (unsigned)
mfhi $ t4 # t4 = palavra de alta do produto
bge $ t4, $ zero, norma ramo # se já normalizado
srl $ t4, $ t4, # 1 turno significando a normalizar
addi $ t3, $ t3, 1 # ajustar expoente
norma: sll $ t4, $ t4, # 2 turnos para remover implícito 1# Montar produtos em v0
sll $ t3, $ t3, 23 expoente mudança na posição # bom
srl $ t4, $ t4, 9 # significand mudança na posição correcta
move $ v0, $ t2 sinal # em lugar v0
ou US $ v0, $ v0, $ t3 # expoente lugar em v0
ou US $ v0, $ v0, $ t4 # significand lugar em v0: Jr $ ra retornar retorno #
# Testa o funcionamento da função de fmult comparando seu resultado
# Para que de uma instrução mul.s.
. Texto
. Testar globl
# Testa a função fmult.
# 1 de parâmetros (a0) multiplicando precisão simples em ponto flutuante
# 2 parâmetro (a1) de ponto flutuante de precisão simples multiplicador
teste: addi $ sp, $ sp, -16 # make espaço na pilha
sw $ ra, 0 ($ sp) # endereço de retorno preservar
sw $ s0, 4 ($ sp) # s0 preservar registros através s2
sw $ s1, 8 ($ sp)
sw $ s2, 12 ($ sp)
move $ s0, $ a0 # multiplicando em salvar $ s0
move $ s1, $ a1 # salvar multiplicador em $ s1
fmult jal # função chamada multiplicação
move $ s2, $ v0 # salvar resultado em s2
mtc1 $ s0, $ f12 parâmetro # = multiplicando
li $ v0, 2 # carrega a impressão "float" número syscall
syscall
la $ a0, str1 = str1 parâmetro #
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
mtc1 $ s1, $ f12 parâmetro # = multiplicador
li $ v0, 2 # carrega a impressão "float" número syscall
syscall
la $ a0, # parâmetro str2 = str2
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
mtc1 $ s0, $ f2
mtc1 $ s1, $ f4
mul.s $ f0, $ f2, $ f4 # multiplicar
$ F12, $ f0 # = parâmetro de produto mov.s
li $ v0, 2 # carrega a impressão "float" número syscall
syscall
la $ a0, endl parâmetro # = endl
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
la $ a0, str3 parâmetro # = str3
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
mtc1 $ s2, $ f12 parâmetro # = produto
li $ v0, 2 # carrega a impressão "float" número syscall
syscall
la $ a0, endl parâmetro # = endl
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
lw $ ra, 0 ($ sp) # endereço de retorno de restauração
lw $ s0, 4 ($ sp) # restaurar registros s0 através s2
lw $ s1, 8 ($ sp)
lw $ s2, 12 ($ sp)
$ Sp, addi $ sp, 16 # restaura ponteiro da pilha
Jr $ ra retornar #
. Globl principal
# Verifica vários casos de teste
# Em seguida, pede para a entrada de casos de teste adicionais.
addi $ sp: $ sp principal, -12 # make espaço na pilha
sw $ ra, 0 ($ sp) # endereço de retorno preservar
sw $ s0, 4 ($ sp) # preservar registros usados por esta função
sw $ s1, 8 ($ sp)
la $ s0, f1 # endereço do número de ponto flutuante primeiro
la s1, fn $ # endereço do número de ponto flutuante passado
Loop1:
lw $ a0, 0 ($ s0)
lw $ a1, 4 ($ s0)
teste jal
addi $ s0, 4
bne $ s0, $ s1, loop1
loop2:
la $ a0, prompt parâmetro # = prompt
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
li $ v0, 6 # carrega a "ler float syscall número"
syscall
mfc1 $ s0, $ f0 # s0 = multiplicando-ponto flutuante
la $ a0, prompt parâmetro # = prompt
li $ v0, 4 # carrega a cadeia "print" número syscall
syscall
li $ v0, 6 # carrega a "ler float syscall número"
syscall
mfc1 $ s1, $ f0 # s1 = multiplicador de ponto flutuante
move $ a0, $ s0
move $ a1, $ s1
teste jal
j loop2 # loop para sempre
li $ v0, 0 valor de retorno #
lw $ ra, 0 ($ sp) # endereço de retorno de restauração
lw $ s0, 4 ($ sp) # restaurar registros usados por esta função
lw $ s1, 8 ($ sp)
$ Sp, addi $ sp, 12 # restaura ponteiro da pilha
Jr $ ra retornar #
. Dados
# Testar casos:
# Verifique todas as 4 combinações de sinais
# Check zero como um dos operandos (ou ambos)
# Check uma operando como um
# Check normalização dos resultados com 01, 10, 11 à esquerda do ponto binário
# Check for expoentes superior a 1
# (De modo que haverá excesso de expoente tendenciosa intermediário)
# Verifique se os resultados com pares e ímpares expoentes
# Check for expoentes negativos
# Verifique o resultado com 1 no bit menos significativo
F1:. float 1.0 # 1,0000 x 2 ^ 0
. Float # -2,0 -1,0000 x 2 ^ 1
. Float # -5,0 -1,2500 x 2 ^ 2
. Float 12,0 # 1,5000 x 2 ^ 3
. Float -14,0 # -1,7500 x 2 ^ 3
. Flutuante 0.0
. Flutuante 0.0
. Float 62,0 # 1,9375 x 2 ^ 5
. Float 112,0 # 1,7500 x 2 ^ 6
fn:. 0xBE000004 palavra resultado # 1 terá em pouco menos significativo
prompt:. asciiz "Digite um número de ponto flutuante:"
str1:. asciiz "multiplicado pelo"
str2:. asciiz "é"
str3:. asciiz "Sua resposta foi"
endl:. asciiz \ n ""float.s #
# Ponto flutuante multiplicação. Texto
. Fmult globl# Pré-requisitos:
# 1 de parâmetros (a0) multiplicando precisão simples em ponto flutuante
# 2 parâmetro (a1) de ponto flutuante de precisão simples multiplicador
Postconditions #:
# resultado (v0), único produto de precisão de ponto flutuantefmult: li $ v0, 0 # v0 = 0, o resultado padrão
beq $ a0, $ zero, fmult retornar # se multiplicando é zero
beq $ a1, $ zero, fmult retorno # if multiplicador é zero# Máscara lugar para pouco mais à esquerda em t5
li $ t5, 0x80000000 # t5 = 0x80000000# Sinal de lugar multiplicando em t0
e US $ t0, $ a0, $ t5 máscara # fora expoente e significand# Sinal local de multiplicadores em t1
e US $ t1, $ a1, $ t5 máscara # fora expoente e significand# Sinal local do produto em t2
xor $ t2, $ t0, $ t1 # t2 = xor de sinais# Expoente multiplicando em lugar de t0
t0, $ a0, 1 # shift para remover bit de sinal $ sll
srl $ t0, $ t0, 24 # shift para remover bits significand
li $ t6, 127 # viés expoente subtrair
sub $ t0, $ t0, $ t6# Expoente local de multiplicadores em t1
t1, $ a1, 1 # shift para remover bit de sinal $ sll
srl $ t1, $ t1, 24 shift # para remover pedaços significand
li $ t7, 127 # viés expoente subtrair
sub $ t1, $ t1, $ t7# Expoente local do produto em t3
# Ignore a possibilidade de overflow ou underflow
add $ t3, $ t1, $ t0 # t3 = soma dos expoentes
addi $ t3, $ t3, 127 # adicionar viés expoente# significando lugar de multiplicando em t0
sll $ t0, $ a0, 9 shift # para remover expoente
srl $ t0, $ t0, 9
li $ t5, 0x00800000 # restaurar implícita de 1 a esquerda do significand
ou US $ t0, $ t5, $ t0# significando lugar de multiplicadores em t1
sll $ t1, $ a1, 9 shift # para remover expoente
srl $ t1, $ t1, 9
ou US $ t1, $ t5, $ t1 # restaurar implícita de 1 a esquerda do significand
# significando lugar de produto em t4
# Ignore arredondamento e overflow
multu $ t0, $ t1 # multiplicar significands (unsigned)
mfhi $ t4 # t4 = palavra de alta do produto
bge $ t4, $ zero, norma ramo # se já normalizado
srl $ t4, $ t4, # 1 turno significando a normalizar
addi $ t3, $ t3, 1 # ajustar expoente
norma: sll $ t4, $ t4, # 2 turnos para remover implícito 1# Montar produtos em v0
sll $ t3, $ t3, 23 expoente mudança na posição # bom
srl $ t4, $ t4, 9 # significand mudança na posição correcta
move $ v0, $ t2 sinal # em lugar v0
ou US $ v0, $ v0, $ t3 # expoente lugar em v0
ou US $ v0, $ v0, $ t4 # significand lugar em v0: Jr $ ra retornar retorno #