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

HLA程序堆内存存储输入数字后输出全为0的问题求助

HLA代码修复:输入数字存储并按顺序输出

先给你说代码里的几个关键问题,都是导致输出全0的原因:

问题1:内存偏移计算错误

你输入第一个非0数字后,count会加1变成1,然后直接用count左移2位(等价于乘4)计算偏移,这会把第一个数存在mempointer + 4的位置,而不是起始的mempointer位置。后面的数也都存在了错误的偏移位置,导致输出时读的都是未初始化的内存(值为0)。

应该用count(未自增前的数值)来计算索引,因为数组索引从0开始,比如第1个数存在索引0,第2个数存在索引1,以此类推。

问题2:mov指令方向搞反

HLA里的mov(src, dest)是源数据传到目标,你在输出部分写的mov(ebx, [eax])是把ebx的值写到内存地址eax里,而不是把内存里的数读到ebx。正确的写法应该是mov([eax], ebx),这样才能把内存中存储的数字加载到ebx,然后输出。

问题3:输出顺序颠倒

当前的while循环是从count-1往0遍历,输出的是逆序,不符合“按输入顺序展示”的要求,得改成从0到count-1遍历。


修复后的完整代码:

program Project3;
#include("stdlib.hhf")

static
    count: int32 := 0;
    mempointer: int32;

begin Project3;

    mem.alloc(1000);
    mov(eax, mempointer);  // 保存堆内存起始地址

    loopStart:
        stdout.put("Enter a number, 0 to stop: ");
        stdin.flushInput();
        stdin.geti32();     // 输入的数字存在eax里
        mov(eax, ebx);

        cmp(ebx, 0);
        je exitLoop;        // 输入0就退出循环

        // 计算当前数字的存储偏移:count * 4(因为int32占4字节)
        mov(count, ecx);
        shl(2, ecx);        // ecx = count * 4
        mov(mempointer, eax);
        add(ecx, eax);      // eax = mempointer + 偏移量
        mov(ebx, [eax]);    // 把输入的数字存到堆内存里

        add(1, count);      // 计数加1
        jmp loopStart;

    exitLoop:
        stdout.put(nl, "Entered numbers: ");
        mov(0, ecx);        // 从索引0开始遍历
        while (ecx < count) do
            mov(ecx, eax);
            shl(2, eax);    // eax = 当前索引 *4
            add(mempointer, eax);  // eax = 内存地址
            mov([eax], ebx);        // 读取内存中的数字到ebx

            stdout.puti32(ebx);
            stdout.put(" ");

            add(1, ecx);    // 索引加1,遍历下一个
        endwhile;

    mem.free(mempointer);   // 释放堆内存

end Project3;

修复关键点说明:

  • 存储时用未自增的count作为索引,确保第一个数存在起始位置,后续数字依次往后排列,位置完全正确。
  • 输出时从索引0开始递增遍历,保证输出顺序和输入顺序一致。
  • 修正了mov指令的方向,确保正确读取堆内存中存储的数值。

内容的提问来源于stack exchange,提问作者trolldeg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:33:29