0

nasm で記述された乱数ジェネレーター関数が必要です。質問して申し訳ありませんが、見つかりませんでした。

4

5 に答える 5

1

多くの場合、への呼び出しrdtscで十分です。とにかく、それはあなたのニーズに依存します。まれに小さな乱数が必要な場合rdtsc % N、または他の場合のより複雑なアルゴリズムのシードとして最適です。

于 2010-10-15T11:49:44.170 に答える
1

特に、Agner Fogには、アセンブリで記述された乱数ジェネレータがあります。ここを参照してください。

于 2010-10-15T16:30:54.570 に答える
0

私は NASM を知りませんし、お金を払わない限り、オンデマンドでコードを書く習慣もありません。

ただし、調査できるアルゴリズムは次のとおりです。

于 2010-10-15T11:36:46.167 に答える
0
; in case you still are looking or for the ones who do look around nowadays, here is my
; experiment on random number generation.
; I hope it will be usefull.

STRUC TIMESPEC
    .tv_sec:    resq    1
    .tv_nsec:   resq    1
ENDSTRUC

STRUC TIMEVAL
    .tv_sec:    resq    1
    .tv_usec:   resq    1
ENDSTRUC

%define tv.tv_sec tv+TIMEVAL.tv_sec
%define tv.tv_usec tv+TIMEVAL.tv_usec
%define ts.tv_sec ts+TIMESPEC.tv_sec
%define ts.tv_nsec ts+TIMESPEC.tv_nsec

    NUMBERCOUNT equ 50
    MAXNUMBER   equ 7
    NUMBERLOOPS equ 50

section .bss

    array   resw    NUMBERCOUNT ; 20 64 bit words to store the numbers
    buffer  resb    1

section .data

ts: ISTRUC TIMESPEC
    at  TIMESPEC.tv_sec,    dq 0
    at  TIMESPEC.tv_nsec,   dq 0
IEND

tv: ISTRUC TIMEVAL
    at  TIMEVAL.tv_sec,     dq 0
    at  TIMEVAL.tv_usec,    dq 0
IEND

section .text

global _start
_start:

; start generating 20 random numbers between 0 and 20 both values included
; we will use the computers timer to obtain a seed and a pseudo random value 

;   call syscall clock_gettime for the seed

    xor r8,r8           ; loops
    inc     r8
repeatLoop:
    inc     r8
    push    r8
    xor rcx, rcx
    mov rdi, array
repeat:
    push    rcx
    push    rdi
    mov rsi, ts
    mov rdi, 0
    mov rax, SYS_CLOCK_GETTIME
    syscall

    mov rsi, 0
    mov rdi, tv
    mov rax, SYS_GETTIMEOFDAY
    syscall

    mov rax,[ts.tv_nsec]
    mov rbx,[tv.tv_usec]

    xor rdx, rdx
    add     rax, rbx
    mov rbx, MAXNUMBER+1
    div rbx

    mov rax, rdx
    xor rdx, rdx
    mov rbx, 10
    div rbx
    add     al,30h
    shl rax, 8
    mov al, dl
    add     al,30h
    pop rdi
    stosw

    pop rcx
    inc rcx
    cmp rcx, NUMBERCOUNT
    jl  repeat

    xor rcx, rcx
    mov rsi, array
repeatGet:  
    xor rax, rax
    lodsw
    push    rcx
    push    rsi
    call    WriteValue
    pop rsi
    pop rcx
    inc rcx
    cmp rcx, NUMBERCOUNT
    jl  repeatGet

    pop r8
    cmp r8,NUMBERLOOPS
    jg  Exit
    call    writeEOL
    jmp repeatLoop

Exit:   
    call    writeEOL
    xor rdi, rdi
    mov rax, SYS_EXIT
    syscall

writeEOL:
    mov al,ASCII_LF
    mov byte[buffer],al
    mov rsi,buffer
    mov rdi,STDOUT
    mov rdx, 1
    mov rax,SYS_WRITE
    syscall
    ret

WriteValue:
    cmp ah,"0"
    jne writeDecimal
    mov ah," "
writeDecimal:   
    mov byte[buffer],ah
    push    rax
    mov rsi,buffer
    mov rdi,STDOUT
    mov rdx, 1
    mov rax,SYS_WRITE
    syscall
    pop rax
writeUnit:
    mov byte[buffer],al
    mov rsi,buffer
    mov rdi,STDOUT
    mov rdx, 1
    mov rax,SYS_WRITE
    syscall
writeSpace:
    mov al," "
    mov byte[buffer],al
    mov rsi,buffer
    mov rdi,STDOUT
    mov rdx, 1
    mov rax,SYS_WRITE
    syscall

    ret
于 2013-02-20T18:38:32.637 に答える