Assembly 在dos程序集中将DEC值转换为BIN值
我使用缓冲输入(中断21h的0Ah函数)读取十进制格式的输入数字,如下所示: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
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
我使用的算法如下所示:
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