Как я могу избежать получения отрицательного случайного числа из моей функции? - PullRequest
1 голос
/ 16 октября 2019

Здесь я пишу функцию в сборке MIPS, где следующая функция возвращает случайное число в заданном диапазоне. Я знаю, что могу сделать системный вызов 42, но я пытаюсь учиться с нуля. Я использую системный вызов 41, чтобы получить случайное целое число. Код, кажется, работает в большинстве случаев, но иногда возвращаемое значение выходит за пределы. Я считаю, что это связано с ведущим битом для этого сохраненного значения. Проблема при использовании rem? Эта команда хранит подписанное значение? Как мне справиться с этим? Я пишу больше кода для выполнения дополнения до двух или просто использовать другую команду?

getRandom:
    # $v0 getRandom($a0, $a1)
    # max - min
    # $a1 - $a0
    sub     $t0, $a1, $a0   # max - min
    addi    $t0, $t0, 1 # $t0 = max - min + 1

    addi    $sp, $sp, -16
    sw  $a0, 0($sp) # *($sp + 0) = $a0
    sw  $a1, 4($sp) # *($sp + 4) = $a0
    sw  $t0, 8($sp) # *($sp + 8) = $a0

    li  $v0, 41
    syscall

    # $a0 = rand()

    lw  $t0, 0($sp) # $t0 = min
    lw  $t1, 4($sp) # $t1 = max
    lw  $t2, 8($sp) # $t2 = max - min + 1
    addi    $sp, $sp, 16    #restore ram

    rem $a0, $a0, $t2   # $a0 = a0 % $t2

    add $v0, $a0, $t0    

    jr  $ra

1 Ответ

0 голосов
/ 16 октября 2019

rem $ a0, $ a0, $ t2 В этой строке хранится значение со знаком в $ a0.

Я должен использовать:

remu $ a0, $ a0, $ t2

Это сохранит значение без знака в $ a0.

...