assembly 将数字保存在堆内存中并以正确的方式检索它们

pbossiut  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(79)

首先,我只想说我对编码和学习非常新。我必须写一个程序,让你输入数字的HLA代码。在输入每个数字之后,它给你一个新的行来输入另一个数字,直到输入“0”。然后程序应该停止并以正确的顺序显示u输入的所有数字。我需要使用堆内存来存储数字。所以当它们出来的时候顺序是错的。这就是我现在的处境

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();
        mov(eax, ebx);

        cmp(ebx, 0);
        je exitLoop;

        add(1, count);
        mov(count, ecx);
        shl(2, ecx);
        mov(mempointer, eax); add(ecx, eax);
        mov([eax], ebx);

        jmp loopStart;

    exitLoop:
        stdout.put(nl, "Entered numbers: ");
        while (count <> 0) do
            sub(1, count);

            mov(count, ecx);
            shl(2, ecx);
            mov(mempointer, eax); add(ecx, eax);

            mov(ebx, [eax]);

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

    mem.free(mempointer);

end Project3;

因为它是编译和运行,但它只显示一个0为每个数字,我已经进入。有人知道怎么修吗?
我试着用Manny不同的方法来存储数字,这样它们就会按照我输入的顺序出来。但是找不到我做错了什么。

uidvcgyl

uidvcgyl1#

用一台“纸电脑”来检查你的算法。为每个重要的内存变量和寄存器绘制一个空框,逐行遍历代码,并使用新值更新受影响的框。
当你遇到stdin.geti32();时,请你的同学随机抽取两个或三个数字,例如7,3,5,0。在0之后,您将跳转到exitLoop:,并且您应该以如下方式结束

---------
eax   |mptr+12|
      ---------
         -----
ebx      | 5 |
         -----
         ------
ecx      | 12 |
         ------
         -----
counter  | 3 |
         -----
         ---------------------------
mptr*    | ? | 7 | 3 | 5 | ? | ? |...
         ---------------------------
          0   4   8   12  16  20

现在应该很明显出了什么问题。您过早地递增counter。同样,为了以正确的顺序显示数组,您可能需要另一个内存变量,如countOut: int32 := 0;,您将在数字显示后递增,并检查counterOut是否等于counter

相关问题