【问题标题】:Converting DEC to BIN value in dos assembly在dos程序集中将DEC转换为BIN值
【发布时间】: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

我使用的算法如下:

  1. 向缓冲区添加数字
  2. 如果不是最后一个数字,则将缓冲区乘以 10
  3. 重复

不幸的是,当我后来打印出这个值时,我总是得到相同的输出,无论我一开始输入什么。显示输出的代码(它只为每个字节显示一个 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


【解决方案1】:

在这段代码中,您将两个字符输入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

【讨论】:

  • 好像没什么区别,输出还是一样的(ASCII码170和176)。
  • @Tomek:刚刚注意到您还把长度读成了一个单词。我添加了上面的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2020-02-10
  • 1970-01-01
  • 2020-09-12
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多