在MIPS中使用跳转表(如何在JT数组中跳转标签)
我正试图用跳转表为我的工作制作菜单。对我来说,一切看起来都很好,但下面的代码不起作用。在“jr$s0”指令之后,mars给了我一个错误,如:在MIPS中使用跳转表(如何在JT数组中跳转标签),mips,mips32,smips,Mips,Mips32,Smips,我正试图用跳转表为我的工作制作菜单。对我来说,一切看起来都很好,但下面的代码不起作用。在“jr$s0”指令之后,mars给了我一个错误,如: 错误:无效的程序计数器值:268501840 我知道十进制地址268501840是L1标签的实际地址,代码应该放在该标签上,但在这一点上我犯了这个错误。为什么 main: .data jTable: .word L0,L1,L2,L3,L4,L5,L6,default #jump table definition msg: .as
错误:无效的程序计数器值:268501840
我知道十进制地址268501840
是L1标签的实际地址,代码应该放在该标签上,但在这一点上我犯了这个错误。为什么
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
您试图跳转到存储地址的数组,这没有意义。您需要在
jr
指令之前从表中加载目标地址:
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
sll$s0,$s0,2#$s0=索引*4
la$t0,jTable#$t0=跳转表的基址
添加$s0、$s0、$t0#$s0+$t0=跳转标签的实际地址
lw$s0,($s0)您可以使用jTable
作为加载字调用的即时偏移量,以更少的代码完成Michael建议的相同任务
sll $s0,$s0,2 # $s0=index*4
lw jTable($s0) # load the target address
jr $s0 # jump to the lable