2011-12-10 3 views
0

Мне нужна помощь в написании программы, которая должна подсчитывать количество раз, когда в строке появляется буква (в верхнем или нижнем регистре). Вы можете жестко закодировать строку или прочитать ее с консоли. Ваша программа должна отображать окончательный счетчик для каждой буквы алфавита.Программа сборки 8086: подсчет персонажей

Пример

Входной сигнал:

«Осторожно ошибок в коде выше; Я только доказал это правильно, не пробовал. -Donald Кнут»

Выход:

А: 4, В: 3, С: 3, D: 5, Е: 9, F 1, G: 1, Н: 3, I: 5, J: 0, К: 1, л: 2, М: 0, N 5, O: 8, Р: 1, Q: 0, Р: 5, S 1, Т: 7, U: 2, V: 3, W: 1, X: 0, Y: 1, Z: 0

Я думаю, что знаю структуру, но поскольку у меня нет 26 регистров для работы, мне придется сохраняйте значение для каждой добавочной буквы в собственном сегменте памяти. Как я к этому подхожу. Спасибо.

ответ

1

Учтите, что вы можете заблокировать кусок памяти и назначить некоторое количество байтов для каждого номера. Затем, чтобы перейти к определенной букве, используйте целочисленное значение буквы, умноженное на длину ячейки.

Например, если вы выбрали четыре байта (типичную целую длину) для каждой ячейки, вы отложите 4 * 256 байт и введите в нее что-то вроде $ STARTOFARRAY + (4 * 97) и увеличьте это целое число.

+0

затем повторите попытку и используйте меньше памяти :) – f3r3nc

+0

, но не досрочная оптимизация. :) –

0

Выделите блок памяти достаточно большой, чтобы содержать 26 элементов (каждый элемент может быть 1 байт, 2 байта, 4 байта или сколько угодно). Простым способом является создание этого блока памяти в разделе .bss с использованием db/dw/dd. Каждый элемент в этом блоке будет соответствовать букве алфавита.

Теперь, когда у вас есть свой блок памяти, вам нужно каким-то образом проиндексировать его. Здесь у вас есть два варианта:

  • Если персонаж находится в диапазоне ['A', 'Z'], вычитать 'A' получить индекс, если персонаж находится в диапазоне ['a', 'z'], вычитать 'a' получить индекс, в противном случае игнорировать характер.

  • Преобразование в верхнем регистре в нижний регистр или наоборот. Если вы посмотрите на ASCII table, вы увидите, что буквы в нижнем регистре имеют большее значение, чем буквы верхнего регистра. Оттуда вы должны иметь возможность определить, как преобразовать символ в строчный. Как только у вас будет свой строчный символ, вычтите из него 'a', чтобы получить индекс.

После того, как у Вас есть свой индекс, используйте его индекс в вашем блоке памяти путем добавления индекса, умноженное на размер каждого элемента в адрес начала блока. Как только у вас есть адрес этого элемента, inc введите его.

Повторяйте до тех пор, пока все символы не будут прочитаны, а затем напечатайте результат. Если вам нужно написать функцию печати самостоятельно, обратите внимание, что она становится немного менее тривиальной для вывода чисел с более чем одной цифрой.Это уже не вопрос добавления '0', чтобы получить эквивалент ASCII этого номера, чтобы его распечатать.

+0

Как бы выделить блок памяти с помощью db/dw/dd? –

+0

@LucaDeCaprio: A * basic * способ: «массив db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0'. В зависимости от вашего ассемблера есть короткие способы. – AusCBloke

+0

Итак, как бы я увеличил букву B в массиве? Я никогда не использовал db до –