Как сравнить предварительно сохраненную строку и строку пользовательского ввода в mips

Я пытаюсь придумать базовый алгоритм «если да, то сделайте это, если нет, то выйдите» в mips (с использованием симулятора spim). Однако bne всегда разветвляется, независимо от того, дано ли да или нет (в данном случае y или n). Я новичок в 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 никогда не равны, независимо от того, что вводит пользователь. Что мне нужно сделать, чтобы правильно сравнить два значения?


person Colton    schedule 27.09.2013    source источник


Ответы (1)


Я считаю, что вам нужно изменить строку:

la $t1, yes

to

lb $t1, yes

person geg    schedule 27.09.2013
comment
Welp .. Я добавляю строки lb $ t1, да, а также lb $ t0, 0 ($ t0), думая, что это загрузит первый байт обоих, и теперь он работает. Вы можете подтвердить, что это причина? - person Colton; 27.09.2013
comment
Попробуйте изменить move $ t0, $ a0, чтобы переместить $ t0, $ v0 и избавиться от lb $ t0, 0 ($ t0), потому что я думаю, что ваша текущая настройка загружает адрес ввода консоли в $ t0, а не сами данные . Вот почему он работает после того, как вы вызываете lb $ t0, 0 ($ t0), чтобы получить фактическое значение с этого адреса. - person geg; 27.09.2013
comment
Хм, после этого перестает работать ... Я не совсем понимаю, что вы имеете в виду. $ T0 заполняется адресом вместо данных? Даже когда я использую read_string? Я просто попробовал сложить два числа, которые ввожу при появлении запроса (тестирование 100 + 100), и получилось 57000000. Так что я думаю, что вы, вероятно, правы. : p Но я до сих пор не знаю, как это исправить! - person Colton; 27.09.2013
comment
Я тоже новичок в сборке, но я думаю, что ваша инструкция перемещения помещает адрес $ a0 результата в $ t0, а не входное значение, которое будет сохранено в $ v0 после системного вызова. Перейдите от $ v0 вместо $ a0 и закомментируйте lb $ t0, 0 ($ t0). Посмотрим, работает ли это. - person geg; 27.09.2013
comment
Да, я сделал это, и это сломало его. Я заставил остальную часть кода работать, используя ваш последний комментарий, только тот конкретный раздел, который мы обсуждаем, похоже, не работает. Спасибо за вашу помощь (особенно за то, что вы остались после того, как я уже дал вам ваши баллы: p). Так что мой код работает нормально, хотя и ненадежно. - person Colton; 27.09.2013
comment
Рад помочь, мне тоже нужно научиться этим вещам. Отладьте и опубликуйте строку, где дела идут наперекосяк. - person geg; 27.09.2013