Разработка ассемблерной программы вычисления специальной функции

1 Введение
Распространение процессоров выявило необходимость изучения языка Ассемблер для написания программ для персональных ЭВМ из-за двух причин. Во-первых, программы, написанные на языке Ассемблер, требуют значительно меньшего объема памяти и ресурсов компьютера. Во-вторых, знание языка Ассемблер и машинного кода дает понимание архитектуры машины. А знание архитектуры машины и принципов ее работы дает возможность усовершенствовать написанные программы и повысить их быстродействие за счет применения некоторых специальных методов программирования.
Программы на языке ассемблера также переводятся в машинный код с помощью программы-транслятора, называемой ассемблером. Вопреки этому сходству с другими языками, ассемблер не является языком ни высокого, ни низкого уровня – он занимает некоторое промежуточное положение. Основное отличие между языком ассемблера и языками высокого уровня состоит в том, что операторы C или Pascal обычно переводятся в целые наборы машинных кодов, а команды ассемблера непосредственно преобразуются в соответствующий машинный код. Существуют свои достоинства у каждого языка, однако только на языке ассемблера можно писать программы, напрямую используя множество команд процессора.
Почему нельзя разрабатывать программы непосредственно в машинных кодах, если язык ассемблера и машинный код однозначно соответствуют один другому? Ответ прост: машинный код слишком громоздкий. Хотя первые программы для компьютеров действительно писались в машинном коде, сегодня по веским причинам это практически не делается. Например, многие машинные коды зависят от относительного положения в памяти. Кроме того, в чисто машинном коде не используются именованные и нет возможности указать программе фиксированные адреса, по которым содержатся различные значения и подпрограммы. Это означает, что если вы измените одну команду 10000-байтовой программе на машинном коде, то, возможно, вам придётся модифицировать кроме этого ещё 9000 других кодов!
2 Постановка задачи
Разработать программу на языке Assembler, которая вычисляет значения функции в пределах от x=1 n при изменении x с шагом H.
Код для выполнения арифметических операций двоичный.
Формат исполняемого модуля: com
Программа оформляется в виде законченного программного модуля который должен выполнять следующее функции:
1. Вывод сообщения о начале работы программы (назначение программы, разработчик)
2. Вывод приглашения для ввода исходных данных.
3. Ввод исходных данных с клавиатуры.
4. Предусмотреть обработку ошибок.
5. Выполнение заданной функции.
6. Вывод результатов на экран или в файл.
Процесс создания программы включает в себя следующие этапы:
1) Постановка задачи.
2) Методы решения задачи.
3) Разработка структур данных.
4) Разработка алгоритмов решения.
5) Разработка программы.
6) Отладка программы.
7) Оформление технической документации к программе
3 Метод решения задачи
На курсовом проектировании необходимо создать программу на языке Assembler ,выполняющую следующие операции: ввод данных с клавиатуры, вычисление заданной функции и вывод результата.
Для реализации поставленной задачи необходимо составить алгоритм программы, учитывающий как специфику программы, так и специфику языка программирования.
Программу необходимо написать по процедурному принципу, для уменьшения ее размера, а также для удобства и быстроты изменения самой программы.
Для описания данных создадим сегмент данных, в котором укажем имена переменных и их типы.
Необходимо предусмотреть следующие процедуры, реализующие следующие операции: Вывод (сообщений и результатов), Ввод (с клавиатуры), Обработка ошибок, Вычисление функции, процедура работы с экраном.
4 Разработка состава исходных, промежуточных и выходных данных
В программе используются следующие типы данных:
Таблица 1
Обозначение
Тип
Назначение
T0 – T16
db(1 байт)
Константы, содержат текст выводимого на экран сообщения
A, B, C, Y, X1, Xn, h, pause
db(1 байт)
Переменные предназначенные для записи символов набранных с клавиатуры
ascii
dw(2 байта)
Память для ASCII-кодов используется программой для хранения преобразованных значений
mn
dw(2 байта)
Константа, множитель для вычисления ASCII кодов
Ak, Bk, Ck, Yk, X1k, Xnk, xni, hk, cods
dw(2 байта)
Переменные для хранения переведённых значений в виде ASCII кодов
Cur,cuy
dw(2 байта)
Переменные для хранения координат курсора
rez1 – rez4, rezf
dw(2 байта)
Переменные для хранения промежуточных результатов вычисления
5 Разработка алгоритма решения задачи
Алгоритм решения поставленной задачи мы будем разрабатывать по процедурному принципу. Алгоритм решения задачи можно представить следующим образом:
1. Вывод сведений о программе.
2. Организация ввода данных.
3. Обработка данных (кодирование и декодирование ASCII кодов).
4. Проверка на ошибки.
5. Вычисление функции.
6. Обработка данных (перевод результата в форму для вывода)
7. Вывод результатов на экран.
8. Завершение работы программы.
Результатом выполнения данной части курсовой работы является блок-схема программы, приведенная в Приложении А и Приложении Б
6 Описание программы
Программа состоит из :
1) Главная часть – эта часть программы, которая организует пользовательский интерфейс, также она объединяет все процедуры используемые в программе.
2) (inp)Ввод – это процедура ввода всех переменных.
Заполнение происходит следующим образом:
Ввод A Ввод B Ввод C Ввод y Ввод X1 Ввод Xn Ввод Xn Введите шаг H
3) (oput) Вывод – эта процедура вывода текстовых сообщений.
4) (clear) Очистка – эта процедура очистки экрана.
5) (cursor) Установка курсора в заданное место
6) (cod) Вычисление порядкового символа производиться перевод в ASCII код
7) (decod) Обратная процедура перевода
8) (error) Обработка ошибок– процедура вывода ошибки при делении на 0
9) (zf) Процедура вывода положительного значения функции и увеличения x на h.
Значение функции Y=
Основное тело программы определено:
begin:
……………
END begin
Текст программы приведён в приложении В.
7 Отладка программы
Отладка и тестирование проводились встроенными средствами интегрированной среды программирования с помощью Turbo Debuger (TD.EXE)
После создания программы возникла необходимость исправить синтаксические и лексические ошибки. Нахождение ошибок осуществлялось попыткой запустить программу, при этом система показывала номер строки ошибки и выводила код данной ошибки. Исправление синтаксических и лексических ошибок осуществлялось при помощи пункта меню Debug, а также с помощью литературы, приведённой в разделе пояснительной записки
Список литературы. После исправления синтаксических ошибок, средствами Отладки, производилась проверка всех путей алгоритма, посредством ввода разнообразных, тестирующих данных. После устранения всех ошибок и недочётов, программа стала отвечать требованиям задания курсового проекта. Дальнейшая отладка и тестирование программы на этом прекратилось.
8 Описание языка программирования
В задании на курсовое проектирование в качестве языка программирования указан язык Ассемблер. Язык Ассемблера – это язык программирования низкого уровня, приближенный к системе команд процессора ЭВМ.
Турбо Ассемблер фирмы Borland представляет собой многопроходный ассемблер с разрешением опережающих ссылок, скоростью ассемблирования до 48000 строк в минуту (на компьютере IBM PS/2, модель 60), совместимый с макроассемблером фирмы Microsoft MASM и дополнительной возможностью использования режима расширенного синтаксиса Ideal. Независимо от вашего опыта в программировании вы, несомненно, оцените эти особенности, а также ряд других средств, которые значительно облегчают программирование на Ассемблере. Турбо Ассемблер является мощным ассемблером, работающим с командной строкой, который воспринимает ваши исходные файлы (файлы с расширением .ASM) и создает из них объектные модули (файлы с расширением .OBJ). После этого вы можете использовать программу-компоновщик фирмы Borland TLINK.EXE, отличающуюся высокой скоростью компоновки, для компоновки полученных объектных модулей и создания выполняемых файлов (файлов с расширением .EXE).
Требования к программному и аппаратному обеспечению
Турбо Ассемблер работает на компьютерах семейства IBM PC, включая модели XT, AT и PS/2, а также на полностью совместимых с ними компьютерах. Для работы Турбо Ассемблера требуется операционная система MS-DOS (версии 2.0 или более поздняя) и не менее 256К оперативной памяти.
Турбо Ассемблер генерирует инструкции процессоров 8086, 80186, 80286, 80386 и i486, а также инструкции с плавающей точкой для арифметических сопроцессоров 8087, 80287 и 80387. (Подробнее об инструкциях процессором семейства 80х86/80х87 рассказывается в книгах фирмы Intel.)
Поддержка DPMI
Турбо Ассемблер поддерживает спецификацию Интерфейса защищенного режима DOS (DOS Protected Mode Interface – DPMI). Будучи разработанным комитетом ведущих компаний-производителей программного и аппаратного обеспечения (включая Borland), DPMI определяет стандартный интерфейс, полностью использующий преимущества средств защищенного режима процессоров 80286, 386 и i486.
По мере увеличения числа компьютеров на базе процессоров 386 и i486 растет и число программных продуктов, использующих возможности этих процессоров. Защищенный и виртуальный 8086 режимы данных процессоров означают изменение самого вычислительного процесса. Теперь мы можем использовать многозадачный режим и средства расширенной памяти. Раньше организация работы прикладной программы, использующей расширенную память, в многозадачном режиме с другим программным обеспечением представляла собой проблему. Стандарт DPMI решает эту проблему. Прикладные программы, использующие расширенную память, разработанные в стандарте DPMI, будут надежно работать в многозадачных системах.
В настоящее время Турбо Ассемблер использует сервисные средства DPMI, предлагаемые Microsoft Windows. Турбо Ассемблер может работать в операционной среде, использующей средства DPMI. Если вы решите перейти на новую операционную среду, в которой эти сервисные средства доступны, то ваши затраты на программное обеспечение себя оправдают.
Примечание: Стандарт DPMI поддерживает версия Турбо Ассемблера TASMX.EXE.
Известно, что программы, выполняемые под управлением MS-DOS, могут быть одного из двух типов: COM или EXE. Основное различие этих типов заключается в том, что программы типа COM состоят из единственного сегмента памяти, в котором размещаются программные коды, данные и стек, то есть программа этого типа не может занимать объем памяти более 64 Кбайт. Программы типа ЕХЕ не ограничены по объему памяти и для хранения программных кодов, данных и стека используют разные сегменты памяти. В формате СОМ пишутся специфические программы (обработчики прерываний, резидентные программы).
9 Руководство системного программиста
Программа написана в виде com модуля. Имеет в себе следующие процедуры
Clear, cursor, oput, inp, error, zf, cod, decod.
Опишем принцип работы программы
Вывод сообщения о начале работы программы:
mov dx,0000h ;в регистр dx заносим координаты курсора (0 строка)
call cursor ;вызов процедуры установки курсора
lea dx,T0 ;загружаем подсказку (сообщение о разработчике)
call oput ;вызов процедуры вывода на экран
и т.д. нужное количество раз со смещением курсора вниз.
Аналогично производится ввод для B, C, x, y, h
Вычисление функции производится с использованием команд SUB, MUL, DIV, запись переменных и временных результатов осуществляется командой
Опишем подробнее процедуры, применяющиеся в программе
1. Процедура очистки экрана:
clear proc ;процедура очистки экрана
mov AH,6h ;переносим в регистр AH 06h
mov BH,07h ;переносим в регистр BH 07h
mov CX,0000h ;переносим в регистр CX 0000h
mov DX,184fh ;переносим в регистр DX 184fh
int 10h ;прерывание BIOS
ret ;выход из процедуры
clear endp
2. Процедура установки курсора:
cursor proc ;процедура установки курсора
mov AH,2h ;переносим в регистр AH 2h
mov BH,0 ;переносим в регистр BH 0
int 10h ;прерывание BIOS
ret ;выход из процедуры
cursor endp
3. Процедура вывода:
oput proc ;процедура вывода
mov AH,09h ;переносим в регистр AH 09h
int 21h ;прерывание DOS
ret ;выход из процедуры
oput endp
4. Процедура перевода введённого значения с клавиатуры.
cod proc ;процедура перевода введённого значения с клавиатуры
;в соответствующий ей по номеру порядковый символ ASCII
;для удобства вычислений (см. таб. ASCII)
xor ax,ax ;обнуление регистра AX
mov cods,ax ;чистим переменную decods
mov cx,10 ;заносим в регистр CX значение 10
cd: mov al,[si+bx] ;выбор ASCII – символа
and AX,000fh ;удаление 3 (AL&0Fh)
mul mn ;умножение на множитель для преобразования
add cods,ax ;добавление к полученному результату
mov ax,mn ;вычисление следующего значения множителя
mul cx ;умножение AX на CX
mov mn,ax ;запись в переменную mn значения AX
dec bx ;если не последняя цифра, то – продолжать
jnz cd ;переход по метке cd если не ноль
xor ax,ax ;обнуление регистра AX
mov ax,mn ;записываем в регистр множитель
mov mn,1 ;записываем 1 в переменную mn
ret ;выход из процедуры
cod endp ;результат после выхода из процедуры в cods
5. Процедура ввода:
inp proc ;процедура ввода
mov AH,0ah ;переносим в регистр AH 0ah
int 21h ;прерывание DOS
ret ;выход из процедуры
inp endp
6. Процедура вывода значения функции и увеличения x на h.
zf proc
mov dx,cur ;устанавливаем координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t13 ;указываем ссылку на сообщение
call oput ;вызываем процедуру вывода
mov ax,rezf ;записываем в ax результат функции
call decod ;вызов процедуры обратного перевода
mov ax,cur ;записываем в ах координаты курсора
add ax,0015h ;смещаем в право на 15
mov cuy,ax ;сохраняем новое значение курсора для вывода значения функции
mov dx,cuy ;записываем в dх координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,ascii ;заносим в dx адрес значения функции
call oput ;вызываем процедуру вывода
mov cuy,0 ;обнуляем значение курсора для вывода значения функции
mov ax,xni ;значение x
add ax,hk ;x+h
mov xni,ax ;сохраняем новое значение x
ret
zf endp
7. Процедура обратного перевода.
decod proc ;процедура перевода результата представленного в
;символах кода ASCII,
;в форму приемлемую для вывода (в виде чисел)
mov ascii,0 ;записываем 0 в переменную asc
mov cx,10 ;заносим в регистр CX значение 10
lea si,ascii+4 ;заносим в регистр si значение asc смещенное на 4
dcd2: cmp ax,10 ;сравниваем значение в регистре AX с 10
jb dcd1 ;если в АХ число меньше 10, то – выход
xor dx,dx ;обнуление
div cx ;деление содержимого AX на 10; остаток – в DL
or dl,30h ;формирование кода ASCII очередной цифры
mov [si],dl ;сохранение ASCII – символа
dec si ;декремент si-1
jmp dcd2 ;переход на dcd2
dcd1: or al,30h ;формирование кода ASCII последней (старшей) цифры
mov [si],al ;сохранение ASCII – символа
ret ;выход из процедуры
decod endp
8. Процедура обработки ошибки
error proc ;ошибка при делении на 0
mov dx,0D00h ;указываем координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t14 ;указываем ссылку на сообщение
call oput ;вызываем процедуру вывода
mov ah,0ah ;считываем ввод
lea dx,pause ;записываем в регистр
int 21h
jmp exit
ret
error endp
10 Руководство оператора
Программа состоит из запускного KR.COM файла, в дистрибутив также включены файлы TASM.EXE, TD.EXE, TLINK.EXE, KR.asm и поставляется на любом носителе. Также идет исходный текст программы, который можно скомпилировать в тот же com файл.
Делается это так : набирается в командной строке
tasm.exe KR.asm /w0 /m9
tlink.exe KR.obj /t
Результатом работы данных программ является запускной com файл KR.COM.
Для запуска программы необходимо нажать ENTER на файле KR.COM.
Результатом выполнения программы будет:
Вывод текстового сообщения об авторах программы, и реализуемой с помощью нее функции, а также предложение о вводе необходимых переменных. После ввода всех данных программа выводит конечный результат. Для выхода из программы необходимо нажать ENTER.
11 Заключение
Итогом данной курсовой работы стала программа вычисления специальной функции. Программа соответствует всем требованиям, предъявленным в данном курсовом проектировании.
12 Список литературы
1. Абель П. Язык программирования для IBM PC и программирования.-
М.: Выс. шк., 1992.
2. Бек Л. Введение в системное программирование. – М.: Мир, 1988.
3. Бредли Л. Программирование на языке ассемблера для ПЭВМ фирмы
IBM. – М.: Радио и связь, 1988.
4. Брябрин В.М. Программное обеспечение ПЭВМ. – М.: Наука, 1988.
5. ГОСТ 2.104-68. ЕСКД. Основные надписи.
6. ГОСТ 2.105-79. ЕСКД. Общие требования к текстовым документам.
7. ГОСТ 2.106-68. ЕСКД. Текстовые документы.
8. ГОСТ 2.301-68. ЕСКД. Форматы.
9. ГОСТ 2.303-68. ЕСКД. Линии.
10. ГОСТ 2.304-68. ЕСКД. Шрифты чертежные.
11. ГОСТ 19.101-77. ЕСПД. Виды программ и программных документов.
12. ГОСТ 19.103-77. ЕСПД. Обозначения программ и программных до-
кументов.
13. ГОСТ 19.105-78. ЕСПД. Общие требования к программным докумен-
там.
14. ГОСТ 19.401-78. ЕСПД. Текст программы.
15. ГОСТ 19.402-78. ЕСПД. Описание программы.
16. ГОСТ 19.502-78. ЕСПД. Описание применения.
17. ГОСТ 19.503-79. ЕСПД. Руководство системного программиста.
18. ГОСТ 19.504-79. ЕСПД. Руководство программиста.
19. ГОСТ 19.505-79. ЕСПД. Руководство оператора.
20. ГОСТ 19.701-90. ЕСПД. Схемы алгоритмов, программ, данных и
систем. Условные обозначения и правила выполнения. – М.: Издательст-
во стандартов, 1991.
21. Грис Д. Конструирование компиляторов для ЦВМ. – М.: Мир,
1975.
22. Дао Л. Программирование микропроцессора 8088. – М.: Мир,
1988.
23. Джордейн Р. Справочник программиста персональных компьютеров
типа IBM PC, XT и AT.- М.: Финансы и статистика, 1991.
24. Зуев Е.А. Язык программирования Turbo Pascal 6.0. – М.: Уни-
тех, 1992.
25. Йенсен К., Вирт Н. Паскаль: руководство для пользователя. –
М.: Финансы и статистика, 1989.
26. Льюис Ф., Розенкранц Д., Стирнз Р. Теоретические основы
проектирования компиляторов. – М.: Мир, 1980.
27. Лю Ю-Чжен, Гибсон г. Архитектура, программирование и проек-
тирование микрокомпьютерных систем. – М.: Радио и связь, 1987.
28. Нортон П. Персональный компьютер фирмы IBM и операционная
система MS DOS. – М,: Радио и связь, 1991.
29. Нортон П. Справочное руководство по MS DOS. – М.: Радио и
связь, 1992.
30. РД40.РСФСР-050-87. Проекты (работы) дипломные и курсовые.
Правила оформления. Руководящий нормативный документ.
31. Скляров В.А. Применение ПЭВМ. В 3 кн. Кн.1. Организация и уп-
равление ресурсами ПЭВМ. Кн.2. Операционные системы ПЭВМ : Практич.
пособие. – М.: Выс. шк., 1992.
32. Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на
языке ассемблера. – М.: Радио и связь, 1991.
33. Фигурнов В.Э. IBM PC для пользователя. – м: Финансы и ста-
тистика, 1991.
34. Хершель Р. Turbo Pascal 4.0/5.0. – Вологда: МИК, 1991.
35. Чижов А.А. Системные программные средства ПЭВМ. – М.: 1990.
36. Шнайдер А. Язык ассемблера для персонального компьютера
фирмы IBM. – М.: Мир, 1988.
Приложение А. Схема данных
Переменная
Тип данных
Назначение
t0
DB
Содержит текстовое сообщение
t1
DB
Содержит текстовое сообщение
t2
DB
Содержит текстовое сообщение
t3
DB
Содержит текстовое сообщение
t4
DB
Содержит текстовое сообщение
t5
DB
Содержит текстовое сообщение
t6
DB
Содержит текстовое сообщение
t7
DB
Содержит текстовое сообщение
t8
DB
Содержит текстовое сообщение
t9
DB
Содержит текстовое сообщение
t10
DB
Содержит текстовое сообщение
t11
DB
Содержит текстовое сообщение
t12
DB
Содержит текстовое сообщение
t13
DB
Содержит текстовое сообщение
t14
DB
Содержит текстовое сообщение
t15
DB
Содержит текстовое сообщение
t16
DB
Содержит текстовое сообщение
A
DB
Хранение значения A введённое с клавиатуры
B
DB
Хранение значения B введённое с клавиатуры
C
DB
Хранение значения C введённое с клавиатуры
Y
DB
Хранение значения Y введённое с клавиатуры
X1
DB
Хранение значения X1 введённое с клавиатуры
Xn
DB
Хранение значения Xn введённое с клавиатуры
h
DB
Хранение значения h введённое с клавиатуры
pause
DB
Хранение значения stp введённое с клавиатуры
ascii
DW
Память для ASCII-кодов
cur
DW
Хранение координат курсора вывода сообщения
cuy
DW
Хранение координат курсора вывода результата
rezf
DW
Хранение результата функции
rez1
DW
Хранение промежуточных результатов
rez2
DW
Хранение промежуточных результатов
rez3
DW
Хранение промежуточных результатов
rez4
DW
Хранение промежуточных результатов
rez5
DW
Хранение промежуточных результатов
rez6
DW
Хранение промежуточных результатов
rez7
DW
Хранение промежуточных результатов
Ak
DW
Хранение переведённого значения A
Bk
DW
Хранение переведённого значения B
Ck
DW
Хранение переведённого значения C
Yk
DW
Хранение переведённого значения y
X1k
DW
Хранение переведённого значения x1
Xnk
DW
Хранение переведённого значения xn
Xni
DW
Хранение временного значения х
hk
DW
Хранение переведённого значения шага h
mn
DW
Константа равная 1 (множитель для перевода)
cods
DW
Хранение переведённого значения

Приложение Б. Схема программы
Блок-схема вычисления значения функции

Приложение В. Текст программы.
CODE SEGMENT ;начало сегмента кода
ORG 100h
start proc
ASSUME cs:code ;директива установки сегмента кода
begin:
call clear ;вызов процедуры очистки экрана
mov dx,0000h ;записываем в dх координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t0 ;указываем ссылку на сообщение
call oput ;вызываем процедуру вывода
mov dx,0100h ;записываем в dх координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t1 ;указываем ссылку на сообщение
call oput ;вызываем процедуру вывода
mov dx,0200h ;записываем в dх координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t2 ;указываем ссылку на сообщение
call oput ;вызываем процедуру вывода
mov dx,0320h ;записываем в dх координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t3 ;указываем ссылку на сообщение
call oput ;вызываем процедуру вывода
mov dx,0420h ;записываем в dх координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t4 ;указываем ссылку на сообщение
call oput ;вызываем процедуру вывода
mov dx,0520h ;записываем в dх координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t5 ;указываем ссылку на сообщение
call oput ;вызываем процедуру вывода
mov dx,0600h ;записываем в dх координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t6 ;указываем ссылку на сообщение
call oput ;вызываем процедуру вывода
;Ввод значения А
mov dx,0600h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t7 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,A ;записываем в регистр
int 21h ;прерывание DOS
mov bl,A+1 ;в bl записываем значение A со смещением на 1
lea si,A+1 ;в si записываем значение A со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov Ak,ax ;записываем переведённое значение
;Ввод значения B
mov dx,0700h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t8 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,B ;записываем в регистр
int 21h ;прерывание DOS
mov bl,B+1 ;в bl записываем значение B со смещением на 1
lea si,B+1 ;в si записываем значение B со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov Bk,ax ;записываем переведённое значение
;Ввод значения C
mov dx,0800h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t9 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,C ;записываем в регистр
int 21h ;прерывание DOS
mov bl,C+1 ;в bl записываем значение C со смещением на 1
lea si,C+1 ;в si записываем значение C со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;обнуляем регистр
mov ax,cods ;пишем в ax введённое значение
mov Ck,ax ;записываем переведённое значение
;Ввод значения Y
mov dx,0900h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t10 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,y ;записываем в регистр
int 21h ;прерывание DOS
mov bl,y+1 ;в bl записываем значение Y со смещением на 1
lea si,y+1 ;в si записываем значение Y со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov Yk,ax ;записываем переведённое значение
;Ввод значения X1
mov dx,0A00h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t11 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,x1 ;записываем в регистр
int 21h ;прерывание DOS
mov bl,x1+1 ;в bl записываем значение X1 со смещением на 1
lea si,x1+1 ;в si записываем значение X1 со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov X1k,ax ;записываем переведённое значение
;Ввод значения Xn
mov dx,0B00h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t12 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,xn ;записываем в регистр
int 21h ;прерывание DOS
mov bl,xn+1 ;в bl записываем значение Xn со смещением на 1
lea si,xn+1 ;в si записываем значение Xn со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov Xnk,ax ;записываем переведённое значение
;Ввод значения h
mov dx,0C00h ;координаты курсора
call cursor ;вызов процедуры
lea dx,t13 ;загружаем подсказку
call oput ;выводим на экран
mov ah,0ah ;считываем ввод
lea dx,h ;записываем в регистр
int 21h ;прерывание DOS
mov bl,h+1 ;в bl записываем значение h со смещением на 1
lea si,h+1 ;в si записываем значение h со смещением на 1
call cod ;вызываем процедуру перевода
sub ax,ax ;чистим регистр
mov ax,cods ;пишем в ax введённое значение
mov hk,ax ;записываем переведённое значение
mov cur,0D00h ;сохранение в переменной координаты курсора
;Вычисление функции
mov ax,X1k ;пишем в ax значение X1k
mov Xni,ax ;устанавливаем в xni значение X1
mov ax,Xni ;пишем в ax значение Xcod
cmp ax,Yk ;пишем в ax значение Yk
je er ;переход по метке er если X=Y
jg Bbol ;переход по метке Bbol если X>Y
er: ;метка
call error ;вызов процедуры обработки ошибки
Bbol: ;metka
dal: ;метка
mov ax,Xni
mul xni;X^2
mov rez1,ax
mov ax,Yk
mul ax
mov rez2,ax
mov ax,rez1
mov bx,rez2
add ax,bx
mov bx,ax
mov ax,Ak
mul bx
mov rez3,ax
mov ax,rez1
mov bx,rez2
sub ax,bx
mov bx,Bk
mul bx
mov cx,ax
mov ax,rez3
cwd
div cx
mov rez3,ax
mov ax,Xni
mov bx,Yk
sub ax,bx
mov bx,ax
mov ax,Ck
cwd ;преобразование байта в слово dx:ax
div bx
mov bx,ax
mov ax,rez3
sub ax,bx
mov rezf,ax ;сохраняем результат
mov ax,cur ;в ax заносим координаты курсора
add ax,0100h ;смещение координаты на строку вниз
mov cur,ax ;сохраняем новые координаты
call zf ;процедура для вывода значения f(x)
mov ax,xni ;пишем обновлённый х
cmp ax,Xnk ;ставниваем с последним значением итервала
jg exit ;если x > xn то exit
jmp dal ;иначе продолжаем считать
exit: ;метка
mov ah,0ah ;считываем ввод
lea dx,pause ;записываем в регистр
int 21h
mov ah,4ch ;переносим в регистр AH 4ch (код для выхода)
int 21h ;прерывание DOS

;———————————————————————————————————-
t0 DB ‘Курсовая работа по СПО’,’$’
t1 DB ‘Выполнил ст.гр. 02В3 Grinin Igor’,’$’
t2 DB ‘Программа вычисления функции:’,’$’
t3 DB ‘ A*(X^2+Y^2) C’,’$’
t4 DB ‘F(x)= ————— – —‘,’$’
t5 DB ‘ B*(X^2-Y^2) X+Y’,’$’
t6 DB ‘Ввод данных:’,’$’
t7 DB ‘Введите A : ‘,’$’ ;подсказка о том что следует ввести значение A
t8 DB ‘Введите B : ‘,’$’ ;подсказка о том что следует ввести значение B
t9 DB ‘Введите C : ‘,’$’ ;подсказка о том что следует ввести значение B
t10 DB ‘Введите y : ‘,’$’ ;подсказка о том что следует ввести значение Y
t11 DB ‘Введите X1 : ‘,’$’ ;подсказка о том что следует ввести значение x1
t12 DB ‘Введите Xn : ‘,’$’ ;подсказка о том что следует ввести значение xn
t13 DB ‘Введите шаг H : ‘,’$’ ;подсказка о том что следует ввести значение H
t14 DB ‘Значение функции Y= ‘,’$’
t15 DB ‘Ошибка – B-Y=0 невозможно выполнить деление’,’$’
t16 DB ‘Значение функции Y= ‘,’$’
pause DB 1 dup (” “),’$’ ;дляпаузы
A DB 1 dup (” “),’$’
B DB 1 dup (” “),’$’
C DB 1 dup (” “),’$’
Y DB 1 dup (” “),’$’
X1 DB 1 dup (” “),’$’
Xn DB 1 dup (” “),’$’
h DB 1 dup (” “),’$’
ascii DW 4 dup (?),’$’ ;памятьдля ASCII-кодов
Ak DW ? ;переменные для перевода введёного значения с клавиатуры
Bk DW ? ;в соответствующий ей по номеру порядковый символ ASCII
Ck DW ?
Yk DW ? ;для удобства вычислений
X1k DW ?
Xnk DW ?
hk DW ?
xni DW ? ;изменяющееся значение х
cur DW ? ;координаты для курсора
cuy DW ? ;координаты курсора для вывода F(x)
rez1 DW ? ;промежуточный результат
rez2 DW ? ;промежуточный результат
rez3 DW ? ;промежуточный результат
rez4 DW ? ;промежуточный результат
rezf DW ? ;результат функции
codsDW ?
mn DW 1
start endp
;———————————————————————————————————-
;Процедуры
;———————————————————————————————————-
clear proc ;процедура очистки экрана
mov AH,6h ;переносим в регистр AH 06h
mov BH,07h ;переносим в регистр BH 07h
mov CX,0000h ;переносим в регистр CX 0000h
mov DX,184fh ;переносим в регистр DX 184fh
int 10h ;прерывание BIOS
ret ;выход из процедуры
clear endp
;———————————————————————————————————-
cursor proc ;процедура установки курсора
mov AH,2h ;переносим в регистр AH 2h
mov BH,0 ;переносим в регистр BH 0
int 10h ;прерывание BIOS
ret ;выход из процедуры
cursor endp
;———————————————————————————————————-
oput proc ;процедура вывода
mov AH,09h ;переносим в регистр AH 09h
int 21h ;прерывание DOS
ret ;выход из процедуры
oput endp
;———————————————————————————————————-
inp proc ;процедура ввода
mov AH,0ah ;переносим в регистр AH 0ah
int 21h ;прерывание DOS
ret ;выход из процедуры
inp endp
;———————————————————————————————————-
error proc ;ошибка при делении на 0
mov dx,0D00h ;указываем координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,t15 ;указыкаем ссылку на сообшение
call oput ;вызываем поцедуру вывода
mov ah,0ah ;считываем ввод
lea dx,pause ;записываем в регистр
int 21h
jmp exit
ret
error endp
;———————————————————————————————————-
zf proc
mov dx,cur ;устанавливаемкоординатыкурсора
call cursor ;вызов процедуры установки курсора
lea dx,t14 ;указыкаем ссылку на сообшение
call oput ;вызываем поцедуру вывода
mov ax,rezf ;записываем в ax результат функции
call decod ;вызов процедуры обратного перевода
mov ax,cur ;записываем в ах координаты курсора
add ax,0015h ;смещаем в право на 15
mov cuy,ax ;сохраняем новое значение курсора для вывода значения функции
mov dx,cuy ;записываем в dх координаты курсора
call cursor ;вызов процедуры установки курсора
lea dx,ascii ;заносим в dx адрес значения функции
call oput ;вызываем поцедуру вывода
mov cuy,0 ;обнуляем значение курсора для вывода значения функции
mov ax,xni ;значение x
add ax,hk ;x+h
mov xni,ax ;сохраняем новое значение x
ret
zf endp
;———————————————————————————————————-
cod proc ;процедура перевода введённого значения с клавиатуры
;в соответствующий ей по номеру порядковый символ ASCII
;для удобства вычислений (см. таб. ASCII)
xor ax,ax ;обнуление регистра AX
mov cods,ax ;чистим переменную decods
mov cx,10 ;заносим в регистр CX значение 10
cd: mov al,[si+bx] ;выбор ASCII – символа
and AX,000fh ;удаление 3 (AL&0Fh)
mul mn ;умножение на множитель для преобразования
add cods,ax ;добавление к полученому результату
mov ax,mn ;вычисление следующего значения множителя
mul cx ;умножение AX на CX
mov mn,ax ;запись в переменную mn значения AX
dec bx ;если не последняя цифра, то – продолжать
jnz cd ;переход по метке cd если не ноль
xor ax,ax ;обнуление регистра AX
mov ax,mn ;записываем в регистр множитель
mov mn,1 ;записываем 1 в переменную mn
ret ;выход из процедуры
cod endp ;результат после выхода из процедуры в cods
;———————————————————————————————————-
decod proc ;процедура перевода результата представленного в
;символах кода ASCII,
;в форму приемлимую для вывода (в виде чисел)
mov ascii,0 ;записываем 0 в переменную asc
mov cx,10 ;заносим в регистр CX значение 10
lea si,ascii+4 ;заносим в регистр si значение asc смещенное на 4
dcd2: cmp ax,10 ;сравниваем значение в регистре AX с 10
jb dcd1 ;если в АХ число меньше 10, то – выход
xor dx,dx ;обнуление
div cx ;деление содержимого AX на 10; остаток – в DL
or dl,30h ;формирование кода ASCII очередной цифры
mov [si],dl ;сохранение ASCII – символа
dec si ;декремент si-1
jmp dcd2 ;переход на dcd2
dcd1: or al,30h ;формирование кода ASCII последней (старшей) цифры
mov [si],al ;сохранение ASCII – символа
ret ;выход из процедуры
decod endp
;———————————————————————————————————-
CODE ENDS
END begin
Приложение С. Пример выполнения программы.

Пример выявления ошибки на 0