MIPS32中的分支选项

问题描述 投票:0回答:1

我正在尝试在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 "
assembly mips32
1个回答
0
投票

尝试一下:

.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

基本上是同一件事,但我认为可以节省一些操作

© www.soinside.com 2019 - 2024. All rights reserved.