Assembly 如何在mips中比较预存字符串和用户输入字符串
我试图在mips(使用spim模拟器)中提出一个基本的“如果是,那么做这个,如果不是,那么退出”算法。然而,无论给出是或否(本例中为y或n),bne总是分支。我对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 "
.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之后,你还坚持在我身边)。所以我的代码运行良好,尽管有点不确定。