如何避免从函数中获取负的随机数?

时间:2019-10-16 16:44:01

标签: assembly mips

在这里,我正在MIPS汇编中编写一个函数,其中以下函数返回给定范围内的随机数。我知道我可以通过系统调用42来做到这一点,但我正在尝试从头开始学习。我使用syscall 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 :(得分:0)

rem $ a0,$ a0,$ t2 该行在$ a0中存储一个带符号值。

我应该使用:

remu $ a0,$ a0,$ t2

这会将 unsigned 值存储在$ a0中。