我正在尝试编写一个函数来将单词从源内存复制到目标内存。
我已经写了这个函数,但是我在执行代码时遇到了困难。
它给了我execption 4
错误
.data
.text
main:
.setnoreorder
top: beq $a2,0,done
lw $t1,($a0)
sw $t1,($a1)
add $a0,$a0,4
add $a1,$a1,4
j top
sub $a2,$a2,1
done:
jr $ra #return to the main program
add $0, $0, $0 #nop
我想写一个主程序,它调用这个函数来复制800个单词 内存中的地址为0x50000至0x90000。但是当我在$ a0- $ a2中添加值并运行代码时它不起作用。 有谁知道如何修理它。 (我正在将C代码转换为MIPS,这就是我加入C标签的原因
干杯
答案 0 :(得分:1)
.text # code starts here
main: # required label
la $a0,dest # point to destination
la $a1,srce # point to source
li $a2,1000 # move this many words
jal block_copy # call the routine
nop
li $v0,10
syscall
###############################################################################
# block copy - moves $a3 words from $a1 to $a0
#
# register usage:
# $a0 address of destination
# $a1 address of source
# $a2 block size (number of words to move)
# $v0 return code (0 means no troubles)
#
block_copy:
move $v0,$a2 # counter/rc
bc_loop:
lw $t0,0($a1) # no DMA here
sw $t0,0($a0) # we have to move a word at a time
addiu $a0,$a0,4 # point to next word in destination
addiu $a1,$a1,4 # point to next word in source
addiu $v0,$v0,-1 # decrement counter
bgtz $v0,bc_loop # keep on moving if counter is positive
jr $ra # return to caller
###############################################################################
.data
dest:
.word 9:1000 # destination 1000 words (all zeroes)
srce:
.word 0:1000 # source 1000 words (all nines)
答案 1 :(得分:0)
不应该是:
sub $a2,$a2,1
j top
答案 2 :(得分:0)
您在两个地方显示延迟位置,此处
j top
sub $a2,$a2,1
在这里
done:
jr $ra #return to the main program
add $0, $0, $0 #nop
但显然不在这里:
top: beq $a2,0,done
lw $t1,($a0)
也许问题是beq之后的负载实际上是一个延迟槽,即使$ a2为零(并且分支被采用)也正在执行 - 你正在从内存加载($ a0)甚至当计数为零时 - 可能访问无效内存并导致异常。