beq 命令不跳转到 MIPS 中的标签
beq command not jumping to a label in MIPS
我正在 MARS 中创建一个 MIPS 代码,它只允许输入数字表达式,并在出现除数字、+、-、* 和 / 以外的字符时打印错误消息。
在我下面的代码中,如果存在无效字符,我将 $s0 设置为零,否则它保持为 1。如果它等于零,使用 beq 命令我将跳转到 "erroneous"处理错误消息。
然而,最后一部分似乎并没有发生。如果你 运行 我的代码你会看到它实际上得到了正确的 $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
对于可能遇到这个问题的任何人,我可能已经解决了我自己的问题,但我不确定它是否真的是修复,还是 "cheat"。这更像是一种解决方法。
我将 "beq $s0, $zero, erroneous" 行移到了 "allowed:" 标签。我不知道为什么它在内部不起作用 check_valid_char,但它起作用了。
然后在错误里面,我通过使用 "sub $s0, $s0, $s0" 将 $s0 重置为 0,这样当代码再次进入 allowed: 时,beq 将被跳过并正常结束。
如果其他人可以为我的问题找到 "real" 解决方案,请 post 解决。
谢谢!
编辑:一些标点符号。
我正在 MARS 中创建一个 MIPS 代码,它只允许输入数字表达式,并在出现除数字、+、-、* 和 / 以外的字符时打印错误消息。
在我下面的代码中,如果存在无效字符,我将 $s0 设置为零,否则它保持为 1。如果它等于零,使用 beq 命令我将跳转到 "erroneous"处理错误消息。
然而,最后一部分似乎并没有发生。如果你 运行 我的代码你会看到它实际上得到了正确的 $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
对于可能遇到这个问题的任何人,我可能已经解决了我自己的问题,但我不确定它是否真的是修复,还是 "cheat"。这更像是一种解决方法。
我将 "beq $s0, $zero, erroneous" 行移到了 "allowed:" 标签。我不知道为什么它在内部不起作用 check_valid_char,但它起作用了。
然后在错误里面,我通过使用 "sub $s0, $s0, $s0" 将 $s0 重置为 0,这样当代码再次进入 allowed: 时,beq 将被跳过并正常结束。
如果其他人可以为我的问题找到 "real" 解决方案,请 post 解决。
谢谢!
编辑:一些标点符号。