【发布时间】:2012-04-11 02:56:18
【问题描述】:
我最近开始学习汇编语言。对于我正在从事的项目,我必须使用线性同余制作一个随机数生成器。我想取三个数字。一个上限、一个下限和我想要多少个随机数。至于我想出的获取随机数的公式……
randomNumber = (seed % (upper-lower) + lower)
然后我尝试将其放入代码中。 我想出了这个
.data
upper BYTE 100 ;setting upper limit 100
lower BYTE 0 ;setting lower limit 0
number BYTE 5 ;number of random numbers
.code
call main
exit
main proc
cls
mov bx,upper ;moving upper bound into bx
mov dx,lower ;moving lower bound into dx
mov ax,2914017 ;taking a random number for this trial
mov ecx,number ;setting the loop counter
L1:
sub bx,dx ;(upper-lower)
div bx
add ah,dx ;(randomNumber mod (bx) + lower
main endp
我很好奇如何在每个循环周期结束时打印出随机数。如果上面的代码有意义的话。
提前致谢!
【问题讨论】:
-
如果这是在 Windows 上,那么这里有一些建议:stackoverflow.com/questions/1922134/…
-
打印是高度特定于平台的。你想在哪里组装和执行这个?微软DOS?视窗? Linux?此外,这条指令不会飞:“mov ax,2914017”——ax 是一个 16 位寄存器,最大值为 65535。然而,eax 是 32 位。
-
这是各种错误。最重要的是,该表达式不会产生新的种子。通常,您需要在取模之前乘以并添加一些精心挑选的常数。其次,
div bx将dx:ax除以bx,但您没有将dx归零。将lower加载到esi或edi。 (并且使用movzx执行此操作,因为它们的内存位置是字节。您正在使用字加载加载它们,因此mov dx, [lower]会将0x500放入dx。) -
实现这里讨论的应该相对简单:imgs.xkcd.com/comics/random_number.png
标签: assembly random x86 numbers prng