Индексирование

Теперь мы в состоянии выполнить арифметические операции над числами, хранящимися в памяти машины. Однако без использования индексных регистров обработка больших количеств информации значительно осложняется, если не становится невозможной.

Проиллюстрируем это на примере. Предположим, что мы имеем 10 полных слов, хранящихся в памяти, начиная с адреса TABLE, и хотим вычислить сумму. На рис. 7.1 показано, как это может быть сделано без использования индекс-регистров. Если решение такой задачи кажется вам простым, хотя и несколько утомительным, попробуйте подобным образом организовать вычисление суммы 100 или 1000 чисел.

В нашем примере нам пришлось писать отдельные команды для каждого полного слова. Мы могли бы избежать этого, если бы имели возможность модификации адресов операндов в процессе выполнения программы. Предположим, что мы можем это сделать. Тогда достаточно организовать цикл, состоящий из единственной команды сложения, возложив модификацию адреса на ЭВМ. Именно для этого и используются индексные регистры.

 

Рис. 7.1. Вычисление суммы содержимых десяти слов, расположенных последовательно, начиная с адреса TABLE.

В предыдущем разделе мы уже писали символическое обозначение S2(X2), однако откладывали разговор о том, что такое (Х2), до настоящего момента. Х2 обозначает один из регистров общего назначения (регистр 0 не разрешается использовать в подобных целях). Исполнительный адрес, т. ё. адрес, который будет использоваться при выполнении команды, представляет собой сумму числа, обозначенного S2, и содержимого индекс-регистра, обозначенного Х2.

Исполнительный адрес = S2 + (Х2)

Пусть в качестве индекс-регистра используется регистр 9, и команда А помещена в цикл для вычисления суммы чисел, находящихся в памяти, начиная с адреса TABLE. Команда сложения в данном случае выглядит так:

A 7,TABLE(9)

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

К моменту первого выполнения сложения должен использоваться адрес первого слова области TABLE. Таким образом, при первом прохождении цикла регистр 9 должен содержать 0, в этом случае исполнительный адрес будет равен

TABLE+(9)=TABLE+0=TABLE

При втором прохождении цикла необходимо прибавить содержимое слова, отстоящего от TABLE на 4байта. Для этого к моменту второго прохождения цикла регистр 9 должен содержать число 4. Исполнительный адрес в этом случае будет определяться следующим образом:

TABLE+(9)=TABLE+4

В целом для последовательной адресации слов области TABLE нужно каждый раз при прохождении цикла к содержимому регистра 9 добавлять число 4. Исполнительными адресами будут именно те адреса, которые указаны на рис 7.1. Конечным значением содержимого регистра 9 в случае сложения 10 чисел должно быть число 3610. Вообще, если нам хочется сложить N чисел, то конечным значением содержимого индекс-регистра будет число, определяемое выражением 4Х X (N—1).

На рис. 7.2 иллюстрируется применение индекс-регистра для организации вычисления суммы 10 чисел, хранимых в последовательности полных слов, начинающейся по адресу TABLE. В качестве счетчика циклов используется регистр 3, начальным его значением является число 10, конечным — 0. Регистр 9 используется как индекс-регистр, его содержимое меняется от 0 до 36т.

 

Рис. 7.2. Вычисление суммы содержимых десяти слов, расположенных последовательно, начиная с адреса TABLE. Регистр 3 — счетчик циклов, регистр 9 — индекс-регистр.

Рис. 7.3. Вычисление суммы содержимых десяти слов, расположенных последовательно, начиная с адреса TABLE. Регистр 9 используется как счетчик циклов и индекс-

регистр.

Можно дополнительно увеличить эффективность программы, если учесть, что индекс-регистр может быть использован и в качестве счетчика циклов. На рис. 7.3 изображена та же программа с использованием регистра 9 в качестве как индекс-регистра, так и счетчика циклов.

Пример, приведенный на рис. 5.9, говорит о том, что совершенно необязательно хранить последовательность чисел в памяти, если каждое из них используется лишь один раз, что и имеет место в случае вычисления суммы. Каждое число может быть использовано сразу по прочтении его с перфокарты, при этом исчезает необходимость хранения его в памяти. Однако, если некоторые данные могут потребоваться более одного раза, запись их в память становится необходимой из- за невозможности их повторного чтения с перфокарт. Примером может служить задача вычисления среднего арифметического исходных чисел и разностей между каждым из них и полученным результатом.

На рис. 7.4 изображена блок-схема соответствующего решения. Сначала производится считывание карты, содержащей информацию о количестве всех чисел; это количество не должно превышать 100, что определяется DS-предложением программы, представленной на рис. 7.5, резервирующим область памяти NMBRS. Далее вычисляется конечное значение счетчика циклов (содержимого индекса-регистра). Основная часть программы состоит из трех циклов: ввода исходных чисел с карт, вычисления их суммы, необходимой для получения среднего арифметического, и вычисления и печати требуемых разностей. На рис. 7.5 приведена программа, соответствующая данной блок-схеме.

 

Рис. 7.4. Блок-схема программы вычисления среднего множества чисел и разностей между этими числами и средним.

Рис. 7.5. Программа вычисления среднего множества чисел и разностей между этими числами и средним.

В этом разделе мы сконцентрировали внимание на вопросе использования индекс-регистров для решения задач обработки списков последовательно расположенных в памяти слов. Однако, конечно же, возможности применения 'индексирования этим не исчерпываются. В следующем разделе будут продемонстрированы приемы использования индекс-регистров для обработки последовательностей полуслов. Вообще, индексирование имеет смысл во всех случаях, когда приходится производить модификацию адресов в процессе выполнения программы. Индексирование обеспечивает необходимую гибкость для осуществления возможности доступа к любому элементу хранимых данных.

 
Статьи раздела