Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пояснительная записка2.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
338 Кб
Скачать
☆

3. Описание логической структуры

Алгоритм программы достаточно прост и может быть расписан в три этапа.

Первый этап: пользователь вводит данные (количество интервалов разбиения, значение аргумента), которые преобразуются из символьного представления в вещественное (т.к. сопроцессор работает с вещественными числами).

Второй этап: на этом этапе происходит сравнение введенного значения аргумента с интервалами разбиения функции. В зависимости от интервала производится расчет значения функции по формулам, соответствующим данным интервалам.

Третий этап(заключительный): на этом этапе данные переводятся из вещественного представления в символьное (операция перевода не симметрична той, что описана на первом этапе ) и выдаются на экран. Программа выдает сообщение о повторном запросе и в зависимости от решения пользователя решает, повторять действия, начиная с первого по третий этап или нет.

Алгоритм программы, несомненно, заслуживает внимания, однако гораздо интереснее его реализация.

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

Основной модуль: main.asm .

К задачам модуля относятся:

  1. Хранение значений Х и У в массиве. Реализация этой задачи также

решена на основе макроса. Задачи макроса заключаются в работе с полями структуры массива для хранения данных AR. Т.к. в ассемблере напрямую работать со структурами нельзя, то в сегменте данных создан указатель на эту структуру обозначенный как Arrey. Т.о. в макросе реализована работа с полями инициализированного указателя на структуру Arrey.

2. Непосредственное вычисление значений функции. В тексте программы

(Приложение А) до стартовой точки входа в программу описаны процедуры калькуляции (interval_1, interval_2, interval_3), при помощи которых вычисляются значения функции на различных участках разбиения. Работа функций калькуляции основывается на использовании возможностей арифметического сопроцессора.

Арифметический сопроцессор значительно (в десятки раз) ускоряет вычисления, связанные с вещественными числами. Он может вычислять такие функции, как синус, косинус, тангенс, логарифмы и т.д. В процедуре interval_2 реализуется функция синус. Для реализации данной функции сначала на вершину стека сопроцессора кладем значение аргумента, а затем вызываем функцию fsin. После этого при помощи команды fstp y снимаем рассчитанное значение в переменную У.

Разумеется, что с помощью сопроцессора можно выполнять и простейшие арифметические операции сложения, вычитания, умножения и деления. В процедуре , interval_3 значение функции У вычисляется по формуле 1/х . Данные при выполнении операции записываются по принципу записи данных в стек – первым пришел, последним ушел. Операция деления в сопроцессоре реализуется по следующей схеме fdiv делимое, делитель. Делитель хранится в численном регистре ST 1, а делимое – в ST 0. По этому данные в стек помещаем в следующей последовательности: сначала заносим 1, потом заносим аргумент, вызываем функцию деления. Конечный результат заносим в У.

4. Проверка введенных значений на соответствие граничным рамкам (10-150). Реализация задачи основана на использовании условного алгоритма, который организован путем использования команды сравнения cmp команды условного перехода je. Условие же заключается в следующем: если пользователь ввел подходящее значение интервала, то после сохранения начального значения Х, управление передается на метку calc, если значение не соответствует границам интервала, то управление передается на метку exit , которая выдает сообщение об ошибке, прерывает выполнение программы.

5. Вызов внутренних и внешних процедур. К внутренним процедурам относятся процедуры, описанные в текущем программном модуле – , interval_1, , interval_2, , interval_3. К внешним процедура относятся Input_Float, Out_Float – процедуры перевода числа из символьного представления в вещественное. Вызов и дальних и ближних процедур осуществляется одинаково посредством команды Call. Различия заключаются в их описании. При описании процедур дальнего типа используются ключевые слова Extern, которое обозначает, что объявленная процедура взята из другого модуля (внешняя); и FAR говорит о том, что процедура дальнего типа.

Из выше перечисленных задач основного модуля вытекает его главная задача – координация задач и обмен данными между модулями.

Модуль перевода числа из символьного представления в вещественное: input.asm

Основной задачей модуля является непосредственный перевод, который реализован в процедуре Input_Float, которая была упомянута выше.

Решение задачи производится по следующей схеме: считываем из буфера данные при помощи функции DOS 0Ah прерывания int 21h. Входные параметры, передаваемые в данную функцию (количество действительно введенных символов, сами символы и т.д.) можно просмотреть в исходном коде модуля (Приложение А). На выходе – в соответствующем поле будут сохранены данные, введенные пользователем с клавиатуры.

Теперь мы имеем доступ к данным, введенным с клавиатуры. Значит, перевод не составит труда. Перевод данных осуществляется в два этапа: сначала переводим целую часть вещественного числа, затем дробную. Для этого сравниваем первый символ введенного числа командой cmp с «.». Если первый символ точка, то сразу же переходим на перевод дробной части по формуле:

,

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

Если же целая часть присуща, то сначала переводим целую часть, учитывая, что ASCII – код любой десятичной цифры на 48 больше самого числа. Далее делим полученное значение на 10, т.о. сдвигаемся к следующему символу. После обработки всех символов, складываем дробную и целую части. Результат – переведенное в нужный формат число. (см. Приложение А)

Данные из этого модуля передаются через общую область памяти в главный модуль программы.

Модуль для перевода вещественного числа в символьное представление: out.asm

Вывод строки на экран осуществляется посредством функции 09h прерывания int 21h. Строка должна заканчиваться символом $.

На входе: АН= 09h; DS:DX – адрес строки для вывода с завершающим символом $.

Детальный алгоритм и описание перевода числа представлен в комментариях исполняемого модуля (Приложение А). Результатом решения данной задачи является число, преобразованное в экспоненциальный формат и выведенное на экран консоли.