|
发表于 2017-12-14 09:01:18
|
显示全部楼层
陕西省渭南市
本帖最后由 jr21066 于 2017-12-14 09:34 编辑
原代码为:.版本 2
' PUSH EBP
' MOV EBP, ESP
' PUSH ECX
' PUSH EDX
' RDTSC
' IMUL EAX, EAX, 343FDh
' ADD EAX, 269EC3h
' SHR EAX, 10h
' AND EAX, 7FFFh
' MOV ECX, DWORD PTR SS:[EBP+10h]
' TEST ECX, ECX
' JNZ SHORT Jump
' MOV ECX, 7FFFFFFFh
' @Jump:
' SUB ECX, DWORD PTR SS:[EBP+8h]
' INC ECX
' XOR EDX, EDX
' DIV ECX
' ADD EDX, DWORD PTR SS:[EBP+8h]
' MOV EAX, EDX
' POP EDX
' POP ECX
' MOV ESP, EBP
' POP EBP
' RETN 10h
数值被压缩到32767之内了.原因还不了解.如果要取大值可以把这行去掉.附下命令可修改部分.
rdtsc 为取cpu时钟周期值,会返回到edx+eax中.因edx值偏小抛弃不用.只使用eax
imul eax,eax,000343FDh
add eax,00269EC3h
这两句都是为了增加随机性进行的一些运算.可以修改为自己的任何运算.只要是分配均匀的都是好作品.
and eax,7FFFFFFFh
这个只是把负数取掉了.返回正整数.后边就是取出最大值和最小值之间的数了.不用修改
push ecx
push edx
rdtsc
imul eax,eax,000343FDh
add eax,00269EC3h
and eax,7FFFFFFFh
mov ecx,dword ptr [ebp+10h]
test ecx,ecx
jne Label1
mov ecx,7FFFFFFFh
Label1:
sub ecx,dword ptr [ebp+08h]
inc ecx
xor edx,edx
div ecx
add edx,dword ptr [ebp+08h]
mov eax,edx
pop edx
pop ecx
mov esp,ebp
pop ebp
retn 0010h
机器码: {81,82,15,49,105,192,253,67,3,0,5,195,158,38,0,37,255,255,255,127,139,77,16,133,201,117,5,185,255,255,255,127,43,77,8,65,49,210,247,241,3,85,8,137,208,90,89,137,236,93,194,16,0}
|
|