#include <memory.h> #define DWORD unsigned long
DWORD MCoef_32[2]={0xE7BD2160,0xDA3A2A9C}; // 两个小m序列系数
DWORD m_Seq_32_m(DWORD dwMset,DWORD dwKey,int nNumber, DWORD * pdwRandom) // dwMset: 随机发生器所使用的小m序列
// dwKey: 随机数种子
// nNumber: 产生的随机序列长度(以DWORD为单位)
// pdwRandom: 指向随机数存储空间的指针
// return value: 运算完成之后随机数发生器的状态
{ _asm { CLD MOV EDI,pdwRandom; MOV ECX,nNumber; MOV ESI,dwMset; MOV EAX,dwKey; ALIGN 4 LOOP_CIRCLE1: PUSH ECX MOV ECX,32 LOOP_CIRCLE2: MOV EBX,EAX; SHL EAX,1 AND EBX,ESI; //select the bit for xor
MOV EDX,EBX; BSWAP EBX; XOR BX,DX; XOR BH,BL; // because P only judge one byte
// so must XOR to judge the p of whole word
JP NEXT //jp equals the xor
INC EAX NEXT: DEC ecx JNZ LOOP_CIRCLE2 POP ECX STOSD DEC ECX JNZ LOOP_CIRCLE1 MOV dwKey,EAX } return dwKey; }
void RandomGenerator(void * Buffer, int nlength) // 产生长度为nLength字节的随机数
// Buffer: 指向随机数存放区域的指针
// nLength: 产生随机数数量
{ DWORD A; BYTE B[4]; _asm { _emit 0x0f _emit 0x31 MOV A,EAX } A=m_Seq_32_m(MCoef_32[0],A,nLength/4,(DWORD *)Buffer); if(nLength%4!=0) { m_Seq_32_m(MCoef_32[0],A,1,(DWORD *)B); memcpy(Buffer+(nLength/4)*4,B,nLength%4); } return; }
|