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