<<
>>

Обработка 8-битовых данных

По принятым в большинстве языков программирования правилам, которые ес- тественно вытекают из необходимости на машинном уровне (да и в обычной жизни) где-то хранить обрабатываемые данные и результаты, а в командах ука- зывать адреса их хранения, необходимо предварительно выделить поля для всех используемых величин.
Для этого в сегменте данных программы с помощью дирек- тив определения данных резервируются рабочие поля. Целесообразно в качестве меток рабочих полей выбирать имена переменных, участвующих в вычислениях. Поскольку длина данных считается равной одному байту, для резервирования следует использовать директиву db. Так как значения переменных, участвующих в вычислениях, еще не известны, в директиве db следует использовать пара- метр «?», резервирующий пустые рабочие поля. Конкретные значения в эти поля попадут в результате выполнения операций ввода данных уже в процессе выполнения программы. Итак, директива резервирования рабочего поля для хранения значения, например, переменной а должна выглядеть следующим об- разом: а db ?.
Аналогичные директивы должны определять рабочие поля для всех используемых в программе переменных.

Как уже отмечалось, все директивы определения данных целесообразно группи- ровать в отдельном программном сегменте данных. Выберем для ограничиваю- щих этот сегмент директив метку dtsg. Весь программный сегмент данных за- нимает первые семь строк листинга 4.2. Далее (строки 8-10 листинга) следует программный сегмент стека, структура которого обсуждалась ранее.

Листинг 4.2. Пример линейной программы

Описывающие требуемые вычисления команды программы принято группиро- вать в программном сегменте кода.

Для ограничивающих этот сегмент директив выберем метку сdsg. Обычно директиву assume размещают в начале сегмента кода (строка 13), хотя это и не обязательно.

Следующие пять строк этого сегмента занимают обсуждавшиеся выше началь- ные действия по инициализации программы, которые диктуются правилами опе- рационной системы (см. 4.3.6 и рис. 4.27, б). Отметим только, что в них применен основанный на командах push и pop альтернативный вариант формирования в регистре ds адреса программного сегмента данных (строки 16 и 17 листинга).

Далее в программе следует организовать ввод значений переменных а, ⅛, с и d, для которых должен быть выполнен расчет значения х. Как попадают исходные данные в рабочие поля, мы обсуждать не будем, потому что вопросы организа- ции обмена с внешними устройствами довольно сложно решаются даже на язы- ках высокого уровня. Ранее упоминалось, что в Ассемблере эти проблемы ре- шают с помощью обращения к стандартным средствам обмена, предусмотренным в операционной системе. В листинге 4.2 программы организация ввода заменена многоточием (строка 18).

Общая схема вычислений в данном случае проста и диктуется только правилами старшинства операций. Искомое значение х представлено дробью. Для вычисле- ния ее значения вначале следует организовать вычисление числителя, а затем знаменателя (можно и наоборот). В числителе сначала вычисляются два произ- ведения, 2а и bс, а затем находится их сумма. Знаменатель находится в одно дей- ствие вычитания. После чего целочисленным делением находится искомое зна- чение X, которое следует переписать в подготовленное для него поле памяти.

Начнем с вычисления слагаемого 2а. Его можно найти простым суммировани- ем а + а. Однако чтобы продемонстрировать стандартно используемые приемы, получим это значение с помощью умножения. По правилам выполнения умно- жения в системе команд процессора i8О86 один из сомножителей должен нахо- диться в регистре аl (для 8-битовых сомножителей). Поэтому перешлем первый сомножитель 2 в регистр аl.

А в следующей команде умножения укажем второй сомножитель b. Результат 2а получается в регистре ах. Таким образом найдено первое слагаемое (строки 19 и 20 листинга).

Второе слагаемое можно найти точно таким же способом. Но проблема в том, что, получая второе слагаемое bс в регистре ах, мы тем самым уничтожим уже находящееся там первое слагаемое 2а. Следовательно, его нужно предварительно переписать для промежуточного хранения в любой свободный 16-битовый ре- гистр. Выберем для этого регистр сх (строка 21 листинга).

Строки 22 и 23 листинга содержат уже обсуждавшиеся команды, с помощью ко- торых в регистре ах формируется второе слагаемое числителя bс.

На данный момент рассуждений имеется следующая ситуация. В регистре ах находится первое слагаемое числителя, а в регистре сх — его второе слагаемое. Результат можно получить и в регистре сх (командой add сх, ах) и в регистре ах (командой add ах, сх). Возникает вопрос: какой вариант выбрать? Если проанализировать те действия, которые придется выполнять в дальнейшем, ста- новится ясно, что целесообразно организовать получение числителя в регистре ах, так как потребуется выполнить его деление на знаменатель. Поэтому для по- лучения числителя выбрана команда add ах, сх (строка 24 листинга).

Теперь займемся знаменателем. Уменьшаемое d находится в поле памяти. Из него требуется вычесть число 3. Это можно сделать командой вычитания с непо- средственным операндом sub d, 3. Но в этом случае записываемый в поле d результат вычитания уничтожит значение уменьшаемого. В программировании действует негласное правило, в соответствии с которым полученные путем ввода значения исходных данных программы изменять категорически не рекомендует- ся. Поэтому уменьшаемое d следует предварительно переписать в другое место, например, в регистр Ы, как это сделано в строке 25 листинга. Полученный с по- мощью команды вычитания (строка 26) в регистре Ы знаменатель дроби теперь можно указать в качестве операнда команды деления (строка 27). Результаты де- ления формируются в регистре ах.

Далее интересующее нас частное х следует переслать из регистра аl в приготовленное для него поле в сегменте данных (стро- ка 28). Организация вывода полученных результатов в программе также опущена.

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

А вот вопрос: «Какие проблемы могут возникнуть при выполнении программы?» — необходимо задавать себе в любом случае анализа программы, а особенно если в ней имеются операции деления. Возможно ли возникновение ситуации, в которой знаменатель окажется равным нулю? Очевидно, возможно. Достаточно в качестве значения переменной d задать число 3. Кроме того, возможен вариант, когда ре- зультат деления не поместится в регистр аl. В связи с этим, строго говоря, предло- женный вариант программы не является корректным. Перед выполнением деления необходимо организовать проверку на равенство знаменателя нулю. Далее нужно каким-то образом проверить, поместится ли результата деления в регистре аl.

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

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

Еще по теме Обработка 8-битовых данных:

  1. 3.3.4. Методы обработки и анализа данных
  2. Статистическая обработка.
  3. ИНФОРМАЦИЯ: ОБРАБОТКА ПОСЛЕДОВАТЕЛЬНАЯ (
  4. ИНФОРМАЦИЯ: ОБРАБОТКА ПАРАЛЛЕЛЬНАЯ
  5. ТЕОРИЯ УРОВНЕЙ ОБРАБОТКИ
  6. Обработка материалов
  7. ДАННОЕ: ОБРАБОТКА СТАТИСТИЧЕСКАЯ
  8. Григорьев Ю.А., Ревунков Г.И.. Банки данных, 2002
  9. Обработка результатов
  10. ГЛАВА ДЕВЯТАЯ ОБРАБОТКА ИНФОРМАЦИИ В УМЕ
  11. Пример обработки протокола.
  12. Алгоритм обработки результатов.
  13. Обработка материала
  14. Обработка ответов
  15. ОБРАБОТКА ВТОРИЧНАЯ