assembly 使用beq问题时,Mips组件未跳过函数

cnh2zyt3  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(127)

我把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,但是当我检查它的时候,它正确地读到了选择。有什么我可以做的吗?

ghhkc1vu

ghhkc1vu1#

台词

move $s4, $a0
    move $s5, $a0
    move $s7, $a0

是有害的。
根据MIPS Assembly/Pseudoinstructions - Wikibooks, open books for an open world

move $1, $2

手段

add $1, $2, $0

并且它将用寄存器$2中的值重写寄存器$1
因此,这些线擦除存储在寄存器$s4$s5$s7中的值'a''b''c'
删除有害行,以便将值'a''b''c'$s6进行比较。
还要注意,系统调用read_string中的$a0是字符串的 * 地址 *,因此

# move string to $s6
    move $s6, $a0

不会存储用户输入的内容。
要获取输入的第一个字符,您应该执行以下操作:

# move first character to $s6
    lbu $s6, 0($a0)

相关问题