MIPS 浮点数、无穷大和 nan 练习
MIPS float numbers, infinity and nan exercise
我正在尝试编写一个程序来执行一些计算,如下面的程序所示。我在 QtSpim 中 运行 它,但它显示了我如何加载无限和可能其他 lwc1 的错误,我不知道如何实际加载它们。我知道程序会在我的计算结果中显示错误,这个练习只是为了练习,看看 MIPS 在任何情况下是如何工作的。
.text
.globl main
main:
la $a0, msgx #Print msgx
li $v0, 4
syscall
li $v0, 6 #Type x
syscall
s.s $f0, float1
la $a0, endl #New line
li $v0, 4
syscall
la $a0, msgy #Print msgy
li $v0, 4
syscall
li $v0, 6 #Type y
syscall
s.s $f0, float2
la $a0, float1 #load x
l.s $f1, 0($a0)
la $a1, float2 #load y
l.d $f2, 0($a1)
la $s0, zero #load 0.0
l.s $f3, 0($t0)
la $s1, plus #load plus infinity
lwc1 $f4, 0($t1)
la $s2, minus #load minus infinity
lwc1 $f5, 0($t2)
la $s3, NaN #load NaN
lwc1 $f6, 0($t3)
mul.s $f0, $f1, $f2 # x * y
#mul.s $f0, $f1, $f5 # x * (minus inf)
#div.s $f0, $f2, $f3 # y / 0
#div.s $f0, $f3, $f3 # 0 / 0
#mul.s $f0, $f3, $f4 # 0 * (plus inf)
#mul.s $f0, $f4, $f5 # (plus inf) * (minus inf)
#add.s $f0, $f4, $f5 # (plus inf) + (minus inf)
#mul.s $f0, $f1, $f6 # x * NaN
mov.s $f12, $f0
li $v0, 2
syscall
li $v0, 10
syscall
.end main
.data
msgx: .asciiz "Write x: "
endl: .asciiz "\n"
msgy: .asciiz "Write y: "
float1: .float 0.0 # $f1
float2: .float 0.0 # $f2
zero: .float 0.0
plus: .word 7F800000
minus: .word FF800000
NaN: .word FFFFFFFF
.text
.globl main
main:
la $a0, msgx #Print msgx
li $v0, 4
syscall
li $v0, 6 #Type x
syscall
s.s $f0, float1
la $a0, endl #New line
li $v0, 4
syscall
la $a0, msgy #Print msgy
li $v0, 4
syscall
li $v0, 6 #Type y
syscall
s.s $f0, float2
la $a0, float1 #load x
l.s $f1, 0($a0)
la $a1, float2 #load y
l.s $f2, 0($a1)
la $s0, zero #load 0.0
lwc1 $f3, 0($s0)
la $s1, plus #load plus infinity
lwc1 $f4, 0($s1)
la $s2, minus #load minus infinity
lwc1 $f5, 0($s2)
la $s3, NaN #load NaN
lwc1 $f6, 0($s3)
mul.s $f0, $f1, $f2 # x * y
mul.s $f7, $f1, $f5 # x * (minus inf)
div.s $f8, $f2, $f3 # y / 0
div.s $f9, $f3, $f3 # 0 / 0
mul.s $f10, $f3, $f4 # 0 * (plus inf)
mul.s $f11, $f4, $f5 # (plus inf) * (minus inf)
add.s $f13, $f4, $f5 # (plus inf) + (minus inf)
mul.s $f14, $f1, $f6 # x * NaN
la $a0, endl #New line
li $v0, 4
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f0
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f7
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f8
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f9
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f10
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f11
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f13
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f14
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
li $v0, 10
syscall
.end main
.data
msgx: .asciiz "Write x: "
endl: .asciiz "\n"
msgy: .asciiz "Write y: "
float1: .float 0.0 # $f1
float2: .float 0.0 # $f2
zero: .float 0.0
plus: .word 0x7F800000
minus: .word 0xFF800000
NaN: .word 0x7FBFFFFF
我正在尝试编写一个程序来执行一些计算,如下面的程序所示。我在 QtSpim 中 运行 它,但它显示了我如何加载无限和可能其他 lwc1 的错误,我不知道如何实际加载它们。我知道程序会在我的计算结果中显示错误,这个练习只是为了练习,看看 MIPS 在任何情况下是如何工作的。
.text
.globl main
main:
la $a0, msgx #Print msgx
li $v0, 4
syscall
li $v0, 6 #Type x
syscall
s.s $f0, float1
la $a0, endl #New line
li $v0, 4
syscall
la $a0, msgy #Print msgy
li $v0, 4
syscall
li $v0, 6 #Type y
syscall
s.s $f0, float2
la $a0, float1 #load x
l.s $f1, 0($a0)
la $a1, float2 #load y
l.d $f2, 0($a1)
la $s0, zero #load 0.0
l.s $f3, 0($t0)
la $s1, plus #load plus infinity
lwc1 $f4, 0($t1)
la $s2, minus #load minus infinity
lwc1 $f5, 0($t2)
la $s3, NaN #load NaN
lwc1 $f6, 0($t3)
mul.s $f0, $f1, $f2 # x * y
#mul.s $f0, $f1, $f5 # x * (minus inf)
#div.s $f0, $f2, $f3 # y / 0
#div.s $f0, $f3, $f3 # 0 / 0
#mul.s $f0, $f3, $f4 # 0 * (plus inf)
#mul.s $f0, $f4, $f5 # (plus inf) * (minus inf)
#add.s $f0, $f4, $f5 # (plus inf) + (minus inf)
#mul.s $f0, $f1, $f6 # x * NaN
mov.s $f12, $f0
li $v0, 2
syscall
li $v0, 10
syscall
.end main
.data
msgx: .asciiz "Write x: "
endl: .asciiz "\n"
msgy: .asciiz "Write y: "
float1: .float 0.0 # $f1
float2: .float 0.0 # $f2
zero: .float 0.0
plus: .word 7F800000
minus: .word FF800000
NaN: .word FFFFFFFF
.text
.globl main
main:
la $a0, msgx #Print msgx
li $v0, 4
syscall
li $v0, 6 #Type x
syscall
s.s $f0, float1
la $a0, endl #New line
li $v0, 4
syscall
la $a0, msgy #Print msgy
li $v0, 4
syscall
li $v0, 6 #Type y
syscall
s.s $f0, float2
la $a0, float1 #load x
l.s $f1, 0($a0)
la $a1, float2 #load y
l.s $f2, 0($a1)
la $s0, zero #load 0.0
lwc1 $f3, 0($s0)
la $s1, plus #load plus infinity
lwc1 $f4, 0($s1)
la $s2, minus #load minus infinity
lwc1 $f5, 0($s2)
la $s3, NaN #load NaN
lwc1 $f6, 0($s3)
mul.s $f0, $f1, $f2 # x * y
mul.s $f7, $f1, $f5 # x * (minus inf)
div.s $f8, $f2, $f3 # y / 0
div.s $f9, $f3, $f3 # 0 / 0
mul.s $f10, $f3, $f4 # 0 * (plus inf)
mul.s $f11, $f4, $f5 # (plus inf) * (minus inf)
add.s $f13, $f4, $f5 # (plus inf) + (minus inf)
mul.s $f14, $f1, $f6 # x * NaN
la $a0, endl #New line
li $v0, 4
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f0
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f7
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f8
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f9
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f10
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f11
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f13
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
mov.s $f12, $f14
li $v0, 2
syscall
la $a0, endl #New line
li $v0, 4
syscall
li $v0, 10
syscall
.end main
.data
msgx: .asciiz "Write x: "
endl: .asciiz "\n"
msgy: .asciiz "Write y: "
float1: .float 0.0 # $f1
float2: .float 0.0 # $f2
zero: .float 0.0
plus: .word 0x7F800000
minus: .word 0xFF800000
NaN: .word 0x7FBFFFFF