MARS MIPS Какую ветвь использовать для проверки, делятся ли числа нацело

.data
prompt: .asciiz "Enter your first number:"
prompt2: .asciiz "Enter your second number:"
prompt3: .asciiz "Your Number was evenly divisible by the second number!"

.text

main:
li $s0, 0   #Sets $s0 0
li $v0, 4   #Get user input
la $a0, prompt  #Displays "Enter your first number:"
syscall

li $v0, 5   #Gets users integer
syscall
move $t0, $v0   #Stores user input to $t0

li $v0 4    #Get user input
la $a0 prompt2  #Display prompt 2
syscall

li $v0 5    #Get int from user
syscall
move $t1, $v0

divu $t0, $t1  #Divides $t0/$t1
mfhi $t3
bnez $t3, exit



exit:
li $v0 10
syscall

Программа, которую я пытаюсь написать, должна принимать от пользователя два целочисленных ввода и разделять их. Если число без остатка делится на второе число, я отобразлю «Prompt3:».

Я написал большую часть этого, и все, казалось, сработало, но у меня проблемы с условным оператором.


person Rorix    schedule 17.02.2016    source источник
comment
Какую инструкцию перехода вы должны использовать, зависит от того, как вы хотите, чтобы поток вашей программы выглядел, так что вам решать. Условие, которое вы хотите проверить, состоит в том, что остаток равен нулю, и есть две инструкции ветвления, касающиеся равенства; beq и bne. Так что используйте один из них.   -  person Michael    schedule 17.02.2016
comment
Спасибо. Пока что мой дополнительный код выглядит так: li $s0, 0 #Set $s0 = 0 beq $t3, $s0 exit #compares if $t3 == #s0 (в данном случае $s0 ==0) exit: la $a0 prompt3 #Отображает приглашение 3 (Ваш номер делится без остатка) li $v0 10 #выход из системного вызова программы Не уверен, что делаю это правильно. Нужно ли устанавливать $s0 == 0, чтобы сравнить ответ, если $t3 == 0?   -  person Rorix    schedule 17.02.2016
comment
Уже есть регистр, который всегда имеет нулевое значение: $zero (или $0).   -  person Michael    schedule 17.02.2016


Ответы (1)


Вы используете неправильную псевдоинструкцию (div/3).

Вы должны использовать div или divu, затем mfhi, чтобы получить остаток от целочисленного деления, а затем проверить этот остаток, чтобы увидеть, равен ли он нулю или нет. Например.:

divu $t0, $t1
mfhi $t3
bnez $t3, exit
person gusbro    schedule 17.02.2016
comment
Спасибо! Я отредактировал так же, как вы сказали, но по какой-то причине у меня все еще не работает. Он не переходит к разделу exit:, когда $t0 делится поровну на $t1. - person Rorix; 18.02.2016
comment
@Rorix: Вы забыли добавить эти строки между метками bnez $t3, exit и exit: la $a0, prompt3 li $v0, 4 syscall. Эти строки печатают ваш prompt3 текст. - person gusbro; 18.02.2016