beq命令没有跳转到MIPS中的标签

时间:2015-09-12 17:39:02

标签: command mips mars-simulator

我在MARS中创建一个MIPS代码,只允许输入数字表达式,并在存在数字+, - ,*和/以外的字符时打印错误消息。

在我的下面的代码中,如果存在无效字符,我将$ s0设置为零,否则它将保持为1.如果它等于零,则使用beq命令我将跳转到错误的"它处理错误消息。

然而,最后一部分似乎没有发生。如果你运行我的代码,你会发现它实际上正确地得到了$ s0的正确值(也就是说,如果表达式无效,它就等于0)。

我需要一双新鲜的眼睛,我将不胜感激。谢谢!

.data 
input: .space 102
trial: .asciiz "LOLLOL\n"
errormsg: .asciiz "ERROR\n"
.text

main:
addi $v0, $zero, 8
la $a0, input
addi $a1, $a0, 102
syscall
addi $t1 , $zero, 0
add $s1, $zero, $zero
addi $a0, $zero, -1
addi $s0, $zero,1

check_invalid_char_1:
#beq $s0, $s1, erroneous
jal check_invalid_char
j allowed

check_invalid_char:
addi $sp,$sp,-8
sw $ra, 0($sp)
sw $a0, 4($sp)
#sw $v0, 8($sp)

addi $a0, $a0,1
addi $t3, $zero,0
beq $s0, $zero, erroneous

lb $t2, input($a0)
beq $t2, 48, check_invalid_char_1   #pwede 0
beq $t2, 49, check_invalid_char_1   #pwede 1
beq $t2, 50, check_invalid_char_1   #pwede 2
beq $t2, 51, check_invalid_char_1   #pwede 3
beq $t2, 52, check_invalid_char_1   #pwede 4
beq $t2, 53, check_invalid_char_1       #pwede 5
beq $t2, 54, check_invalid_char_1       #pwede 6
beq $t2, 55, check_invalid_char_1   #pwede 7
beq $t2, 56, check_invalid_char_1       #pwede 8
beq $t2, 57, check_invalid_char_1   #pwede 9
beq $t2, 43, check_invalid_char_1   #pwede +
beq $t2, 45, check_invalid_char_1   #pwede -
beq $t2, 42, check_invalid_char_1   #pwede *
beq $t2, 47, check_invalid_char_1   #pwede /
beq $t2, 0, allowed             #pwede null terminator
beq $t2, 10, allowed            #pwede newline


add $s0, $zero,$zero

lw $ra, 0($sp)
lw $a0, 4($sp)
#lw $v0, 8($sp)
addi $sp, $sp, 8

jr $ra


erroneous:
#add $a0, $zero, $zero
la $a0, errormsg
addi $v0, $zero, 4
syscall


allowed:
addi $v0, $zero, 1
add $a0, $s0, $zero
syscall
#la $a0, errormsg
#addi $v0, $zero, 4
#syscall
addi $v0, $zero, 10
syscall 

1 个答案:

答案 0 :(得分:0)

对于任何可能遇到这个问题的人,我可能已经解决了我自己的问题,但我不确定它是真的是修复还是“作弊”。这真的是一项工作。

我将“beq $ s0,$ zero,wrong”错误行移至“allowed:”标签。我不知道为什么它在check_valid_char里面不起作用,但是它有效。

然后在错误的内部,我通过使用“sub $ s0,$ s0,$ s0”将$ s0重置为0,这样当代码再次进入允许:时,beq将被跳过,它将正常结束。

如果其他人可以为我的问题找到“真正的”解决方案,请发布。

谢谢!

编辑:一些标点符号。