装配 NASM 中的随机数生成

Muh*_*mza 3 random assembly nasm

我正在研究 nasm 的大学项目。唯一的问题是我无法生成 162 到 278 之间的偶数随机数。我尝试了很多算法,但似乎无法限制范围内的数字。

是否有一个小技巧或调整来获得所需的范围内的数字?目的是在屏幕上随机显示一个水果(主要是蛇游戏)。

Poc*_*rin 5

我看了一下这篇文章:nasm random number generator function。也许你可以试试 (rdtsc % (278 - 162) / 2 + 162 / 2) * 2. 希望对你有帮助:)


Sep*_*and 5

生成 162 到 278 之间的偶数随机数

第1步

“生成随机数”
蛇游戏中显示水果的任务要求不高,所以我觉得使用TimeStampCounter还是可以的。您将继续使用EAX.

——

rdtsc                        ; -> EDX:EAX
Run Code Online (Sandbox Code Playgroud)

第2步

“162 和 278 之间
的数字”要将数字限制在所需的 [162,278] 范围内,您需要计算
(RandomNumber mod NumbersInTheRange) + StartOfTheRange.

  • RandomNumber 是EAX第一步的寄存器。
  • NumbersInTheRange 是upper bound - lower bound + 1不要忘记+1。
  • StartOfTheRange 是它的下限。

——

xor     edx, edx             ; Required because there's no division of EAX solely
mov     ecx, 278 - 162 + 1   ; 117 possible values
div     ecx                  ; EDX:EAX / ECX --> EAX quotient, EDX remainder
mov     eax, edx             ; -> EAX = [0,116]
add     eax, 162             ; -> EAX = [162,278]
Run Code Online (Sandbox Code Playgroud)

第 3 步

“偶数”通过丢弃最低位
使数字偶数

——

and     eax, -2              ; -> EAX = {162,164,...,276,278}
Run Code Online (Sandbox Code Playgroud)