运行exe文件一次,在程序集中生成5个随机数0-9

时间:2014-10-30 17:49:57

标签: assembly random numbers masm32

我想通过运行exe一次生成5个随机数,范围从0到9。例如,我运行random.exe一次,我可以得到7,1,3,9,2。 我之前使用过以下代码,但是当你运行exe时,它只会随机化一次。

mov ah, 00h   ; get current time        
int 1ah       ; cx:dx ---> clock count  

mov  ax, dx   ; move low-order part of clock count to ax
xor  dx, dx
mov  cx, 10
div  cx       ; remainder goes to dx (ranges from 0-9)
              ; dx contains the randomized number
mov ax, dx
call printNum   ; prints the contents of ax

我尝试将其置于循环中,但随机数(dx)不会发生变化。

2 个答案:

答案 0 :(得分:0)

int 1ah与ah(00)的结果表示滴答计数或时钟而不是CPU周期,因此,它每隔一段时间(例如,一些微秒)增加。这就是为什么即使你重复代码,它仍然比增量间隔快得多。

指令rdtsc可能是一个解决方案,它可以为您提供CPU周期。
有关rdtsc的信息,您可以查看http://en.wikipedia.org/wiki/Time_Stamp_Counter

答案 1 :(得分:0)

无论您使用哪个计数器,都无法使用任何定时计数器生成随机数。制作此类技巧的唯一方法是在数字生成之间引入人类可靠的暂停。实际上,第一个生成的数字或多或少是随机的。

因此,如果您需要五个数字,唯一的方法是使用一些伪随机算法并使用rdtsc作为随机种子值。

这样的事情:

include "%lib%/freshlib.inc"
@BinaryType console
include "%lib%/freshlib.asm"

start:
        InitializeAll

; get the seed:
        rdtsc
        xor     eax, edx
        mov     ebx, eax        ; the seed is in ebx
        mov     esi, 10
        mov     ecx, 50

; generate the numbers
.loop:
        add     ebx, $811C9DC5  ; prime 1
        imul    ebx, $01000193  ; prime 2

        mov     eax, ebx
        xor     edx, edx
        div     esi         ; make it from 0 to 9

        stdcall NumToStr, edx, ntsDec or ntsUnsigned
        stdcall StrCharCat, eax, $0a0d
        push    eax
        stdcall FileWriteString, [STDOUT], eax
        stdcall StrDel ; from the stack

        loop    .loop

        FinalizeAll
        stdcall TerminateAll, 0

为了编译这个源代码,您将需要Fresh IDE或至少来自上述IDE和任何类型的FASM编译器的FreshLib库。