cvt.s.w MIPS 中的指令似乎没有做任何事情
cvt.s.w Instruction in MIPS does not seem to do anything
我的教授问“cvt.s.w指令是做什么的?如果我们不使用它会出现什么问题?”
在我的汇编程序中,即使我删除了这些代码行,程序仍然可以正常运行。我在这里遗漏了什么或者 cvt.s.w 在这种情况下实际上什么都不做吗?这是他提供的问题代码:
.data
THIRD: .float 3.3
.text
li $t0, 10 # Put 10 in coprocessor
mtc1 $t0, $f0
cvt.s.w $f0, $f0
li $t0, 11 # Put 1.1 in coprocessor
mtc1 $t0, $f1
cvt.s.w $f1, $f1
div.s $f1, $f1, $f0
li $t0, 22 # Put 2.2 in coprocessor
mtc1 $t0, $f2
cvt.s.w $f2, $f2
div.s $f2, $f2, $f0
la $t0, THIRD # Put 3.3 in coprocessor
l.s $f3, 0($t0)
add.s $f12, $f1, $f2 # Add and print results
add.s $f12, $f12, $f3
li $v0, 2
syscall
li $a0, 10 # Print newline
li $v0, 11
syscall
add.s $f12, $f2, $f3 # Add and print results
add.s $f12, $f12, $f1
li $v0, 2
syscall
li $v0, 10 # Exit program
syscall
你老师在逗你呢。这些示例经过精心构建,不会导致任何可见的变化。
您查看调试器中的值了吗?
也许尝试打印各种中间值?
如果不使用 cvt.s.w,中间值肯定会有所不同。如果不进行转换,这些数字将被视为非常非常小的浮点值。
令人惊讶的是,除法仍然有效,因为数字之间的相对关系仍然存在。
另外,当我们在浮点数中计算一个大值+一个小值时,通常小值会消失。这样想:在 3 位数字中,让我们将 3.14 添加到 0.000456。两个数字都有 3 位精度,但是将它们相加会得到什么? 3.14,三位数。
单个浮点数只有大约 6.5 位精度,因此非常小的数字添加到正常大小的数字中,唯一保持正常大小的数字。
这是一个完全相同的版本,但增加了中间值的打印。您会发现其中一些完全不同。
包含 cvt.s.w 输出为:
11.0
1.1
22.0
2.2
3.3000002
6.6000004
5.5
6.6
-- program is finished running --
并使用 cvt.s.w 排除 输出为:
1.4E-44
1.5E-44
1.1
3.1E-44
2.2
3.3000002
6.6000004
5.5
6.6
-- program is finished running --
.data
THIRD: .float 3.3
.text
li $t0, 10 # Put 10 in coprocessor
mtc1 $t0, $f0
cvt.s.w $f0, $f0
mov.s $f12, $f0
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
li $t0, 11 # Put 1.1 in coprocessor
mtc1 $t0, $f1
cvt.s.w $f1, $f1
mov.s $f12, $f1
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
div.s $f1, $f1, $f0
mov.s $f12, $f1
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
li $t0, 22 # Put 2.2 in coprocessor
mtc1 $t0, $f2
cvt.s.w $f2, $f2
mov.s $f12, $f2
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
div.s $f2, $f2, $f0
mov.s $f12, $f2
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
la $t0, THIRD # Put 3.3 in coprocessor
l.s $f3, 0($t0)
add.s $f12, $f1, $f2 # Add and print results
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
add.s $f12, $f12, $f3
li $v0, 2
syscall
li $a0, 10 # Print newline
li $v0, 11
syscall
add.s $f12, $f2, $f3 # Add and print results
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
add.s $f12, $f12, $f1
li $v0, 2
syscall
li $v0, 10 # Exit program
syscall
我的教授问“cvt.s.w指令是做什么的?如果我们不使用它会出现什么问题?”
在我的汇编程序中,即使我删除了这些代码行,程序仍然可以正常运行。我在这里遗漏了什么或者 cvt.s.w 在这种情况下实际上什么都不做吗?这是他提供的问题代码:
.data
THIRD: .float 3.3
.text
li $t0, 10 # Put 10 in coprocessor
mtc1 $t0, $f0
cvt.s.w $f0, $f0
li $t0, 11 # Put 1.1 in coprocessor
mtc1 $t0, $f1
cvt.s.w $f1, $f1
div.s $f1, $f1, $f0
li $t0, 22 # Put 2.2 in coprocessor
mtc1 $t0, $f2
cvt.s.w $f2, $f2
div.s $f2, $f2, $f0
la $t0, THIRD # Put 3.3 in coprocessor
l.s $f3, 0($t0)
add.s $f12, $f1, $f2 # Add and print results
add.s $f12, $f12, $f3
li $v0, 2
syscall
li $a0, 10 # Print newline
li $v0, 11
syscall
add.s $f12, $f2, $f3 # Add and print results
add.s $f12, $f12, $f1
li $v0, 2
syscall
li $v0, 10 # Exit program
syscall
你老师在逗你呢。这些示例经过精心构建,不会导致任何可见的变化。
您查看调试器中的值了吗?
也许尝试打印各种中间值?
如果不使用 cvt.s.w,中间值肯定会有所不同。如果不进行转换,这些数字将被视为非常非常小的浮点值。
令人惊讶的是,除法仍然有效,因为数字之间的相对关系仍然存在。
另外,当我们在浮点数中计算一个大值+一个小值时,通常小值会消失。这样想:在 3 位数字中,让我们将 3.14 添加到 0.000456。两个数字都有 3 位精度,但是将它们相加会得到什么? 3.14,三位数。
单个浮点数只有大约 6.5 位精度,因此非常小的数字添加到正常大小的数字中,唯一保持正常大小的数字。
这是一个完全相同的版本,但增加了中间值的打印。您会发现其中一些完全不同。
包含 cvt.s.w 输出为:
11.0
1.1
22.0
2.2
3.3000002
6.6000004
5.5
6.6
-- program is finished running --
并使用 cvt.s.w 排除 输出为:
1.4E-44
1.5E-44
1.1
3.1E-44
2.2
3.3000002
6.6000004
5.5
6.6
-- program is finished running --
.data
THIRD: .float 3.3
.text
li $t0, 10 # Put 10 in coprocessor
mtc1 $t0, $f0
cvt.s.w $f0, $f0
mov.s $f12, $f0
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
li $t0, 11 # Put 1.1 in coprocessor
mtc1 $t0, $f1
cvt.s.w $f1, $f1
mov.s $f12, $f1
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
div.s $f1, $f1, $f0
mov.s $f12, $f1
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
li $t0, 22 # Put 2.2 in coprocessor
mtc1 $t0, $f2
cvt.s.w $f2, $f2
mov.s $f12, $f2
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
div.s $f2, $f2, $f0
mov.s $f12, $f2
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
la $t0, THIRD # Put 3.3 in coprocessor
l.s $f3, 0($t0)
add.s $f12, $f1, $f2 # Add and print results
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
add.s $f12, $f12, $f3
li $v0, 2
syscall
li $a0, 10 # Print newline
li $v0, 11
syscall
add.s $f12, $f2, $f3 # Add and print results
li $v0, 2
syscall
li $a0, 10
li $v0, 11
syscall
add.s $f12, $f12, $f1
li $v0, 2
syscall
li $v0, 10 # Exit program
syscall