汇编语言随机数发生器

时间:2012-04-11 02:56:18

标签: assembly random x86 numbers prng

我最近开始学习汇编语言。对于我正在研究的项目,我必须使用线性同余来制作随机数生成器。我想要接受三个数字。上限,下限和我想要的随机数的数量。至于得到一个随机数的公式,我想出了......

randomNumber =(种子%(上 - 下)+下)

然后我试着把它放到代码中。 我想出了这个

.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

我很好奇如何在每个循环周期结束时打印出随机数。如果上面的代码有意义的话。

提前致谢!

1 个答案:

答案 0 :(得分: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函数并以此方式输出。

您应该参考the ASCII Table了解字符代码。

还要记住,正如下面提到的drhirsch所说,如果你想输出整数,你需要将这些值转换成ISR可以处理的形式,比如十六进制等值。然后,您需要编写一个额外的函数来“翻译”这些值。 This question是我所指的一个很好的例子。