【发布时间】:2014-08-04 19:27:26
【问题描述】:
我正在使用缓冲输入(中断 21h 的 0Ah 函数)读取十进制格式的输入数,如下所示:
mov ah, 0Ah
mov dx, inputBuffer
int 21h
我是这样声明缓冲区的:
inputBuffer db 6
db 0
times 7 db "$"
现在我想循环遍历这些数字并对这个值进行二进制表示,下面的代码为我做了这个:
mov si, [inputBuffer+1]
mov di, 0
dec si
process_input_value:
xor dx, dx
mov ax, [inputValue]
mov dx, [inputBuffer+2+di]
sub dx, '0'
add ax, dx
mov bx, 10
mul bx
mov [inputValue], ax
inc di
cmp di, si
jb process_input_value
mov ax, [inputValue]
mov dx, [inputBuffer+2+di]
sub dx, '0'
add ax, dx
mov [inputValue], ax
我使用的算法如下:
- 向缓冲区添加数字
- 如果不是最后一个数字,则将缓冲区乘以 10
- 重复
不幸的是,当我后来打印出这个值时,我总是得到相同的输出,无论我一开始输入什么。显示输出的代码(它只为每个字节显示一个 ASCII 字符,但足以让我注意到错误):
mov ah, 2
mov dl, 10
int 21h
mov dx, [inputValue]
mov dl, dh
int 21h
mov dx, [inputValue]
int 21h
mov ah, 8
int 21h
感觉进行转换的代码有问题,但我不知道可能出了什么问题。
我正在使用 NASM。
编辑: Guffa 的回答正是我需要的解决方案,现在可以完美运行,非常感谢。
【问题讨论】:
-
xor dx, dx - 如果稍后从内存中读取到 DX 两条指令,清除 DX 的目的是什么?
-
mov ax, [inputValue] - 你读取 ASCII 16 位吗?它们是否也作为 16 位项目存储在缓冲区中?还是您打算以 8 位方式读取它们,在这种情况下您可能想要加载到 AL 中?
-
@Bushmills inputValue 是一个用于保存输入数字的二进制值的字。这就是为什么它是 mov ax, [inputValue]。另外,对于您的第一个问题:我正在移动我一开始输入的 8 位数字的数量。
-
哦,对了。 “价值”与“缓冲区”——两者都以“输入”开头,这个细节让我没有注意
-
问题应该是关于 mov dx, [inputBuffer+2+di] 的,而不是关于 mov ax, [inputValue] 的问题
标签: assembly binary decimal dos nasm