因此,我正在构建一个简单的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时,它会给我一些随机字符。
有什么想法吗?
答案 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