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
相关产品推荐
相关产品推荐

