2012-04-11 74 views
3

我最近开始学习汇编语言。对于我正在研究的项目,我必须使用线性一致性来生成随机数生成器。我想拿三个数字。上限,下限和我想要的随机数的数量。如式为获得一个随机数,我想出了....汇编语言随机数发生器

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

欢迎来到计算器! – menjaraz 2012-04-11 07:16:00

+0

如果这是在Windows上,那么一些建议在这里:http://stackoverflow.com/questions/1922134/printing-out-a-number-in-assembly-language – 2012-04-11 07:35:52

+2

打印是高度平台特定的。你在哪里试图组装和执行这个? MS-DOS?视窗? Linux呢?此外,该指令不会飞行:“mov ax,2914017” - ax是一个16位寄存器,其最大值为65535.然而,eax为32位。 – 2012-04-11 16:57:24

回答

1

您的问题的答案取决于平台,所以您需要指定这一点,我们可以以更具体的方式帮助您。

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

例子(%宏关键字是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-库功能和输出。

您应该参考the ASCII Table获取字符代码。

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

+2

'int 01fh'?你确定你不是指'int 21h'吗? – 2012-05-01 17:57:28

+2

打印前需要将数字转换为ASCII – hirschhornsalz 2012-05-02 16:52:09