Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using jump tables in MIPS (how to jump a label in JT array )

Tags:

mips

mips32

smips

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
like image 597
kotiloli Avatar asked Oct 23 '25 12:10

kotiloli


1 Answers

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
like image 130
Michael Avatar answered Oct 25 '25 20:10

Michael



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!