程序集8086程序:字符计数

时间:2011-12-10 02:23:23

标签: assembly variable-assignment x86-16

我需要帮助编写一个程序,该程序应该计算字符串中字母出现(大写或小写)的次数。您可以对字符串进行硬编码或从控制台中读取它。您的程序应显示字母表中每个字母的最终计数。

示例

输入:

  

“注意上面代码中的错误;我只是证明它是正确的,没有尝试过。 -Donald Knuth“

输出:

  

A:4,B:3,C:3,d:5,E:9,F:1,G:1,H:3,I:5,J:0,K:1,L:2 ,M:0,N:5,O:8,P:1,Q:0,R:5,S:1,T:7,U:2,V:3,W:1,X:0,Y :1,Z:0

我想我知道结构,但由于我没有26个寄存器可供使用,我必须将每个递增字母的值存储在它自己的内存段中。我该如何处理。非常感谢。

2 个答案:

答案 0 :(得分:1)

考虑您可以阻止一块内存,并为每个数字分配一些字节数。然后要获取特定字母,请使用字母的整数值乘以单元格的长度。

例如,如果你为每个单元选择了四个字节(一个典型的整数长度),你就会留出4 * 256个字节,并用$ STARTOFARRAY +(4 * 97)之类的地址加入它,然后递增整数

答案 1 :(得分:0)

分配足够大的内存块以容纳26个元素(每个元素可以是1个字节,2个字节,4个字节,或者您喜欢的多个元素)。一种简单的方法是使用db/dw/dd.bss部分创建此内存块。该块中的每个元素都对应于字母表中的字母。

现在您拥有了内存块,您需要一些索引方法。在这里,您有两种选择:

  • 如果某个字符位于['A', 'Z']范围内,则减去'A'以获取索引,如果该字符位于['a', 'z']范围内,则将'a'减去获取索引,否则忽略该字符。

  • 将大写转换为小写,反之亦然。如果查看ASCII table,您会看到小写字母的值大于大写字母。从那里你应该能够找出如何将字符转换为小写的方法。获得小写字符后,从中减去'a'以获取索引。

获得索引后,通过将索引乘以每个元素的大小加到块的起始地址,将索引用于内存块。获得此元素的地址后,inc会重复该元素。

重复直到读完所有字符,然后打印结果。如果您必须自己编写打印功能,请注意输出多于一位的数字会变得不那么简单。为了打印它,不再需要添加'0'来获取该数字的ASCII等效值。