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, '$'