Assembly MIPS—每个小写、大写和空格字符的频率

Assembly MIPS—每个小写、大写和空格字符的频率,assembly,ascii,mips,frequency,Assembly,Ascii,Mips,Frequency,我试图计算一个字符出现的次数,包括大写和小写以及键盘输入字符串中的空格字符 我知道在ASCII码中,a-z是97-122,a-z是65-90。我不知道如何在汇编中实现这个算法,因为我对它非常陌生,这个概念让我感到困惑 我的psuedocode大致如下: // Uppercase array[0] = -65 if (character read from string > 64) { if (character read from string < 91) { inc

我试图计算一个字符出现的次数,包括大写和小写以及键盘输入字符串中的空格字符

我知道在ASCII码中,a-z是97-122,a-z是65-90。我不知道如何在汇编中实现这个算法,因为我对它非常陌生,这个概念让我感到困惑

我的psuedocode大致如下:

// Uppercase
array[0] = -65
if (character read from string > 64) {
   if (character read from string < 91) {
     increment array[i] based on character
   }
}
// Print out integers stored in array (the frequency)

“基于字符的增量数组[i]”

所以你需要基于字符的
i
。什么是性格?有些值从0到255,因为输入是ASCII编码的,所以单个字符是8位值。值0-255对于索引数组是否足够好?实际上,如果您保留256个元素的数组,它就是。通过检查不需要统计的代码(如仅对值32-127统计),可以提高内存效率,然后只需要96个计数器的数组,索引为
(character-32)
。如果要将小写字母与大写字母一起计数,甚至可以使用大写小写字母

但您也可以使用256个元素的数组对它们进行单独计数(即使是字符串中不可打印的内容),然后根据需要仅对其中的大写/小写/空格/数字部分进行选择/分组

因此,伪代码可能如下所示:

charCounters = array(256) { 0, 0, ... };
// ^^^ counters for each possible letter set to zero
for_each(character in string) {
    ++charCounters[character];   // count particular letter
}
// counters are now updated, displaying results

// for example total count of uppercase
uppercaseLettersTotalCount = 0;
for (i = 'A' to 'Z') {
    uppercaseLettersTotalCount += charCounters[i];
}
display("Total uppercase letters: " + uppercaseLettersTotalCount);

// number of 'A' letters, both upper and lowercase
totalA = charCounters['A'];
totalA += charCounters['a'];
display("Total A/a letters: " + totalA);

// ... etc

如果只想显示短字符串(5-30个字母)中单个字符的计数,则执行两个简单的破坏性内部循环(逐字符遍历字符串并从字符串的剩余部分计数相同的字符)将更快,占用的内存更少:

for (string_index in [0, string_length - 1]) {
    character = string[string_index];
    if (0 == character) continue;   // was already counted
    count = 1;
    for (index2 in [string_index + 1, string_length - 1]) {
        if (character != string[index2]) continue;  // different char
        ++count;              // same character found
        string[index2] = 0;   // mark as counted (destroys input string)
    }
    display("Character " + character + " found " + count + " many times.\n");
}

你的伪代码太伪了。用C编写一个工作实现,只使用:1)
goto
2)只使用单个赋值(例如no
y=2*x+z
character = next_char();
if (character < 'A') goto not_uppercase;
if ('Z' < character) goto not_uppercase;
// uppercase detected
...

not_uppercase:
// character is not uppercase
...
charCounters = array(256) { 0, 0, ... };
// ^^^ counters for each possible letter set to zero
for_each(character in string) {
    ++charCounters[character];   // count particular letter
}
// counters are now updated, displaying results

// for example total count of uppercase
uppercaseLettersTotalCount = 0;
for (i = 'A' to 'Z') {
    uppercaseLettersTotalCount += charCounters[i];
}
display("Total uppercase letters: " + uppercaseLettersTotalCount);

// number of 'A' letters, both upper and lowercase
totalA = charCounters['A'];
totalA += charCounters['a'];
display("Total A/a letters: " + totalA);

// ... etc
for (string_index in [0, string_length - 1]) {
    character = string[string_index];
    if (0 == character) continue;   // was already counted
    count = 1;
    for (index2 in [string_index + 1, string_length - 1]) {
        if (character != string[index2]) continue;  // different char
        ++count;              // same character found
        string[index2] = 0;   // mark as counted (destroys input string)
    }
    display("Character " + character + " found " + count + " many times.\n");
}