【问题标题】:How to take digits as input in Assembly Language then print them as a number?如何在汇编语言中将数字作为输入,然后将它们打印为数字?
【发布时间】:2015-06-24 19:30:19
【问题描述】:

我是汇编语言的新手,我的教师给了一个我不知道该怎么做的作业。请帮我理解代码....

赋值如下:将用户的4位数字作为字符串(字母数字到整数),转换为数字并存储在AX中

如果用户输入是 '1','2','3','4' 输出应该是:1234

附:我不想要代码,我无法理解程序

【问题讨论】:

  • 我们不是来帮你做作业的......
  • @Marc B 我不是要代码,我只需要了解过程。
  • 要将数字捕获为字符并将它们转换为整数,您需要一个我们可以称为“string2number”的过程,这里是 = stackoverflow.com/questions/30243848/… 。要将数字转换回字符串,您需要“number2string”(如果有用,请不要忘记投票!)。
  • 没错,但我不认为他的任务需要另辟蹊径,number2string。无论如何,这是一个好习惯。 :-)

标签: assembly x86


【解决方案1】:

1。征求意见

您的目标是获取一系列字符,这些字符可以作为一个完整的字符串或一个接一个地组合在一起。如果你取一个完整的字符串,那么你必须逐个字符地读取它,如果你一次取一个字符,你已经完成了。

2。将数字转换为数字

您阅读的字符是字形、符号。计算机中的符号(与其他一切一样)用数字表示。完成此映射的方式是您的(字符集)编码。无需进入广阔的编码领域,您就可以依靠这样一个事实,即十进制数字的字形在大多数西方编码中都使用相同的数字进行编码,特别是您可以假设 ASCII 编码。
如果你查看一个 ASCII 表,你会看到这个

Character 0    1    2    3    4    5    6    7    8    9
Encoding  30h  31h  32h  33h  34h  35h  36h  37h  38h  39h

因此,如果用户输入 1234,您在字符串 31h 32h 33h 34h 中有这些字节。
您的目标是将编码转换为数字,例如 char '4' 的编码为 34h,而您希望将其转换为值 4h
对于从 2 到 36 的基数,这可以通过基本算术来完成,更多花哨的基数可能需要查找表。
不要忘记验证输入!检查字符串中的有效字符!

3。从数字计算数字

现在您有了一个数字序列,我们称它们为dn, ..., d3, d2, d1, d0,其中dn 是用户输入的第一个数字,d0 是最后一个数字。 你想从这个数字创建一个数字。你知道像1234 这样的数字实际上意味着1*10^3 + 2*10^2 + 3*10^1 + 4

所以你要做的很简单:
dn*10^n + ... + d3*10^3 + d2*10^2 + d1*10^1 + d0
(这解释了我对下标的选择)

考虑到n 是变化的(对于 16 位数字,最小值为 1,最大值为 5),您可以通过累积部分结果来简化此计算。
这意味着您有部分结果 temp 最初为 0。每次您有一个新数字 di 您执行
tmp = tmp*10 + di
说服自己,这有效地计算了上面的总和。这种方法免费带来了一个很好的功能,即计算数字的低 16 位,这对于不适合 WORD 的数字通常是一种优雅的降级。

4。伪算法

n = 0;
t = 0;
while (1)
{
   c = get_char_from_input();
   if (end_of_input(c) || max_digits_read(n))
      break;

   d = get_digit_from_char(c);
   t = t * 10 + d;
   n = n + 1;
}
return t;

开发一个高效的汇编版本由你来完成。

【讨论】:

    【解决方案2】:

    完全按照您的手工操作方式分解编码步骤。想象一下,您正在向其他人解释这个过程,并且是手工完成的,这很有帮助。

    在不透露太多细节的情况下,您需要将 ASCII 字符转换为整数,并且您必须一次处理一个数字,从字符串的一端到另一端。对此类子任务进行函数调用将对您的组织有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      相关资源
      最近更新 更多