我的程序不会打印数组中第一个和最后一个数字的和

时间:2018-11-28 15:32:14

标签: arrays assembly x86-16

所以我要在程序集8086中创建一个程序,该程序允许用户输入一个字符数组,直到输入'$',然后从该数组中过滤出该字符并仅保留数字并从中创建一个新数组数字,但将其分组为3位数字。例如:

用户输入:34km12ap111cs345o $ 结果数组:341,211,134

最后,在这种情况下,我想将变量“ zbir”的值存储到结果数组中的第一个和最后一个数字的和:341 + 134 = 475

代码如下:

.model small
.stack 100
.data

    niza db 50 dup (?)
    broj dw 0
    index db ?
    nizaA dw 50 dup(?)
    zbir dw ?
    prv dw ?
    vtor dw ?

.code

  mov ax, data
  mov es, ax
  mov ds, ax

  mov bx, 0

Vnes:
  mov ah, 1
  int 21h

  mov niza[bx], al
  inc bx
  cmp al, 36
  jne Vnes


  mov bx, 0
  mov index, 0

Premestuvanje:
  mov cl, niza[bx]
  cmp cl, 36
  je Exit

  cmp cl, 48
  jl Skok

  cmp cl, 57
  jg Skok

  sub cl, 48
  mov ch, 0
  mov ax, broj
  mov dx, bx
  mov bx, 10
  mul bl
  add ax, cx
  mov broj, ax
  mov bx, dx
  cmp ax, 100
  jl Skok

  mov dx, bx
  mov bl, index
  mov bh, 0
  mov ax, broj
  mov nizaA[bx], ax
  mov broj, 0
  mov bx, dx
  inc index

Skok:
  inc bx
  jmp Premestuvanje  

Exit:
  dec index
  mov bx, 0
  mov ax, nizaA[bx]
  mov prv, ax
  mov bl, index
  mov bh, 0
  mov cx, nizaA[bx]
  mov vtor, cx
  add ax, cx

  mov zbir, ax

  mov ax, 4c00h
  int 21h    

ends

但这是问题所在。为了进行测试,我将数组中的第一个数字放在变量“ prv”中,最后一个数字放在变量“ vtor”中。变量“ vtor”似乎拥有适当的值,但变量“ prv”却没有。相反,它与nizaA变量的值相同,因此计算出错误的结果。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

#define _CRT_SECURE_NO_WARNINGS
#include "conioex.h"
#include "DblBuffer.h"

enum // 
{
    NEW_GAME = 20,
    LOAD,
    EXIT,
    MAX_NUM
};

void main (void)
{
    DblBuffer db;
    int Cursor_X, Cursor_Y; // cursorlocation
    bool Key_flag = false;  // pressandtrue
    int type = NEW_GAME;    // type
    Cursor_X = 20;
    Cursor_Y = 1;
    int flag = 1;
    while (flag)
    {
        for (int i = 1; i <= 3; i++)
        {
            db.setCursorPos(20,i);
            db.write(" ");
        }
        db.setCursorPos(25,1);
        db.write("New Game\n");
        db.setCursorPos(25,2);
        db.write("Load\n");
        db.setCursorPos(25,3);
        db.write("Exit\n");

        if (inport(PK_DOWN))
        {
            if (Key_flag == false)
            {
                Cursor_Y = Cursor_Y + 1;
                type = type + 1;
                Key_flag = true;
            }
        }
        else if (inport(PK_UP))
        {
            if (Key_flag == false)
            {
                Cursor_Y = Cursor_Y - 1;
                type = type - 1;
                Key_flag = true;
            }
        }
        else if (inport(PK_ENTER))
        {
            flag = 0;
            break;
        }
        else
        {
            Key_flag = false;
        }

        if (Cursor_Y < 1)
        {
            Cursor_Y = 1;
        }
        if (Cursor_Y > 3)
        {
            Cursor_Y = 3;
        }

        if (type < NEW_GAME)
        {
            type = NEW_GAME;
        }
        if (type >= MAX_NUM)
        {
            type = MAX_NUM - 1;
        }

        db.setCursorPos(Cursor_X, Cursor_Y);
        db.write("→");
        db.swap();
    }

    if(type == NEW_GAME)
    {
        printf("making a new game");
    }
    if (type == LOAD)
    {
        printf("will load");
    }
    if (type == EXIT)
    {
        printf("goodbye");
    }

    rewind(stdin);
    getchar();
}

此数组包含WORDS,但是您可以更改索引来寻址元素,就像它包含BYTES一样。

只需将nizaA dw 50 dup(?) 更改为inc index,将add index, 2更改为dec index