我正在尝试在MIPS32的主要方法中编写一个菜单,该菜单将跳转到不同的标签,但是由于某种原因,我收到一条错误消息:指令引用了未识别的符号jal L1。有人可以告诉我分支是否做错了,还是我的问题可能出在其他地方?这是我的代码的一部分:
.text
.globl main
main:
addi $a0, 0, 10
addi $a1, 0, 8
slt $t1, $a1, $a0 # $a1>$a0
beq $t1, 1, main_loop
beq $a0, 0, case0 # $a0=0
beq $a1, 0, case1 # $a1=0
beq $a0, $a1, case1 # $a0=$a1
slt $t1, $a0, $a1 # $a0<$a1
beq $t1, 0, case0
main_loop:
jal L1
# MORE CODE
L1:
# MORE CODE
case0:
# CODE WITH SYSCALL
# print str
jr $ra
case1:
# CODE WITH SYSCALL
# print str
jr $ra
else:
# print str
# CODE WITH SYSCALL
.data
str:
.asciiz "message "
尝试一下:
.text
.globl main
main:
li $a0, 10
li $a1, 8
slt $t1, $a1, $a0 # $a1>$a0
beq $t1, 1, main_loop
beqz $a0, case0 # $a0=0
beqz $a1, case1 # $a1=0
beq $a0, $a1, case1 # $a0=$a1
slt $t1, $a0, $a1 # $a0<$a1
beqz $t1, case0
main_loop:
jal L1
# MORE CODE
L1:
# MORE CODE
case0:
# CODE WITH SYSCALL
# print str
jr $ra
case1:
# CODE WITH SYSCALL
# print str
jr $ra
else:
# print str
# CODE WITH SYSCALL
.data
str:
.asciiz "message "
它应该工作,但目前无法尝试。
我注意到您使用过
addi $ a0,0,10
但是第二个操作数必须是一个寄存器,所以我用li $ a0,10更改了它,将立即数加载到寄存器中。我也改变了
beq $ a0,0,case0
with beqz $ a0,case0
基本上是同一件事,但我认为可以节省一些操作