在 mips mars 程序集中双浮动

如何解决在 mips mars 程序集中双浮动

所以我有这段代码可以读取双精度数组并进行高斯消除,我想将其更改为读取浮点数,我的问题是,如果我将数组更改为浮点数,我需要更改什么来继续我的程序运行。

我知道我的数组应该更改为 .float 并且在浮动中我需要使用 li $v0,2 和 lcw1 $f12,我正在使用 li $v0,3 ldc1 $f2,但我一直在更改它并给出我的答案错了,我不知道该怎么做,我正在尝试,但我无法让它发挥作用,请问有什么帮助吗?

### Text segment 

.eqv n 3
    .text

main:
    la  $a0,array
    li  $a1,n
    jal     print_matrix
    nop
    jal     gauss_reduct
    nop
    la  $a2,solution
    jal     gauss_solve
    nop
    jal     print_solution
    nop

exit:   
    li  $v0,10
    syscall


gauss_reduct:
    addiu   $sp,$sp,-24
    sw  $ra,20($sp)
    sw  $s2,16($sp)
    sw  $s1,12($sp)
    sw  $s0,8($sp) 
    sw  $a1,4($sp) 
    sw  $a0,0($sp)

    add $t3,$a0,$zero
    addi    $t4,$a1,-1
    addi    $t5,0

    add $t2,$zero,$zero
gauss_reduct_ciclok:
    beq $t2,$t5,gauss_reduct_end
    nop

    add $t1,$zero
gauss_reduct_cicloj:
    beq $t1,gauss_reduct_fim_ciclo_j
    nop

    beq $t1,$t2,gauss_reduct_cicloj_continue
    nop

    move    $a0,$t1
    move    $a1,$t2
    jal fetchaddress
    nop
    move    $s1,$v0

    ldc1    $f6,($s1)

    move    $a0,$t2
    move    $a1,$v0

    ldc1    $f8,($s1)

    div.d   $f4,$f6,$f8

    add $t0,$zero

    move    $a0,$t0
    jal fetchaddress
    nop
    move    $s1,$v0

    move    $a0,$t0
    jal fetchaddress
    nop
    move    $s2,$v0

gauss_reduct_cicloi:
    bgt $t0,gauss_reduct_fim_ciclo_i
    nop

    ldc1    $f6,($s1)
    ldc1    $f8,($s2)

    mul.d   $f8,$f8,$f4
    sub.d   $f6,$f8
    sdc1    $f6,($s1)
    addiu   $t0,$t0,1

    addiu   $s1,$s1,8
    addiu   $s2,$s2,8

    j   gauss_reduct_cicloi
    nop

gauss_reduct_fim_ciclo_i:

gauss_reduct_cicloj_continue:
    addiu   $t1,$t1,1
    j   gauss_reduct_cicloj
    nop

gauss_reduct_fim_ciclo_j:
    addiu   $t2,1
    j   gauss_reduct_ciclok
    nop

gauss_reduct_end:
    lw  $ra,20($sp)
    lw  $s2,16($sp)
    lw  $s1,12($sp)
    lw  $s0,8($sp)
    lw  $a1,4($sp)
    lw  $a0,0($sp)
    addiu   $sp,24

    jr  $ra
    nop

gauss_solve:
    addiu   $sp,$zero
    addi    $t0,0

    sll $s1,$t4,3
    addu $s1,$a2

    addi    $t0,0
gauss_solve_cicloi:
    blt $t0,gauss_solve_end
    nop

    # v0 = &A[i][n]
    move    $a0,$t0
    move    $a1,$t5
    jal fetchaddress
    nop

    # $f6 = A[i][n]
    ldc1    $f6,($v0)

    # X[i] = A[i][n]
    sdc1    $f6,($s1)

    addi    $t1,1

    sll $s2,3
    add $s2,$a2

gauss_solve_cicloj:
    beq $t1,gauss_solve_fim_cicloi
    nop

    # v0 = &A[i][j]
    move    $a0,$t1
    jal fetchaddress
    nop

    ldc1    $f8,($v0)
    ldc1    $f4,($s2)
    mul.d   $f8,$f4

    sub.d   $f6,1
    addi    $s2,8
    j   gauss_solve_cicloj
    nop

gauss_solve_fim_cicloi:

    # v0 = &A[i][i]
    move    $a0,$t0
    jal fetchaddress
    nop

    # $f8 = A[i][i]
    ldc1    $f8,($v0)

    # x[i] = x[i] / A[i][i];
    div.d   $f6,($s1)

    subi    $t0,1
    subi    $s1,8
    j   gauss_solve_cicloi
    nop

gauss_solve_end:
    lw  $ra,24

    jr  $ra
    nop

fetchaddress:
    addiu   $t5,1
    multu   $a0,$t5
    subiu   $t5,1
    mflo    $v0
    add $v0,$v0,$a1
    sll $v0,3
    add $v0,$t3
    jr  $ra
    nop


print_matrix:
    addiu   $sp,8($sp) 
    sw  $a2,0($sp)

    move    $s2,$a0
    move    $s1,$zero
    
loop_s1:
    addi    $a2,1
    move    $s0,$zero
loop_s0:
    l.d $f12,0($s2)
    li  $v0,3
    syscall
    la  $a0,spaces
    li  $v0,4
    syscall

    addiu   $s2,8

    addiu   $s0,$s0,1
    blt $s0,$a2,loop_s0
    nop
    la  $a0,newline
    syscall
    addiu   $s1,1
    blt $s1,loop_s1
    nop
    la  $a0,newline
    syscall

    lw  $ra,8($sp)
    lw  $a2,20

    jr  $ra             # return
    nop


print_solution:
    li $v0,4   #display a mensagem
    la $a0,Solution
    syscall
    li $v0,newline
    syscall

    addiu   $sp,0($sp)

    move    $s1,$zero
    move    $s2,$a2

print_solution_loop_s0:

    ldc1    $f12,($s2)
    li  $v0,3
    syscall

    addiu   $s2,8
    addiu   $s1,1
    la  $a0,newline
    li  $v0,4
    syscall
    blt $s1,print_solution_loop_s0
    nop

    lw  $ra,20

    jr  $ra
    nop

### End of text segment

### Data segment 
    .data
array: .double
 2.0,1.0,-3.0,-1.0,3.0,2.0,12.0,0.0
 
### String constants
spaces:
    .asciiz "   "
newline:
    .asciiz "\n"

Solution:.asciiz "Solution:"



solution:
    .double 0.0
    .double 0.0
    .double 0.0
    .double 0.0



### End of data segment

解决方法

您已经注意到从使用 .double.float 的更改数据。

一般来说,特别是如果您希望使用 float 而不是 double 来缩小数据结构,那么数组索引和指针算法的缩放也会发生变化。

至于说明:只需将 .d 更改为 .s。 (是我,我会保留偶数的寄存器。)

系统调用也从双输入和打印变为单版本。

堆栈位置可能会缩小,但与协处理器寄存器一样,我可能会将它们单独放置并浪费空间,因此如果需要,可以更轻松地将其转换回双精度。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?