我怎样才能避免从我的函数中得到一个负随机数?
How can I avoid getting a negative random number from my function?
这里我在 MIPS 汇编中编写一个函数,其中以下函数 returns 给定范围内的随机数。我知道我可以通过系统调用 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
rem $a0, $a0, $t2
此行在 $a0.
中存储一个 signed 值
我应该使用:
remu $a0, $a0, $t2
这将在 $a0.
中存储一个 unsigned 值
这里我在 MIPS 汇编中编写一个函数,其中以下函数 returns 给定范围内的随机数。我知道我可以通过系统调用 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
rem $a0, $a0, $t2 此行在 $a0.
中存储一个 signed 值我应该使用:
remu $a0, $a0, $t2
这将在 $a0.
中存储一个 unsigned 值