<<
>>

Работа с массивами

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

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

Поэтому преобразуем искомую сумму к эквивалентному виду:

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

Прежде всего нужно выделить место в памяти для хранения всех элементов мас- сива.

Для простоты будем считать, что каждое слагаемое может быть представле- но беззнаковым однобайтовым кодом. Это ограничение означает, что рассмат- риваются только слагаемые, удовлетворяющие неравенствам 0 < а{ < 255, Vi = = 0, i 2,..., 99 Элементы массива а целесообразно разместить в последовательно- сти из 100 подряд расположенных байтов. Это можно сделать с помощью дирек- тивы а db 100 duр (?), которая обеспечивает приведенную на рис. 4.41 схему размещения элементов массива в оперативной памяти.

Рис. 4.41. Схема хранения однобайтовых элементов массива в оперативной памяти

Для доступа к отдельным элементам массива предусмотрена обсуждавшаяся ра- нее косвенная адресация с индексированием и смещением.

Для определенности выберем индексирование через регистр di. Если осуществлять перебор значений в регистре di от 0 до 99, то с помощью записанного в ассемблерном формате адреса а[di] можно по очереди выбрать каждое из слагаемых, занимающих поле а. В самом деле, если в регистре di находится нулевое значение, то а [ 0 ]

представляет собой внутрисегментное смещение, определяющее адрес поля а, то есть адрес нулевого слагаемого. Каждый последующий инкремент индекса di в операнде а [di] обеспечивает адресацию следующего байта поля а, то есть следующего слагаемого. Эти соображения, собственно говоря, и лежат в основе сделанного ранее перехода от суммирования в пределах от 1 до 100 к суммирова- нию в пределах от 0 до 99.

Накопление суммы можно осуществить с помощью схемы, обсуждавшейся в пре- дыдущем примере (см. рис. 4.40). Однако в учебных целях рассмотрим вариант построения цикла с возрастающим значением индекса, который, согласно фор- муле, должен изменяться от 0 до 99.

В соответствии с предыдущими рассуждениями для накопления суммы выберем регистр ах, а для хранения индекса выделим регистр di. Тогда подготовка к циклу заключается в очистке регистров ах и di. Способы такой очистки обсуждались ранее: sub ах, ах и sub di, si. Можно использовать и другие варианты, на- пример mоv ах, 0.

В команде добавления очередного слагаемого вместо содержащего это слагаемое регистра сх следует указать адрес поля памяти, в котором находится слагаемое. Ранее мы выяснили, что любое текущее слагаемое следует адресовать операндом а [di]. Таким образом, приходим к команде вида cont add ах, а [di]. От- метим, что адрес а [di ] при [di ] =0 определяет нулевое слагаемое я0. Поэто- му в результате первого выполнения этой команды в регистр ах попадает ну- левое слагаемое.

Для огранизации переходов от текущего слагаемого к следующему нужно уве- личивать на единицу номер слагаемого. Это можно сделать командой iпс di.

Следующий этап связан с проверкой на завершение цикла.

Известно, что послед- ним значением индекса должно быть число 99. Сравним содержимое регистра di и число 99 командой сmр di, 99. Если разность i - 99 < 0, значит, еще не все слагаемые рассмотрены и нужно продолжить цикл. Для проверки такого ус- ловия и перехода на начало цикла можно использовать команду j lе сопt.

Объединяя выписанные ранее команды, получим приведенный в листинге 4.4 фрагмент программы, которая решает поставленную задачу.

Мысленно проверим ход накопления суммы. После первого возврата к команде суммирования [di] = 1, следовательно, адрес а[di] определяет слагаемое ax. Аналогично, после второго возвращения [di] = 2, и тот же самый адрес опреде- ляет a2. Вообще после возвращения с номером г к сумме добавляется слагаемое аг. Последний возврат произойдет, когда [di] = 99, следовательно, к накапливае- мой сумме добавится последнее слагаемое

<< | >>
Источник: Степанов А. Н.. Архитектура вычислительных систем и компьютерных сетей. 2007

Еще по теме Работа с массивами:

  1. 18.5. Права и обязанности держателя (обладателя) по работе с массивами персональных данных
  2. Рэйки – это, прежде всего работа, ежедневная работа над собой.
  3. § 5. Особенности обязательств по производству эвристических работ (на примере научно-исследовательских, опытно-конструкторских и технологических работ — НИР и ОКТР) (п. 2137-2143)
  4. 1 . Узнайте как можно больше о своей работе и о том, как она вписывается в работу всей фирмы.
  5. Очерк 1: Эмили «Лучшая работа для меня та, которой я сама довольна. Мне нравится, когда мои работы говорят о том, о чем я сама хочу сказать»
  6. РАБОТА ПОСЛЕ РАБОТЫ
  7. 2. ИСТОЧНИКИ ИНФОРМАЦИИ. СПЕЦИФИКА И АЛГОРИТМЫ РАБОТЫ С ИСТОЧНИКАМИ ИНФОРМАЦИИ. ДОСТУП К ИСТОЧНИКАМ ИНФОРМАЦИИ. ПРАВОВЫЕ И ЭТИЧЕСКИЕ НОРМЫ РАБОТЫ С ИСТОЧНИКАМИ ИНФОРМАЦИИ.
  8. 18.6. Государственное регулирование работы с персональными данными
  9. 18.3. Правовые основы работы с персональными данными
  10. Работа.
  11. Работа.
  12. О работе
  13. О работе
  14. 1.2.1.3. Работы сменами
  15. КУРСОВЫЕ РАБОТЫ
  16. § 5. Работы. Услуги
  17. Статья 56. Общественные работы
  18. Утверждения о работе