【问题标题】:Run exe file once to generate 5 random numbers 0-9 in assembly运行exe文件一次,在汇编中生成5个随机数0-9
【发布时间】:2014-10-30 17:49:56
【问题描述】:

我想通过运行一次 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)没有改变。

【问题讨论】:

  • 您的代码运行速度太快,在此期间时钟不会增加。即使是这样,那样也不会是一个随机数。

标签: assembly random numbers masm32


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    因此,如果您需要五个数字,唯一的方法是使用一些伪随机算法并使用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 的 FreshLib 库和任何类型的 FASM 编译器。

    【讨论】:

    • 你能展示一个使用 rdtsc 的例子吗?我尝试搜索示例,但找不到任何简单到足以让我理解的内容。
    • @user2758902 - 添加示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多