Assembly 如何在mips中比较预存字符串和用户输入字符串

Assembly 如何在mips中比较预存字符串和用户输入字符串,assembly,mips,spim,Assembly,Mips,Spim,我试图在mips(使用spim模拟器)中提出一个基本的“如果是,那么做这个,如果不是,那么退出”算法。然而,无论给出是或否(本例中为y或n),bne总是分支。我对mips很陌生,所以我可能错过了一些重要的东西。。。还是小的我不知道。以下是我所拥有的: .data welcome: .asciiz "Hello World!\n" begin: .asciiz "\nEnter a mathematical operator: " question: .asciiz "

我试图在mips(使用spim模拟器)中提出一个基本的“如果是,那么做这个,如果不是,那么退出”算法。然而,无论给出是或否(本例中为y或n),bne总是分支。我对mips很陌生,所以我可能错过了一些重要的东西。。。还是小的我不知道。以下是我所拥有的:

.data
    welcome:   .asciiz "Hello World!\n"
    begin: .asciiz "\nEnter a mathematical operator: "
    question: .asciiz "\nWould you like to solve a problem (y/n)? "
    back: .asciiz "You wrote "
    buffer: .space 2
    yes: .asciiz "y"
    exiting: .asciiz "exiting"

.text
.globl main
 main:   
       li $v0, 4       # syscall 4 (print_str)        
       la $a0, welcome # argument: string        
       syscall         # print the string

Loop:
    # ASK IF WANT TO SOLVE A QUESTION
    li $v0, 4     # syscall 4 (print_str)
    la $a0, question  # argument: string
    syscall

     # GET INPUT FROM USER
    li   $v0, 8   # get input
    la   $a0, buffer    # load byte space into address
    li   $a1, 2         # allot the byte space for string
    move $t0,$a0      # save string to t0
    syscall
#EDIT
  lb $t1, yes     #previously la $t1, yes
      lb $t0, 0($t0)  #new

#END EDIT

bne $t0, $t1, Exit

########IF YES, PRINT MESSAGE
########this code is only for testing and doesn't really mean anything
########so you can ignore it

    li $v0, 4       # syscall 4 (print_str)
    la $a0, begin   # argument: string
    syscall


    li $v0, 8   #get input
    la $a0, buffer  #load byte space into address
    li $a1, 20      # allot the byte space for string
    move $t0,$a0    #save string to t0
    syscall


    la $a0,back     #load and print "you wrote" string
    li $v0,4
    syscall


    la $a0, buffer  #reload byte space to primary address
    move $a0,$t0    # primary address = t0 address (load pointer)
    li $v0,4        # print string
    syscall

    j Loop

########### END IF YES

Exit:
    li $v0, 4
    la $a0, exiting
    syscall

    li $v0, 10
    syscall
    jr $ra          # return to caller

所以问题是$t0和$t1永远不相等,不管用户输入什么。我需要做什么才能正确比较这两个值?

我认为您需要更改行:

la$t1,是


lb$t1,是的

Welp。。我添加了行“lb$t1,yes”和“lb$t0,0($t0)”,认为这将加载这两行的第一个字节,现在它正在工作。你能确认这就是原因吗?试着将“move$t0,$a0”改为“move$t0,$v0”,并去掉“lb$t0,0($t0)”,因为我认为你当前的设置正在将控制台输入的地址加载到$t0中,而不是数据本身。这就是为什么在你调用“lb$t0,0($t0)”从该地址提取实际值后它会工作的原因。嗯,在那之后它会停止工作。。。我不太明白你的意思。$t0是用地址而不是数据填充的?即使我使用read_字符串?我只是试着添加两个我在提示时输入的数字(测试100+100),结果它吐出了57000000。所以我认为你可能是对的但是,我仍然不知道如何修复它!我也是汇编新手,但我认为您的move指令将结果的地址$a0放在$t0中,而不是在syscall之后存储在$v0中的输入值。从$v0移到$a0,并注释掉“lb$t0,0($t0)”。看看能不能用。是的,我做了,它弄坏了。我使用您的最后一条评论使代码的其余部分正常工作,只是我们正在讨论的特定部分似乎不起作用。谢谢你的帮助(特别是在我已经给了你你的分数:p之后,你还坚持在我身边)。所以我的代码运行良好,尽管有点不确定。