我正在使用缓冲输入(中断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
我使用的算法如下:
不幸的是,当我稍后打印出这个值时,无论我在开头键入什么,我都会得到相同的输出。显示输出的代码(它只显示每个字节的一个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的回答只是我需要的解决方案,它现在完美无缺,非常感谢。
答案 0 :(得分:0)
在此代码中,您将dx
中的两个字符加入:
mov dx, [inputBuffer+2+di]
你应该得到一个角色:
xor dx, dx
mov dl, [inputBuffer+2+di]
(首先清除dx
是为了获得一个完整的16位值,以便以后可以轻松地将其添加到ax
。)
当你得到长度时也一样:
xor ax, ax
mov al, [inputBuffer+1]
mov si, ax
另外,正如布什米尔斯指出的那样,你用来转换价值的逻辑有点倒退。如果您将累加器相乘然后添加数字,则不需要额外的代码来处理最后一位数,如果输入是单个数字(代码中缺少输入),则无需检查跳过循环)。
使用该逻辑,代码将是:
xor ax, ax
mov di, ax
mov al, [inputBuffer+1]
mov si, ax
dec si
xor ax, ax
process_input_value:
mov bx, 10
mul bx
xor dx, dx
mov dl, [inputBuffer+2+di]
sub dl, '0'
add ax, dx
inc di
cmp di, si
jb process_input_value
mov [inputValue], ax