I'm tring to do a menu for my work by using a jump table. Everyting looks fine for me but below code does not works. after the "jr $s0" instruction mars gives me an error like:
Error in : invalid program counter value: 268501840
I know the decimal address 268501840
is the actual address of the L1 label and the code supposed to go that label but at that point I take this error.Why?
main:
.data
jTable: .word L0,L1,L2,L3,L4,L5,L6,default #jump table definition
msg: .asciiz "\nEnter Your Choice;\n [1] for build,\n [2] for insert,\n [3] for find,\n [4] for findMinMax,\n [5] for delete,\n [6] for print\n [0] for Exit\nYour choice:#"
.text
userInteraction:
li $v0,4 #print string
la $a0,msg #get string address
syscall
li $v0,5 #get a menu option from user(0 to 6)
syscall
move $s0,$v0 #get index in $s0
sll $s0,$s0,2 #$s0=index*4
la $t0,jTable #$t0=base address of the jump table
add $s0,$s0,$t0 #$s0+$t0 = actual address of jump label
**jr $s0** #jump to label
L0: Todo
j finish
L1: Todo
j userInteraction
L2: Todo
j userInteraction
L3: Todo
j userInteraction
L4: Todo
j userInteraction
L5: Todo
j userInteraction
L6: Todo
j userInteraction
default: Todo
j userInteraction
finish:
li $v0,10 #Exit
syscall #Exit
You're trying to jump to the array where the addresses are stored, which doesn't make sense. You need to load the target address from the table before the jr
instruction:
sll $s0,$s0,2 #$s0=index*4
la $t0,jTable #$t0=base address of the jump table
add $s0,$s0,$t0 #$s0+$t0 = actual address of jump label
lw $s0,($s0) # <-- load target address
jr $s0 #jump to label