nasm で記述された乱数ジェネレーター関数が必要です。質問して申し訳ありませんが、見つかりませんでした。
質問する
3732 次
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 に答える