关于Randomize、Random32工作机制及随机字符串生成的技术问询
问题解决与随机函数解析
一、修正字符串长度问题
你当前代码生成11个字符的原因是CreateRandomString过程中误用了LENGTHOF str_index作为循环次数——str_index定义为str_len DUP(0), 0,包含10个占位字节加1个结束符,总长度为11。此外,代码还存在一个隐性问题:每次写入字符后未移动ESI指针,会导致所有字符覆盖同一个内存位置。
修正后的CreateRandomString过程如下:
CreateRandomString PROC ; Receives: Length of the string (L) in EAX, the pointer ; to a byte array in ESI where the random string will be saved ; Returns: Pointer to a byte array in ESI held the random string ;----------------------------------------------------- mov ecx, eax ; 改用传入的EAX作为循环次数(字符串长度) push esi ; 保存原始ESI指针,用于最终返回 L2: mov eax, 26 call RandomRange ; 生成0-25的随机数 add eax, 65 ; 转换为大写字母ASCII值(A=65) mov [esi], al ; 写入字节数组(仅用EAX低8位) call WriteChar inc esi ; 移动指针到下一个字节位置 loop L2 pop esi ; 恢复原始ESI指针作为返回值 mov byte ptr [esi], 0 ; 可选:添加字符串结束符 call Crlf ret CreateRandomString ENDP
同时,main中调用CreateRandomString前无需调用Random32(RandomRange已能生成所需随机数),且需要手动传入字符串长度到EAX:
L1: mov eax, str_len ; 将指定长度传入EAX call CreateRandomString loop L1
二、随机函数工作机制解析
1. Randomize
- 作用:基于系统当前时间初始化随机数生成器的种子,仅需调用一次,放在程序开头即可,重复调用会导致随机数序列重复。
- 使用方式:
call Randomize,无参数,无返回值。
2. Random32
- 作用:生成一个32位无符号随机数,范围为
0到0xFFFFFFFF。 - 获取随机值:调用完成后,随机值直接存储在
EAX寄存器中,可通过寄存器转移或内存存储获取,例如:call Random32 mov [random_num], eax ; 将随机数保存到内存变量
3. RandomRange
- 作用:生成指定范围的随机数,范围为
0到N-1,其中N是调用前传入EAX的数值。 - 指定范围的示例:
- 生成
0-99的随机数:mov eax,100→call RandomRange - 生成
1-100的随机数:mov eax,100→call RandomRange→add eax,1 - 生成
50-100的随机数:mov eax,51→call RandomRange→add eax,50(100-50+1=51个可选值)
- 生成
内容的提问来源于stack exchange,提问作者clq
相关产品推荐
相关产品推荐

