程序为什么不打印数组的和?

时间:2018-11-11 19:44:59

标签: assembly x86-16

因此,我正在构建一个简单的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 :(得分:3)

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