将双打存储在堆栈中并获得重新开始

时间:2015-05-19 11:14:00

标签: assembly stack double mips

我必须在汇编MIPS中执行以下操作。我要求用户给我一个号码,让我们说N.然后用户给我N个值(单精度数字),我必须转换成双打并计算总和。但计算必须通过一个程序来完成,每次获取2个双精度作为参数并返回sum.So对于用户给我的每个值,我调用过程,2个参数将是当前值和前一个(sum)我为所有N值做这个。 总金额为$ f2。在jr $ ra之后,我将$ f0添加到$ f2的前一个值,然后循环重新开始。 这是我的程序

addition:
      addi $sp, $sp, -16

     sdc1  $f2, 8($sp)
     sdc1 $f4, 0($sp)

     add.d $f0, $f2, $f4


     ldc1 $f4, 0($sp)
     ldc1 $f2, 8($sp)

     addi $sp, $sp, 16
jr $ra 

每次我收到消息时都会收到消息:0x004000b0处的运行时异常:地址未在双字边界上对齐0x7fffefdc

如果在这里无法看到问题,我愿意发布更多代码。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

即使乍一看你正确使用对齐的偏移量,如果$sp本身不是8字节对齐,那对你来说也不是很好。您可以确保它已对齐或使用未对齐的访问。

请注意sdc1写入内存,ldc1从内存加载。因此,我没有在代码中看到将$f2$f4保存到堆栈中并恢复它们的任何一点,特别是因为它们尚未更改。

它还不清楚您尝试使用的调用约定。

更新:使用在$f12$f14中传递双参数的标准惯例,并在$f0中返回,代码可能如下所示:

.globl main
main:
    li $v0, 5              # read_int
    syscall
    move $s0, $v0          # $s0 is the counter
    sub.d $f20, $f20, $f20 # zero $f20, the sum
    blez $s0, done
loop:
    li $v0, 6              # read_float
    syscall
    cvt.d.s $f12, $f0      # convert read number to double, pass as first arg
    mov.d $f14, $f20       # sum as second arg
    jal addition           # add them
    mov.d $f20, $f0        # update sum
    addiu $s0, $s0, -1     # decrement counter
    bgtz $s0, loop         # repeat
done:
    mov.d $f12, $f20       # sum as argument
    li $v0, 3              # print_double
    syscall
    li $v0, 10             # exit
    syscall

addition:
    add.d $f0, $f12, $f14  # result = arg1 + arg2
    jr $ra