MIPS Runtime Error?

  • #1

Main Question or Discussion Point

Hi there,

Not sure if this is the right place to post, but I seem to get a runtime error that says: address out of range 0x00000000. I think that it's probably in the first three lines of my code, but any idea as to what else it may be? Thanks so much!
Code:
	.data
save:   .word 1,2,4
size:   .word 3
	.text
	
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
 

Answers and Replies

  • #2
chiro
Science Advisor
4,790
131
Hey m00nbeam360.

Just out of curiosity, have you run this code through a low level debugger where you get access to the register values? (Even if you have to use some sort of emulator program)

I can't really speculate what it's in the values, but if you for example over-writing a value or trying to load in the contents at address 0x0 when something has been cleared then the register contents will reflect that.

Also are those numbers in your mneumonics some kind of offset you provide with the register?
 

Related Threads for: MIPS Runtime Error?

  • Last Post
Replies
13
Views
6K
  • Last Post
Replies
12
Views
4K
Replies
1
Views
2K
Replies
2
Views
18K
  • Last Post
Replies
2
Views
3K
  • Last Post
Replies
7
Views
7K
Replies
9
Views
429
Top