Assembly 在dos程序集中将DEC值转换为BIN值

Assembly 在dos程序集中将DEC值转换为BIN值,assembly,binary,decimal,dos,nasm,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

我使用缓冲输入(中断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字符,但足以让我注意到错误):

    感觉进行转换的代码有问题,但我不知道会出什么问题

    我正在使用NASM

    编辑:
    Guffa的回答正是我所需要的解决方案,它现在工作得很好,非常感谢。

    在这段代码中,您在
    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: 此外,正如Bushmills指出的,用于转换值的逻辑有点倒退。如果将累加器相乘,然后将数字相加,则不需要额外的代码来处理最后一个数字,并且如果输入是一个数字(代码中缺少该数字),也不需要进行检查来跳过循环

    根据该逻辑,代码将是:

    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
    

    xor dx,dx-如果您在两条指令之后从内存读取dx,那么清除dx的目的是什么?mov ax,[inputValue]-您读取的是16位?它们是否也作为16位项目存储在缓冲区中?或者您打算按8位读取它们,在这种情况下,您可能希望将其加载到AL中?@Bushmills inputValue是一个用于保存输入数字的二进制值的字。这就是为什么它是mov ax,[输入值]。还有,关于你的第一个问题:我正在移动我在开始时输入的8位数字的数量。哦,对了。“值”与“缓冲区”-由于两者都以“输入”开头,所以我的问题应该是关于mov dx,[inputBuffer+2+di],而不是关于mov ax,[inputValue],这样做似乎没有什么区别,输出仍然是相同的(ASCII码170和176)。@Tomek:刚才注意到你也将长度作为一个单词来读取。我在上面添加了代码。
    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