MIPS 汇编 (MARS 4.5):浮点算术答案很奇怪
MIPS Assembly (MARS 4.5): floating point arithmetric answer is weird
我正在编写一个 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 时,它 returns 1.26719E-10,它应该是 28.90016。我多次重新检查代码,但仍然不知道为什么。感谢任何帮助。
您混合了单精度和双精度 数字。
.data
部分的系数为float
- 您将输入读取为 double
- 您将系数(使用
lwc1
)加载为 float
- 您执行计算(
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 的浮点数,你需要在 v0 中打印一个双精度数。
我注意到的另一个问题是您将数据从内存加载到寄存器的方式。我将它们切换为 l.d,并且正确加载了值。
我正在编写一个 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 时,它 returns 1.26719E-10,它应该是 28.90016。我多次重新检查代码,但仍然不知道为什么。感谢任何帮助。
您混合了单精度和双精度 数字。
.data
部分的系数为float- 您将输入读取为 double
- 您将系数(使用
lwc1
)加载为 float - 您执行计算(
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 的浮点数,你需要在 v0 中打印一个双精度数。
我注意到的另一个问题是您将数据从内存加载到寄存器的方式。我将它们切换为 l.d,并且正确加载了值。