MIPS условная печать всех случаев - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь определить наименьшее из 3 чисел.

Я использую slt для сравнения 2 чисел одновременно.

Я использую beq и bne и сравниваю их с $ ноль (потому что результат slt равен 0 или 1, а регистр $ ноль содержит константу 0).Используя beq и bne, я пытаюсь перейти к конкретной метке, которая в конечном итоге напечатает самую низкую из трех.

Я озадачен тем, что все сообщения на этикетке печатаются.Ниже мой код.Может кто-нибудь помочь мне определить, почему все дела печатаются?

# compare $s0 < $s1 
slt      $t0, $s0, $s1                   # if $s0 < $t1
bne      $t0, $zero, compare_s0_s2      # $t0 == 1, compare $s0 < $s2
beq      $t0, $zero, compare_s1_s2      # $t0 == 0, compare $s1 < $s2

# compare $s0 < $s2
compare_s0_s2:
slt     $t1, $s0, $s2                    # if $s0 < $s2
bne     $t1, $zero, print_lowest_s0     # $t1 == 1, print $s0
beq     $t1, $zero, print_lowest_s2     # $t1 == 0, print $s2

# compare $s1 < $s2
compare_s1_s2:
slt     $t2, $s1, $s2                   # if $s0 < $s2
bne     $t2, $zero, print_lowest_s1    # $t2 == 1, print $s1
beq     $t2, $zero, print_lowest_s2    # $t2 == 0, print $s2


# print $s0
print_lowest_s0:
li  $v0, 1
la  $a0, ($s0)
syscall

# print $s1
print_lowest_s1:
li  $v0, 1
la  $a0, ($s1)
syscall

# print $s2
print_lowest_s2:
li  $v0, 1
la  $a0, ($s2)
syscall

1 Ответ

0 голосов
/ 02 октября 2018

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

Если вы заметили, все 3 моих печатных заявления следуют одно за другим.Первоначально я форматировал их таким образом, потому что думал, что программный элемент управления переключится на правильный оператор печати после нахождения меньшего числа в сравнении.Но это не работает таким образом.Все, что видит ассемблер, это три последовательных оператора печати, поэтому он их печатает.

Если я хотел, чтобы выполнялся только один оператор печати, я должен был сделать какое-то изменение программы, которое будет либо переходить, либо переходить к другому коду, либо выходить из программы.Каждый оператор печати должен заканчиваться примерно так:

# print $s0 as lowest 
print_lowest_s0:
li  $v0, 1
la  $a0, ($s0)               # loads low number from comparison from $s0
syscall                      # prints low number
j   hi_int_message           # changes program control to another label

С тех пор я изменил свою условную логику, поэтому я не могу быть на 100% уверен, что то, что указано в моем вопросе выше, является правильной логикой,Вот как выглядит моя логика сейчас:

# compare $s0 < $s1 
slt $t0, $s0, $s1           # if $s0 < $s1
beq $t0, 0, compare_s1_s2     # else: $t0 == 0, branch to compare $s1 < $s2 label
slt $t1, $s0, $s2           # true: compare if $s0 < $s2
beq $t1, 0, print_lowest_s2  # else: $t1 == 0, $s2 == lowest; branch to label 
j   print_lowest_s0          # true:  $s0 == lowest; jump to $s0 print label

Тем не менее, основная задача этого вопроса заключалась в том, чтобы перестать печатать все.Надеюсь, что это может помочь кому-то позже!

...