我最近开始学习汇编语言。对于我正在进行的一个项目,我必须使用线性同余来制作一个随机数生成器。我应该接受三个数字。上限、下限和我想要的随机数的数量。至于获得随机数的公式我想出了......
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
我很好奇如何在每个循环结束时打印出随机数。如果上面的代码有意义的话。
提前致谢!
最佳答案
您的问题的答案取决于平台,因此您需要指定这一点,我们可以以更具体的方式为您提供帮助。
但实地址模式(例如 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, '$'
另一种方法可能是直接 Hook C-Lib 函数并以这种方式输出。
您应该引用the ASCII Table对于字符代码。
还请记住,正如下面 drhirsch 提到的,如果您打算输出整数,则需要将这些值转换为 ISR 可以处理的形式,例如十六进制等价物。然后,您需要编写一个附加函数来“翻译”这些值。 This question这是我所指的一个很好的例子。
关于汇编语言随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10099214/