我必须在汇编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
如果在这里无法看到问题,我愿意发布更多代码。
感谢您的帮助
答案 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