如何用汇编程序实现随机数的产生?
要求简单,给出原代码 问题点数:20、回复次数:6Top
1 楼wangziz(zi)回复于 2004-12-01 23:01:30 得分 4
Random:
push eax
db 0Fh, 031h ;EAX=随机数
xor edx, edx
div dword ptr [esp+8];EAX/种子
pop eax
ret 4
Top
2 楼wangziz(zi)回复于 2004-12-01 23:06:33 得分 6
Random PROC Seed: DWORD ;返回值在eax中。
mov eax , 12345678h
_GetTickCount = dword ptr $-4
call eax
xor edx , edx
div Seed
xchg edx , eax ;需要的是余数,在edx中。
ret 4
Random ENDPTop
3 楼uglystone(丑石)回复于 2004-12-02 21:40:44 得分 0
大哥
解释一下好吧!
Top
4 楼wangziz(zi)回复于 2004-12-03 11:23:59 得分 2
利用时间除以种子得到的余数作为随机数
Top
5 楼sunrui(sunrui)回复于 2004-12-03 15:31:09 得分 2
关于伪随机数算法有现成的公式,可以到网上搜搜。可以对C运行库中的随机数生成函数进行反汇编分析。Top
6 楼jk88811(你的就是我的,我的还是我的~!)回复于 2004-12-04 20:10:34 得分 6
Random32 PROC
.data
seed DWORD 1
.code
push edx
mov eax, 343FDh
imul seed
add eax, 269EC3h
mov seed, eax ; save the seed for the next call
ror eax,8 ; rotate out the lowest digit (10/22/00)
pop edx
ret
Random32 ENDP
;--------------------------------------------------------
Randomize PROC
pushad
INVOKE GetSystemTime,OFFSET sysTime
movzx eax,sysTime.wMilliseconds
mov seed,eax
popad
ret
Randomize ENDP
;--------------------------------------------------------
第二个子程序调用系统时间初始化种子,第一个子程序产生随机数!当然伪随机数算法可以多种多样的!反正我们不是要求非常严格的随机数。Top




