Обработка 8-битовых данных
Как уже отмечалось, все директивы определения данных целесообразно группи- ровать в отдельном программном сегменте данных. Выберем для ограничиваю- щих этот сегмент директив метку 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.
Поскольку организация любой проверки переводит алгоритм из класса линей- ных в класс алгоритмов с ветвлением, сейчас мы ограничимся выводом о нена- дежности полученного варианта программы, а вопросами организации ветвле- ний займемся позднее.
Еще по теме Обработка 8-битовых данных:
- 3.3.4. Методы обработки и анализа данных
- Статистическая обработка.
- ИНФОРМАЦИЯ: ОБРАБОТКА ПОСЛЕДОВАТЕЛЬНАЯ (
- ИНФОРМАЦИЯ: ОБРАБОТКА ПАРАЛЛЕЛЬНАЯ
- ТЕОРИЯ УРОВНЕЙ ОБРАБОТКИ
- Обработка материалов
- ДАННОЕ: ОБРАБОТКА СТАТИСТИЧЕСКАЯ
- Григорьев Ю.А., Ревунков Г.И.. Банки данных, 2002
- Обработка результатов
- ГЛАВА ДЕВЯТАЯ ОБРАБОТКА ИНФОРМАЦИИ В УМЕ
- Пример обработки протокола.
- Алгоритм обработки результатов.
- Обработка материала
- Обработка ответов
- ОБРАБОТКА ВТОРИЧНАЯ