汇编代码问题:数组赋值异常与死循环排查求助
汇编代码问题分析与解决
问题1:两个数组生成相同随机值
原因
你在BetterRandomRange过程中每次生成随机数都调用Randomize,这个函数是基于系统时间初始化随机数种子。但循环执行速度极快,多次调用Randomize的时间差可以忽略,导致种子重复,生成的随机序列完全一致。
解决
将Randomize移到程序开头,只初始化一次种子,不要在每次生成随机数时重复调用。
问题2:无限循环
原因
loop指令的逻辑是:先把ecx减1,再判断ecx是否为0,不为0则跳转。你在循环体里已经手动执行了dec ecx,导致每次循环ecx被减两次。初始ecx=5,第一次循环后ecx=3,第二次ecx=1,第三次ecx=-1,之后ecx持续变为负数,永远不会等于0,因此触发无限循环。
解决
二选一即可:
- 删掉循环体中的
dec ecx,仅依靠loop指令自动递减ecx - 保留
dec ecx,将loop L1/loop L2替换为jnz L1/jnz L2(判断ecx不为0则跳转)
修改后的完整代码
.data arr dword 5 DUP(?) arr2 dword 5 DUP(?) j dword ? ; upper k dword ? ; lower n dword 5 .code main PROC call Randomize ; 只初始化一次随机数种子 ; test 1 k = 20 and j = 500 mov k, 500 mov j, 20 mov ecx, n mov esi, offset arr L1: call BetterRandomRange mov [esi], eax add esi, type arr loop L1 ; 这里不再手动dec ecx,loop自动处理 ; test 2 k = 200 and j = -300 mov k, -300 mov j, 200 mov ecx, n mov esi, offset arr2 L2: call BetterRandomRange mov [esi], eax add esi, type arr loop L2 INVOKE ExitProcess,0 main ENDP BetterRandomRange PROC mov eax, k mov ebx, j sub eax, ebx inc eax call RandomRange call WriteInt call Crlf add eax, ebx ret BetterRandomRange ENDP end main
内容的提问来源于stack exchange,提问作者AnonymousThankfulPerson
相关产品推荐
相关产品推荐

