8086汇编生成0-7随机数求助:现有代码始终输出0
解决8086汇编生成0-7随机数的问题
原代码问题分析
你原代码的核心错误在and al, 00001000b这一行:
- 该指令仅保留AL寄存器的第3位(对应十进制8),结果只能是0或8;若这段时间里该位始终为0,就会一直返回0。
- 0-7的数值对应二进制的低三位(位0到位2),而非第3位,这就是代码不符合范围要求的原因。
修改后的代码
mov ax, 40h mov es, ax mov ax, [es:6Ch] ; 读取BIOS数据区的系统滴答计数器低字 and al, 00000111b ; 保留低三位,结果范围0-7
代码说明
40h:6Ch是IBM PC兼容机BIOS数据区中的系统滴答计数器,这个值每秒约递增18.2次,随时间持续变化,适合作为简单随机数的种子来源。and al, 00000111b等价于and al, 7,它会将AL中除低三位外的所有位清零,最终AL中的值必然落在0(二进制000)到7(二进制111)的范围内。
如果需要稍好的随机性,也可以选择读取计数器的高字节(AH)后再做掩码操作,高字节的变化周期更长,适合对随机性要求稍高的场景:
mov ax, 40h mov es, ax mov ax, [es:6Ch] and ah, 00000111b ; 用高字节生成0-7的随机数 ; 此时结果存放在AH中,可按需转移到AL
内容的提问来源于stack exchange,提问作者Kim Strugo
相关产品推荐
相关产品推荐

