我是汇编语言的新手,我的教师做了一项我无法弄清楚如何做的任务。请帮我理解代码......
分配如下:将用户的4位数字作为字符串(字母数字到整数),将它们转换为数字并存储在AX中
如果用户输入为'1','2','3','4' 输出应为:1234
P.S。我不想要代码,我无法理解程序
答案 0 :(得分:2)
这里的目标是获得一系列字符,这些字符可以作为整个字符串或逐个字符组合在一起。如果你取一个完整的字符串然后你必须通过char读取它,如果你已经完成了一个字符。
你读的字符是字形,符号。计算机中的符号用数字表示(如其他所有)。完成此映射的方式是(charset)编码。如果不进入庞大的编码领域,你可以依赖于大多数西方编码中十进制数字的字形用相同的数字编码的事实,特别是你可以假设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
中包含这些字节。
您的目标是从编码转换为数字,例如字符'4'具有编码34h
,并且您希望将其转换为值4h
。
对于从2到36的基数,这可以通过基本算术完成,更多花哨的基础可能需要查找表
不要忘记验证输入!检查字符串是否有效字符!
现在您有一系列数字,我们称之为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的数字的优雅降级。
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;
由您决定开发高效的装配版本。
答案 1 :(得分:1)
根据您手动完成的方式细分编码步骤。这有助于想象你正在向别人解释这个过程,手工完成。
在不提供太多细节的情况下,您需要将ASCII字符转换为整数,并且您必须一次处理一个数字,从字符串的一端到另一端。对这些子任务进行函数调用将有助于您的组织。