Assembly MIPS汇编(MARS 4.5):浮点算术答案很奇怪

Assembly MIPS汇编(MARS 4.5):浮点算术答案很奇怪,assembly,mips,Assembly,Mips,我正在制作一个MIPS程序来计算5.4xy-12.3y+18.23x-8.23y,其中x和y是来自控制台的输入。然而,结果太奇怪了。这是我的密码: .data promptX: .asciiz "Enter x: \n" promptY: .asciiz "Enter y: \n" result: .asciiz "Result: " first: .float 5.40 second: .float -12.30 third: .float 18

我正在制作一个MIPS程序来计算5.4xy-12.3y+18.23x-8.23y,其中x和y是来自控制台的输入。然而,结果太奇怪了。这是我的密码:

.data
    promptX: .asciiz "Enter x: \n"
    promptY: .asciiz "Enter y: \n"
    result: .asciiz "Result: "
    first: .float 5.40
    second: .float -12.30
    third: .float 18.23
    fourth: .float -8.23
.text

    # Print prompt to input x
    li $v0, 4
    la $a0, promptX
    syscall

    # Get x, store in f2
    li $v0, 7
    syscall
    mov.d $f2, $f0

    # Prompt input y
    li $v0, 4
    la $a0, promptY
    syscall

    # Get y, store in f4
    li $v0, 7
    syscall
    mov.d $f4, $f0


    # f6 = xy
    mul.d $f6, $f2, $f4

    # load 5.4 to f8
    lwc1 $f8, first

    # f6 = 5.4xy
    mul.d $f6, $f6, $f8

    # load -12.3 to f8
    lwc1 $f8, second
    # f8 = -12.3y
    mul.d $f8, $f8, $f4


    # f6 = 5.4xy - 12.3y
    add.d $f6, $f6, $f8

    # load 18.23 to f8
    lwc1 $f8, third
    # f8 = 18.23x
    mul.d $f8, $f8, $f2
    # f6 = 5.4xy - 12.3y + 18.23x
    add.d $f6, $f6, $f8

    # load -8.23 to f8
    lwc1 $f8, fourth

    # f6 = 5.4xy - 12.3y + 18.23x + (- 8.23)
    add.d $f12, $f6, $f8

    # Print answer
    li $v0, 4
    la $a0, result
    syscall

    li $v0, 2
    syscall


    # End program
    li $v0, 10
    syscall
当我输入x=2.13和y=2.13时,它返回1.26719E-10,其中应为28.90016。我反复检查了很多次代码,但仍然不知道为什么。非常感谢您的帮助。

您正在混合单精度和双精度数字

.data部分中的系数是float 您将输入读取为双精度 使用lwc1作为浮点加载系数 将mul.d和add.d作为double执行计算 将结果打印为float 将所有内容切换到相同的精度,您的代码将正常工作。

您正在混合单精度和双精度数字

.data部分中的系数是float 您将输入读取为双精度 使用lwc1作为浮点加载系数 将mul.d和add.d作为double执行计算 将结果打印为float 将所有内容切换到相同的精度,您的代码将正常工作。

这将起作用:

.data
    promptX: .asciiz "Enter x: \n"
    promptY: .asciiz "Enter y: \n"
    result: .asciiz "Result: "
    first: .double 5.40
    second: .double -12.30
    third: .double 18.23
    fourth: .double -8.23
.text

    # Print prompt to input x
    li $v0, 4
    la $a0, promptX
    syscall

    # Get x, store in f2
    li $v0, 7
    syscall
    mov.d $f2, $f0

    # Prompt input y
    li $v0, 4
    la $a0, promptY
    syscall

    # Get y, store in f4
    li $v0, 7
    syscall
    mov.d $f4, $f0


    # f6 = xy
    mul.d $f6, $f2, $f4
    #mul.d $f2, $f4, $f6

    # load 5.4 to f8
    l.d $f8, first

    # f6 = 5.4xy
    #mul.d $f6, $f6, $f8
    mul.d $f6, $f6, $f8

    # load -12.3 to f8
    l.d $f8, second
    # f8 = -12.3y
    mul.d $f8, $f8, $f4


    # f6 = 5.4xy - 12.3y
    add.d $f6, $f6, $f8

    # load 18.23 to f8
    l.d $f8, third
    # f8 = 18.23x
    mul.d $f8, $f8, $f2
    # f6 = 5.4xy - 12.3y + 18.23x
    add.d $f6, $f6, $f8

    # load -8.23 to f8
    l.d $f8, fourth

    # f6 = 5.4xy - 12.3y + 18.23x + (- 8.23)
    add.d $f12, $f6, $f8

    # Print answer
    li $v0, 4
    la $a0, result
    syscall

    li $v0, 3

    syscall


    # End program
    li $v0, 10
    syscall
你把精确度搞混了。我把所有的东西都做成了双份。最后,您试图打印一个v0中有2个的浮点,您需要3个v0来打印一个双精度浮点

我注意到的另一个问题是将数据从内存加载到寄存器的方式。我把它们换成了l.d,数值加载正确

这将起作用:

.data
    promptX: .asciiz "Enter x: \n"
    promptY: .asciiz "Enter y: \n"
    result: .asciiz "Result: "
    first: .double 5.40
    second: .double -12.30
    third: .double 18.23
    fourth: .double -8.23
.text

    # Print prompt to input x
    li $v0, 4
    la $a0, promptX
    syscall

    # Get x, store in f2
    li $v0, 7
    syscall
    mov.d $f2, $f0

    # Prompt input y
    li $v0, 4
    la $a0, promptY
    syscall

    # Get y, store in f4
    li $v0, 7
    syscall
    mov.d $f4, $f0


    # f6 = xy
    mul.d $f6, $f2, $f4
    #mul.d $f2, $f4, $f6

    # load 5.4 to f8
    l.d $f8, first

    # f6 = 5.4xy
    #mul.d $f6, $f6, $f8
    mul.d $f6, $f6, $f8

    # load -12.3 to f8
    l.d $f8, second
    # f8 = -12.3y
    mul.d $f8, $f8, $f4


    # f6 = 5.4xy - 12.3y
    add.d $f6, $f6, $f8

    # load 18.23 to f8
    l.d $f8, third
    # f8 = 18.23x
    mul.d $f8, $f8, $f2
    # f6 = 5.4xy - 12.3y + 18.23x
    add.d $f6, $f6, $f8

    # load -8.23 to f8
    l.d $f8, fourth

    # f6 = 5.4xy - 12.3y + 18.23x + (- 8.23)
    add.d $f12, $f6, $f8

    # Print answer
    li $v0, 4
    la $a0, result
    syscall

    li $v0, 3

    syscall


    # End program
    li $v0, 10
    syscall
你把精确度搞混了。我把所有的东西都做成了双份。最后,您试图打印一个v0中有2个的浮点,您需要3个v0来打印一个双精度浮点

我注意到的另一个问题是将数据从内存加载到寄存器的方式。我把它们换成了l.d,数值加载正确