很抱歉这是一个很长的代码块,但是你在这看到任何明显的语法错误吗?编译器告诉我运行时执行错误:0x00400008处的运行时异常:地址超出范围0x00000000。如果可以的话请帮忙!
.data
save: .word 1,2,4,2,5,6
size: .word 6
.text
la $s6, save #load address of array
la $t5, size #load address of size
lw $t5, 0($t5) #load array size
sw $t0, 0($s6) #save the first element of the array
sw $t1, 4($s6) #save the second element of the array
j sort #call sort function
swap: sll $t1, $a1, 2 #shift bits by 2
add $t1, $a1, $t1 #set $t1 address to v[k]
lw $t0, 0($t1) #load v[k] into t1 <- ERROR
lw $t2, 4($t1) #load v[k+1] into t1
sw $t2, 0($t1) #swap addresses
sw $t0, 4($t1) #swap addresses
jr $ra #return
sort: addi $sp, $sp, -20 #make enough room on the stack for five registers
sw $ra, 16($sp) #save the return address on the stack
sw $s3, 12($sp) #save $s3 on the stack
sw $s2, 8($sp) #save Ss2 on the stack
sw $s1, 4($sp) #save $s1 on the stack
sw $s0, 0($sp) #save $s0 on the stack
move $s2, $a0 #copy the parameter $a0 into $s2 (save $a0)
move $s3, $a1 #copy the parameter $a1 into $s3 (save $a1)
move $s0, $zero #start of for loop, i = 0
for1tst: slt $t0, $s0, $s3 #$t0 = 0 if $s0 S $s3 (i S n)
beq $t0, $zero, exit1 #go to exit1 if $s0 S $s3 (i S n)
addi $s1, $s0, -1 #j - i - 1
for2tst: slti $t0, $s1, 0 #$t0 = 1 if $s1 < 0 (j < 0)
bne $t0, $zero, exit2 #$t0 = 1 if $s1 < 0 (j < 0)
sll $t1, $s1, 2 #$t1 = j * 4 (shift by 2 bits)
add $t2, $s2, $t1 #$t2 = v + (j*4)
lw $t3, 0($t2) #$t3 = v[j]
lw $t4, 4($t2) #$t4 = v[j+1]
slt $t0, $t4, $t3 #$t0 = 0 if $t4 S $t3
beq $t0, $zero, exit2 #go to exit2 if $t4 S $t3
move $a0, $s2 #1st parameter of swap is v(old $a0)
move $a1, $s1 #2nd parameter of swap is j
jal swap #swap
addi $s1, $s1, -1
j for2tst #jump to test of inner loop
j print
exit2:
addi $s0, $s0, 1 #i = i + 1
j for1tst #jump to test of outer loop
exit1:
lw $s0, 0($sp) #restore $s0 from stack
lw $s1, 4($sp) #resture $s1 from stack
lw $s2, 8($sp) #restore $s2 from stack
lw $s3, 12($sp) #restore $s3 from stack
lw $ra, 16($sp) #restore $ra from stack
addi $sp, $sp, 20 #restore stack pointer
jr $ra #return to calling routine
.data
space:.asciiz " " # space to insert between numbers
head: .asciiz "The sorted numbers are:\n"
.text
print:add $t0, $zero, $a0 # starting address of array
add $t1, $zero, $a1 # initialize loop counter to array size
la $a0, head # load address of print heading
li $v0, 4 # specify Print String service
syscall # print heading
out: li $v0, 1 # specify Print Integer service
la $a0, space # load address of spacer for syscall
li $v0, 4 # specify Print String service
syscall # output string
addi $t0, $t0, 4 # increment address
addi $t1, $t1, -1 # decrement loop counter
bgtz $t1, out # repeat if not finished
jr $ra # return
答案 0 :(得分:1)
看看你的exit1
子。你最后使用jr $ra
,这意味着它是一个子程序。你在哪里设置返回地址寄存器?你只是分支到这些潜艇;你应该使用jal
来调用。
或者,在exit1
结束时,使用j
,就像使用exit2
一样。
编辑:您还想使用jal print
,而不是j print
。 始终在使用jal
返回的任何子资源上使用jr $ra
,如果未使用{调用该资源,从不使用jr $ra
{1}}(或任何链接说明)。