在dos汇编中将DEC转换为BIN值

时间:2014-06-14 10:12:10

标签: assembly binary decimal dos nasm

我正在使用缓冲输入(中断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

我使用的算法如下:

  1. 为缓冲区添加号码
  2. 如果它不是最后一个数字乘法缓冲区10
  3. 重复
  4. 不幸的是,当我稍后打印出这个值时,无论我在开头键入什么,我都会得到相同的输出。显示输出的代码(它只显示每个字节的一个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的回答只是我需要的解决方案,它现在完美无缺,非常感谢。

1 个答案:

答案 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

编辑2:

另外,正如布什米尔斯指出的那样,你用来转换价值的逻辑有点倒退。如果您将累加器相乘然后添加数字,则不需要额外的代码来处理最后一位数,如果输入是单个数字(代码中缺少输入),则无需检查跳过循环)。

使用该逻辑,代码将是:

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