我最近开始学习汇编语言。对于我正在研究的项目,我必须使用线性同余来制作随机数生成器。我想要接受三个数字。上限,下限和我想要的随机数的数量。至于得到一个随机数的公式,我想出了......
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
我很好奇如何在每个循环周期结束时打印出随机数。如果上面的代码有意义的话。
提前致谢!
答案 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是我所指的一个很好的例子。