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

汇编代码问题:数组赋值异常与死循环排查求助

汇编代码问题分析与解决

问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:12:06