Почему программа не печатает сумму массива? - PullRequest
0 голосов
/ 11 ноября 2018

Итак, я создаю простую программу сборки 8086, которая позволяет пользователю вводить 4 цифры, сохранять их в массиве и распечатывать сумму этих цифр (сумма должна быть однозначным числом):

data segment

    i db ?
    array db 20 dup(?)
    sum db ?

ends

stack segment

    dw 128 dup(0)

ends

code segment

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

    mov i, 0

Enter:
    mov ah, 1
    int 21h
    mov bl, i
    mov bh, 0

    mov array[bx], al

    inc i
    cmp i, 4
    jne Enter

    mov sum, 0
    mov i, 0

Calc:
    mov bl, i
    mov bh, 0
    mov al, array[bx]

    add sum, al

    inc i
    cmp i, 4
    jne Calc

    mov dl, sum
    mov ah, 2
    int 21h

    mov ax, 4c00h
    int 21h

ends

Однако, когда я ввожу цифры 1 1 2 5 вместо того, чтобы дать мне 9, это дает мне какой-то случайный символ.

Есть идеи?

1 Ответ

0 голосов
/ 11 ноября 2018

Функция ввода символов DOS дает вам символов .
Когда вы вводите 1 DOS представляет вам AL='1', что означает, что вы получите 49, где вы можете ожидать 1.
Когда вы вводите 2 DOS представляет вам AL='2', что означает, что вы получите 50, где вы могли бы ожидать 2.
Когда вы вводите 5 DOS представляет вам AL='5', что означает, что вы получите 53, где вы можете ожидать 5.
Вот почему в этих случаях мы вычитаем 48.

Enter:
    mov ah, 1
    int 21h
    mov bl, i
    mov bh, 0
    SUB AL, '0'        ;Same as SUB AL, 48
    mov array[bx], al

Таким образом, ваш массив будет содержать значения 1, 1, 2 и 5 (больше не будет символов «1», «1», «2» и «5»)

Теперь вы можете спокойно делать дополнения, получая 9.

Поскольку sum теперь содержит значение 9, но вам нужен символ '9', вы просто добавляете 48, чтобы выполнить преобразование:

    mov dl, sum
    ADD DL, '0'        ;Same as ADD DL, 48
    mov ah, 02h
    int 21h
...