汇编语言随机数生成器

3

我最近开始学习汇编语言。在一个项目中,我必须使用线性同余来制作一个随机数生成器。我应该输入三个数字:上限、下限和我想要的随机数字的数量。至于获取随机数字的公式,我想出了...

随机数=(种子%(上限-下限)+下限)

然后我尝试将其转化为代码。 我想出了这个:

.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上,则可以参考以下建议:https://dev59.com/PXI-5IYBdhLWcg3wTWdu - Ville Krumlinde
2
打印是高度平台特定的。您试图在哪里组装和执行此操作? MS-DOS? Windows? Linux?此外,此指令不可行:“mov ax,2914017”-ax是一个16位寄存器,最大值为65535。 eax是32位的。 - Multimedia Mike
1
这完全是错的。最重要的是,那个表达式不会产生新的种子。通常,在模数之前需要乘以和加上一些精心选择的常数。其次,div bxdx:ax除以bx,但您没有将dx清零。将lower加载到esiedi中。(并使用movzx进行操作,因为它们的内存位置是字节。您正在使用字加载将它们加载,因此mov dx,[lower]0x500放入dx中。) - Peter Cordes
实现这里讨论的方法应该相对简单:http://imgs.xkcd.com/comics/random_number.png - Michael Petch
1个回答

1

你的问题的答案取决于平台,所以你需要具体说明,这样我们才能以更具体的方式帮助你。

但在实地址模式下(例如MS-DOS),一种常见的方法是调用中断并将数据发送到SO(标准输出)。

示例(%macro关键字是预处理器指令,NASM可以理解 - 但并非所有编译器都使用它,但我为了清晰起见包括了它):

%macro printLn 1
        mov ah, 09h ; 9h means "write a string" on screen
        mov edx, %1
        int 21h ; call the ISR for MS-DOS Services
%endmacro        

[SECTION .text]

mystart:
        printLn string
        ret

[SECTION .data]
string  db      "This is a string of text", 13, 10, '$'

另一种方法可能是直接挂钩C-Lib函数并以这种方式输出。

您应该参考 ASCII表获取字符代码。

还要记住,正如drhirsch在下面提到的那样,如果您打算输出整数,则需要将这些值转换为您的ISR可以处理的形式,例如十六进制等效形式。然后,您将需要编写一个附加函数来“翻译”这些值。 此问题是我所指的一个很好的例子。


2
int 01fh?你确定不是指 int 21h 吗? - Daniel Kamil Kozar
2
在打印之前,您需要将数字转换为ASCII。 - Gunther Piez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接