我把choiceWhat部分作为测试。当我输入“a”时,程序跳过choiceWhat转到choiceA。但是当我输入b或c时,它打印choiceA,然后退出程序。
# read string input
li $v0, 8
la $a0, choice
li $a1, 50
syscall
# move string to $s6
move $s6, $a0
li $s4, 'a'
li $s5, 'b'
li $s7, 'c'
move $s4, $a0
move $s5, $a0
move $s7, $a0
beq $s6, $s4, choiceA # jump to choice a if user chose 'a'
beq $s6, $s5, choiceB # jump to choice a if user chose 'b'
beq $s6, $s7, choiceC # jump to choice a if user chose 'c'
# exit program
li $v0, 10
syscall
choiceWhat:
li $v0,4 # syscall 4 prints the string
la $a0,choice # get size of the array
syscall
j done
choiceA:
li $v0,4 # syscall 4 prints the string
la $a0,countMsg # get size of the array
syscall
j done
choiceB:
## display less than
li $v0,4 # syscall 4 prints the string
la $a0,lessThanMsg # get size of the array
j done
## display divisible
choiceC:
li $v0,4 # syscall 4 prints the string
la $a0,divisibleMsg # get size of the array
j done
done:
为什么beq函数没有跳过两个函数。我想也许它把所有的东西都读成“a”,这就是为什么它不管什么都打印countA,但是当我检查它的时候,它正确地读到了选择。有什么我可以做的吗?
1条答案
按热度按时间ghhkc1vu1#
台词
是有害的。
根据MIPS Assembly/Pseudoinstructions - Wikibooks, open books for an open world,
手段
并且它将用寄存器
$2
中的值重写寄存器$1
。因此,这些线擦除存储在寄存器
$s4
、$s5
和$s7
中的值'a'
、'b'
和'c'
。删除有害行,以便将值
'a'
、'b'
和'c'
与$s6
进行比较。还要注意,系统调用
read_string
中的$a0
是字符串的 * 地址 *,因此不会存储用户输入的内容。
要获取输入的第一个字符,您应该执行以下操作: