You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:42:42