pode agradar a alguém me diga porque este código não funciona boa

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 #

 

Welcome to EDABoard.com

Sponsor

Back
Top