Assembly 汇编语言随机数发生器

Assembly 汇编语言随机数发生器,assembly,random,x86,numbers,prng,Assembly,Random,X86,Numbers,Prng,我最近开始学习汇编语言。对于我正在进行的一个项目,我必须使用线性同余生成一个随机数生成器。我想有三个数字。一个上界,一个下界和一个我想要多少随机数的数字。至于得到一个随机数的公式,我想到了 随机数=(种子%(上下)+下) 然后我试着把它写成代码。 我想到了这个 .data upper BYTE 100 ;setting upper limit 100 lower BYTE 0 ;setting lower limit 0 number BYTE 5

我最近开始学习汇编语言。对于我正在进行的一个项目,我必须使用线性同余生成一个随机数生成器。我想有三个数字。一个上界,一个下界和一个我想要多少随机数的数字。至于得到一个随机数的公式,我想到了

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

然后我试着把它写成代码。 我想到了这个

.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
我很好奇如何在每个循环周期结束时打印出随机数。如果上面的代码有任何意义


提前谢谢

您的问题的答案取决于平台,因此您需要具体说明这一点,我们可以以更具体的方式帮助您

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

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

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

有关字符代码,请参阅


还请记住,正如下面提到的drhirsch,如果要输出整数,需要将这些值转换为ISR可以处理的形式,如十六进制等价物。然后需要编写一个附加函数来“转换”这些值。是我所指的一个很好的例子。

如果这是在Windows上,那么这里有一些建议:打印是高度特定于平台的。你想在哪里组装和执行这个?MS-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
)实现这里讨论的方法应该比较简单:
int 01fh
?您确定您的意思不是
int 21h
?您需要在打印之前将数字转换为ASCII码
%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, '$'