2016-05-17 3 views
1

Мне нужно создать код mips, который он должен сказать мне, если случайное число (заданное пользователем) находится в массиве (1) или его нет (0). У меня две проблемы: первая - случайное число, которое я пытаюсь спросить у пользователя (li $ v0, 5 - syscall - переместить $ t0, $ v0), что он не работает, на самом деле он ничего не делает когда я его собираю. Вторая проблема - странная, у меня есть 2 цикла (цель) и (цикл выхода), первый из которых проверяет, находится ли число в любом из позиции массива (10 позиций), а второе - с 0, если оно не было Не найди номер. Любые идеи?Поиск случайного числа в массиве

iterator = 4 
N = 10 
    .data 
vector:   .word 2, 3, 5, 6, 8, 1, 3, 2, 5, 9 
    .text 
main: 
    lw $t2, buscador 
    li $t1, iterator 
    la $s1, vector 
    move $s0, $zero 

    li $v0, 5 
    syscall 
    move $t0, $v0 

target: 
    bgt $s0, N, exit_loop 
    mul $t3, $s0, $t1 
    addu $t3, $t3, $s1 
    lw $t3, 0($t3) 
    addi $s0, $s0, 1 
    bne $t0, $t3, target 
    li $s2, 1 
    move $a0, $s2 
    li $v0, 1 
    syscall 

exit_loop: 
    li $s2, 0 
    move $a0, $s2 
    li $v0, 1 
    syscall 

    li $v0, 10 
    syscall 
+0

Так что вам нужно собрать ряд от пользователя с помощью системного вызова, сравнить это число с каждым номером в вашем векторе возвращает истину/1 если найдено и возвращает 0/false, если нет. Я не вижу кода сравнения в ваших циклах. Вам нужно сравнить с текущим векторным элементом или, по крайней мере, вычесть и проверить флаг нуля. –

+0

Первый цикл «target» переходит в первое векторное пространство, я делаю: --mul $ t3, $ s0, $ t1-- --addu $ t3, $ t3, $ s1-- --lw $ t3 , 0 ($ t3) - , чтобы попасть в первое число и сохранить его в $ t3, умножая 0 * 4 (бит), затем добавьте 1 к $ s0, поэтому его, как 0 * 4, затем 1 * 4, 2 * 4 ... Второй цикл для выхода, если у вектора 10 номеров, тогда, если N больше 10, перейдите в «цикл выхода» и распечатайте 0. – Michalistico

+1

@MichaelDorgan Очевидно, что вы знакомы с x86 и аналогичными арки, но MIPS несколько отличается. Он не выполняет _cmp_ эквивалентную команду, отличную от 'slt'. Также нет кодов условий или регистра «флаги». Инструкция 'bne' в программе автономна и похожа на (например, x86)' cmp blah1, blah2; bne label "все в одном лице. И программа правильная [AFAICT]. См. Мой ответ ниже. –

ответ

0

Там кажется, нет ничего неправильно с вашей программой.

Символ buscador был не определен, поэтому программа может быть неправильно собрана. Я прокомментировал данную строку. Возможно, это была единственная проблема.

У меня была небольшая косметическая очистка и добавлены некоторые аннотации. Я также упростил синтаксис целых чисел печати [ваш работал бы, как есть].

I сделал добавить дополнительный прыжок на новый ярлык exit_program, чтобы отдельные случаи прохода/сбоя были раздельными. В противном случае у вас будет «провалиться» из корпуса прохода в случае отказа, и вы получите «10» вместо «1» для случая с паролем.

Но, в противном случае, я не (т.е. не нужно к) изменить свою логику.

Я протестировал программу, и она работает как на QtSpim, так и на mars.

Во всяком случае, просто чтобы быть уверенным, вот рабочая версия:

iterator = 4 
    N = 10 

    .data 
vector:  .word  2, 3, 5, 6, 8, 1, 3, 2, 5, 9 
    .text 

main: 
    # NOTE: this symbol was _not_ defined, so spim may have silently not 
    # run the program 
    ###lw  $t2,buscador 
    li  $t1,iterator   # get sizeof(vector[0]) 
    la  $s1,vector    # get vector base address 
    move $s0,$zero    # set vector index to zero 

    # prompt user for number 
    li  $v0,5 
    syscall 
    move $t0,$v0 

target: 
    bgt  $s0,N,exit_loop   # vector end? if yes, fly 

    mul  $t3,$s0,$t1    # offset = index * iterator 
    addu $t3,$t3,$s1    # current addr = base + offset 
    lw  $t3,0($t3)    # fetch word from vector 

    addi $s0,$s0,1    # increment the vector index 
    bne  $t0,$t3,target   # does value match? if no, loop 

    # value matches -- output a 1 
    li  $a0,1 
    li  $v0,1 
    syscall 
    j  exit_program 

# we did _not_ find a match -- output a 0 
exit_loop: 
    li  $a0,0 
    li  $v0,1 
    syscall 

exit_program: 
    li  $v0,10 
    syscall 
Смежные вопросы