Разработка программы на языке Assembler с использованием процедур
Создание программы для вычисления значения функции на основе определённой формулы. Уточнение структуры входных и выходных данных и определение ассемблерного формата их представления. Разработка алгоритмов для реализации работы программного обеспечения.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 17.06.2013 |
Размер файла | 240,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
СОДЕРЖАНИЕ
Введение
1. Постановка и формулировка задачи
1.1 Постановка задачи
1.2 Назначение программы
2. Проектирование
2.1 Формирование «ассемблерной» модели задачи
2.2 Разработка алгоритма реализации задачи
2.3 Разработка структуры программы в соответствии с выбранной моделью памяти
3. Кодирование
3.1 Уточнение структуры входных и выходных данных и определение ассемблерного формата их представления
3.2 Программирование задачи
4. Тестирование
Вывод
Перечень ссылок
Приложение
ВВЕДЕНИЕ
Целью выполнения курсовой работы является расширение и углубление знаний и навыков в программировании на языке Assembler.
В процессе выполнения курсовой работы необходимо:
а) разобраться с арифметическими процессами;
б) разобраться с алгоритмом віполнения ассемблером определённых арифметических операций;
в) всесторонне оценить поставленную задачу и определить оптимальные пути ее решения;
г) составить алгоритмы для реализации работы программного обеспечения;
Программа должна быть оформлена с использованием процедур.
1. ПОСТАНОВКА И ФОРМУЛИРОВКА ЗАДАЧИ
1.1 Постановка задачи
Имеется аналитически заданная на участке функция . Необходимо разработать на языке ассемблера программу, которая бы выполняла следующие действия:
- выдавала запрос на ввод числа участков разбиения заданного интервала изменения и принимала ввод;
- производила вычисление значений функции для всех значений аргумента от до ;
- заносила пары значений в специально организованную структуру хранения данных (массив), представляющую таблицу значений функции;
- выводила на экран приглашение на ввод произвольного значения аргумента с указанием предельных допустимых значений интервала;
- для введенного значения аргумента вычисляла приближенное значение функции на основе линейной интерполяции с использованием подготовленной таблицы значений функции;
- выводила на экран консоли результат вычисления;
- выдавала запрос на повторение действий в формате «Y/N» и обрабатывала ввод пользователя;
- в случае положительного ответа - повторяла вычисления, в случае отрицательного ответа - заканчивала свою работу.
Программа должна быть оформлена с использованием процедур. Для операций с числами при вычислении значений функции необходимо использовать математический сопроцессор.
При использовании линейной интерполяции значение функции в точке вычисляется с помощью следующего выражения:
.
Для решения перечисленных выше задач рекомендуется разработать процедуры либо макрокоманды.
Исходные данные:
При X0 = 6.3; Xn=8.4
X0 < X < X0 + 0.2l=
Y(X) X0 + 0.2l < X < X0+0.6l=
X0 + 0.6l < X < Xn=
1.2 Назначение программы
Данный курсовой проект предназначен для вычисления значения функции на основе определённой формулы.
При использовании линейной интерполяции значение функции в точке вычисляется с помощью следующего выражения:
.
программа ассемблерный алгоритм функция
2. ПРОЕКТИРОВАНИЕ
2.1 Формирование «ассемблерной» модели задачи
Для того чтобы решить поставленную задачу необходимо использовать средства программирования математического сопроцессора.
Необходимо решить это, пользуясь средствами языка ассемблера. Так как все процессы на аппаратном уровне используют только команды машинного языка то, необходимо знать архитектуру компьютера, а в частности его процессора и математического сопроцессора [1].
Для придания структурированного вида разрабатываемой программе, её следует оформить с использованием процедур .
В модулях разрабатываемого приложения можно использовать модель памяти SMALL, которая используется для большинства программ на ассемблере. При этом код занимает один сегмент, а данные объединяются в одну группу [1].
Архитектура компьютеров на базе микропроцессоров вначале опиралась исключительно на целочисленную арифметику. С ростом мощи, а главное с осознанием разработчиками микропроцессорной техники того факта, что их устройства могут составить достойную конкуренцию своим «большим» предшественникам, в архитектуре компьютеров на базе микропроцессоров стали появляться устройства для обработки чисел с плавающей точкой. В архитектуре семейства микропроцессоров Intel 80x86 устройство для обработки чисел с плавающей точкой появилось в составе компьютера на базе микропроцессора i8086/88 и получило название математический сопроцессор (далее просто сопроцессор). Выбор такого названия был обусловлен тем, что, во-первых, это устройство было предназначено для расширения вычислительных возможностей основного процессора, а, во-вторых, оно было реализовано в виде отдельной микросхемы, то есть его присутствие было необязательным. Микросхема сопроцессора для микропроцессора i8086/88 имела название i8087. С появлением новых моделей микропроцессоров Intel совершенствовались и сопроцессоры, хотя их программная модель осталась практически неизменной. Как отдельные (а, соответственно, необязательные в конкретной комплектации компьютера) устройства, сопроцессоры сохранялись вплоть до модели микропроцессора i386 и имели название i287 и i387 соответственно. Начиная с модели i486, сопроцессор исполняется в одном корпусе с основным микропроцессором и, таким образом, является неотъемлемой частью компьютера.
Сопроцессор добавляет следующие возможности:
- полная поддержка стандартов IEEE-754 и 854 на арифметику с плавающей точкой. Эти стандарты описывают как форматы данных, с которыми должен работать сопроцессор, так и набор реализуемых им функций;
- поддержка численных алгоритмов для вычисления значений тригонометрических функций;
- обработка десятичных чисел с точностью до 18 разрядов, что позволяет сопроцессору выполнять арифметические операции без округления над целыми десятичными числами со значениями до 1018;
- обработка вещественных чисел из диапазона .
2.2 Разработка алгоритма реализации задачи
Алгоритм реализации данной задачи можно представить следующим образом:
1) Выводится запрос на введение максимального значения х.
2) Ввод значения х в формате вещественного числа и перевод его из строкового представления в числовое.
3) Произвести вычисление в пределах границы, определяющих, в зависимости от условий, по какой функции будет вычислен
4) Организовывается цикл, по которому производиться вычисление функции y=f(x), учитывая условия, и записывается результат в массив.
5) Запросить ввод значения х для вычисления функции.
6) Если введённое значение не входит в заданный ранее интервал, то снова перейти к п.5.
7) Определить значения у с помощью линейной интерполяции.
8) Вычислить соответствующее значение у по формуле .
9) Преобразовать полученное значение у из числового представления в символьное в формате вещественного числа с плавающей точкой.
10) Вывести результат на экран.
11) Вывести запрос на повторение действий в формате «Y/N», если нажимаем «Y», то перейти к п.1, иначе - выйти из программы.
Составим блок-схему для данного алгоритма. Она представлена в приложении А.
2.3 Разработка структуры программы в соответствии с выбранной моделью памяти
Изначально программный код разделен на три файла: ftosymb.asm - модуль перевода вещественного числа в символьное представление, in_fl_v2.asm - модуль чтение чисел с консоли, main.asm - основной расчетный модуль.
3. КОДИРОВАНИЕ
3.1 Уточнение структуры входных и выходных данных и определение ассемблерного формата их представления
Входные данные - максимальное значение х, и значение х для вычисления функции у=f(х) путём линейной интерполяции. Данные вводим с клавиатуры, после чего они представляют собой последовательность символов. Так невозможно произвести вычисления, поэтому мы переводим их в числовое представление. При этом необходимо учесть наличие дробной части у числа (если она есть).
К выходным данным относится значение у, вычисленное по введенному х с помощью линейной интерполяции. Оно представляет собой вещественное число в вершине стека сопроцессора. Процедура вывода на экран вещественного числа выполняет перевод из числового представления в последовательность символов.
Промежуточные данные является последовательность значений х и соответствующих ему значений у, вычисленных учитывая условия. Эта последовательность оформлена в виде массива. Обращаясь к соответствующему значению у, необходимо использовать косвенную базово-индексную адресацию со смещением. При этом эффективный адрес формируется, как сумма трёх составляющих [1]: указателя на адрес первого элемента массива в виде его символического имени, индекса, который равен индексу соответствующего значения х, и базового регистра, в котором находится смещение каждого значения у относительно соответствующего значения х.
Ниже приведу таблицу структуры входных и выходных данных (табл.3.1).
Таблица 3.1
Модуль |
Имя переменной |
Значение |
Формат |
|
in_fl_v2 |
len_buf |
0 |
db |
|
len_in |
0 |
db |
||
buf_in |
0 |
db |
||
buf_end |
0.0 |
db |
||
NumTmp |
0.5 |
dw |
||
cn10 |
10 |
dd |
||
cn48 |
10 |
dd |
||
ftosymb |
a1 |
0 |
dq |
|
pow_dec |
0 |
dw |
||
i_save |
0 |
dd |
||
f_save |
0.0 |
dq |
||
c_05 |
0.5 |
dd |
||
c_10 |
10 |
dd |
||
i_tol |
10 |
dw |
||
i_part |
0 |
dw |
||
f_part |
0 |
dt |
||
flag |
0 |
db |
||
m_sign |
.6 |
db |
||
p_sign |
.2 |
db |
||
string |
20 dup |
db |
||
in_fl_v2 |
mes_intro |
13,10 |
db |
|
mes1 |
13,10 |
db |
||
mes2 |
13,10 |
db |
||
mes3 |
13,10 |
db |
||
mesY |
13,10 |
db |
||
mes_er |
13,10 |
db |
||
indx |
0 |
db |
||
X0 |
6.3 |
dd |
||
i1 |
6,72 |
dd |
||
i2 |
7,14 |
dd |
||
Xn |
8.4 |
dd |
||
L |
2.1 |
dd |
||
X |
? |
dd |
||
Y |
? |
dd |
||
n |
? |
dd |
||
vdX |
? |
dd |
||
A |
101 dup (<>) |
AR |
3.2 Программирование задачи
При разработке данного курсового проекта, для операций с вещественными числами при вычислении значений функции я использовал процедуры, которые облегчили написание программного кода. При этом я учитывал ограниченность глубины стека сопроцессора. Для обработки арифметических операций в данном курсовом проекте использовались арифметические выражения, представленные в виде ПОЛИЗ.
В программе, которую необходимо было разработать в процессе выполнения курсового проекта, часть исходных данных должна получаться от пользователя с клавиатуры. Весь ввод с клавиатуры воспринимается как символьная информация, поэтому для вводимой числовой информации необходимо было преобразовывать данные из символьного представления в числовое.
В приложении А приведена ассемблерная программа, которая демонстрирует работу данного курсового проекта, работу с вещественными числами с плавающей запятой. Эта программа предназначена для вычисления значений функции y=f(x) в интервале x0 ? x ? xn , при x0 = 6.3, xn = 8.4. Алгоритм работы понятен из комментариев, которыми снабжен текст приведенной программы. Рассмотрим участки кода для вычисления Y на каждом из трех участков.
Calc_1 proc ;
процедура расчёта Y на 1-ом участке finit
fldX
fld a2
fmul
fld a1
fsub
fstY
ret
Calc_1 endp
Calc_2 proc ;процедура расчёта Y на 2-ом участке
finit
fld a1 ;Загружаем показатель степени
fld x
fsub
fld x ;Загружаем основание
fyl2x ;Стек FPU теперь содержит: ST(0)=y*log2(x)
fld st(0) ;Создаем еще одну копию z
frndint ;Округляем ST(0)=trunc(z) | ST(1)=z
fxch st(1);ST(0)=z | ST(1)=trunc(z)
fsub st(0),st(1) ;ST(0)=z-trunc(z) | ST(1)=trunc(z)
f2xm1 ;ST(0)=2**(z-trunc(z))-1 | ST(1)=trunc(z)
fld1 ;ST(0)=1 ST(1)=2**(z-trunc(z))-1 | ST(2)=trunc(z)
faddp st(1),st ;ST(0)=2**(z-trunc(z)) | ST(1)=trunc(z)
fscale ;ST(0)=(2**(z-trunc(z)))*(2**trunc(z))=2**(z)
fstp Y ;Результат
ret
Calc_2 endp
Calc_3 proc ;процедура расчёта Y на 3-ом участке
finit
fld a1
fst Y
ret
Calc_3 endp
4. ТЕСТИРОВАНИЕ
Произведем оценку погрешности вычислений на основе линейной интерполяции. Оценка производится исходя из значения погрешности, рассчитываемой по формуле (4.1), которая позволяет получить значение погрешности.
(4.1)
где yист - истинное значение функции;
yп - полученное значение функции.
- погрешность вычислений.
Таблица 4.1 - Погрешность расчетов на 1-ом интервале функции
Кол-во интервалов |
Полученное значение |
Введенное число |
Истинное значение |
Погрешность, % |
|
33 |
69,50000108991350446 |
6,5 |
69,5 |
0,000001568 |
|
66 |
69,49999986394048237 |
6,5 |
69,5 |
0,000000196 |
|
100 |
69,49999913727555028 |
6,5 |
69,5 |
0,000001241 |
Рисунок 4.1 - График погрешности на 1-ом интервале
Таблица 4.2 - Погрешность расчетов на 2-ом интервале функции
Кол-во интервалов |
Полученное значение |
Введенное число |
Истинное значение |
Погрешность, % |
|
33 |
0,00005949902288795802 |
7 |
0,000059499 |
0,000038468 |
|
66 |
0,00005949904968095455 |
7 |
0,000059499 |
0,000083499 |
|
100 |
0,0000595190017795587 |
7 |
0,000059499 |
0,033617001 |
Рисунок 4.2 - График погрешности на 2-ом интервале
Таблица 4.3 - Погрешность расчетов на 3-ом интервале функции
Кол-во интервалов |
Полученное значение |
Введенное число |
Истинное значение |
Погрешность, % |
|
33 |
2 |
8 |
2 |
0 |
|
66 |
2 |
8 |
2 |
0 |
|
100 |
2 |
8 |
2 |
0 |
Рисунок 4.3 - График погрешности на 3-ом интервале
Вывод
В ходе выполнения курсовой работы были получены навыки в программировании на языке Assembler.
В процессе выполнения курсовой работы было :
а) Исследована работа с арифметическими процессами;
б) изучен алгоритм выполнения ассемблером определённых арифметических операций;
в) Исследована поставленная задача и определены оптимальные пути ее решения;
г) Составлены алгоритмы для реализации работы программного обеспечения;
Программа была реализована с использованием процедур.
ПЕРЕЧЕНЬ ССЫЛОК
1. Юров В. Assembler: учебник.- СПБ.: «Питер», 2000.- 624 с.
2. Юров В. Assembler: специальный справочник.- СПБ.: «Питер», 2000.- 496 с.
3. Юров В. Assembler: практикум.- СПБ.: «Питер», 2001.- 400 с.
4. Методические указания по оформлению курсовых проектов и работ /Сост.: Ю.Э. Паэранд, П.В. Охрименко - Алчевск: ДГМИ, 2002.-50с.
ПРИЛОЖЕНИЕ А
Блок схема работы алгоритма
ПРИЛОЖЕНИЕ Б
Исходный код программы
_windowout macro _string,_count
xor ax,ax
mov ah,03h
mov bh,0 ;®¬ ўЁ¤Ґ®бва Ёжл
int 10h ;бзЁв вм Є®®а¤Ё вл Єгаб®а ў
mov ah,13h
mov al,00000001b
mov cx,_count
mov bl,00001011b ;color
push ds
pop es
mov bp,offset _string
int 10h
endm
in_massive macro;¬ Єа®б ¤®Ў ў«ҐЁп X,Y ў ¬ ббЁў.
xorax,ax;®зЁбвЄ е
moval,indx;ў al indx
movdl,8;ў dl 8
muldl;㬮¦ Ґ¬ al 8, १, ў е
movsi,ax;ў si indx*8
moveax,X
movA[si].vX,eax
moveax,Y
movA[si].vY,eax
incindx
endm
;-------------------------------------------------------------------------------
EXTRN Input_Float:FAR
EXTRN Out_Float:FAR
include macro.inc
AR struc ;бвагЄвга ¤«п еа ҐЁп ¤ ле(X,Y)
vX dd 0
vY dd 0
AR ends
model SMALL
.586
stack 256
.data
length_frac equ [bp+4]
; локальные переменные
ten equ word ptr [bp-2]
temp equ word ptr [bp-4]
mes_intro db 13,10,'corse work system programming variant 50',13,10
len_i=$-mes_intro
mes1db 13,10,'input section number (5-100): N = $'
mes2db 13,10,'repeat? ... y/n $'
mes3db 13,10,'input X from 6.3 to 8.4: X = $'
mesY db 13,10,'Y = $'
mes_erdb 13,10,'ERROR!!! $'
indxdb 0 ;⥪гйЁ© Ё¤ҐЄб ў ¬ ббЁўҐ
X0dd 6.3 ;X0
i1dd 6.72 ;Ја Ёж 1-Ј® гз бвЄ
i2dd 7.14 ;Ја Ёж 2-Ј® гз бвЄ
Xndd 8.4 ;Xn
Ldd 2.1 ;¤«Ё ўбҐЈ® ЁвҐаў «
a1 dd 2.0
a2 dd 11.0
Xdd ? ;⥪г饥 § 票Ґ X
Ydd ? ;⥪г饥 § 票Ґ Y
aksdd ? ; ўбЇ®¬®Ј ⥫м п ЇҐаҐ¬Ґ п
ndd ? ;Є®«ЁзҐбвў® гз бвЄ®ў
vdXdd ? ;dX, а §¬Ґа гз бвЄ
AAR 101dup (<>) ;¬ ббЁў
.code
infloat proc near
push ax
push dx
push si
; Формируем кадр стэка, чтобы хранить десятку и ещё какую-нибудь цифру.
push bp
mov bp, sp
push 10
push 0
; В SI признак знака.
xor si, si
; Начнём накапливать число. Сначала это ноль.
fldz
; Вводим первый символ. Это может быть минус.
mov ah, 01h
int 21h
cmp al, '-'
jne short @if1
; Если это действительно минус, запоминаем это
; и вводим следующую цифру.
inc si
@if0: mov ah, 01h
int 21h
; Если введена точка, то пора переходить
; к формированию дробной части.
@if1: cmp al, '.'
je short @if2
; Ну а если нет, то проверим, что ввели цифру
; (в противном случае закончим ввод),
cmp al, 39h
ja short @if5
sub al, 30h
jb short @if5
; сохраним её во временной ячейке и допишем
; к текущему результату справа,
mov [bp - 4], al
; то есть умножим уже имеющееся число на десять
fimul word ptr [bp - 2]
; и прибавим только что обретённую цифру.
fiadd word ptr [bp - 4]
; И так, пока не надоест.
jmp short @if0
; Если собрались вводить дробную часть,
; то запасёмся единицей.
@if2: fld1
; Вводим нечто.
@if3: mov ah, 01h
int 21h
; Если это не цифра, сдаёмся.
cmp al, 39h
ja short @if4
sub al, 30h
jb short @if4
; Иначе сохраняем её во временной ячейке,
mov [bp - 4], al
; получаем очередную отрицательную степень десятки,
fidiv word ptr [bp - 2]
; дублируем её,
fld st(0)
; помножаем на введённую цифру, тем самым получая
; её на нужном месте,
fimul word ptr [bp - 4]
; и добавляем к текущему результату.
faddp st(2), st
; Опять-таки, пока не надоест.
jmp short @if3
; Если ввод дробной части закончен,
; нам больше не нужна степень десятки.
@if4: fstp st(0)
; Итак, на вершине стэка получено введённое число.
; Осталось разве только перейти на новую строку
@if5: mov ah, 02h
mov dl, 0Dh
int 21h
mov dl, 0Ah
int 21h
; и вспомнить про знак.
test si, si
jz short @if6
fchs
@if6: leave
pop si
pop dx
pop ax
ret
infloat endp
OutFloat proc near
enter 4, 0 ; пролог - выделим в кадре стека 4 байта под локальные переменные
mov ten, 10
ftst ; определяем знак числа
fstsw ax
sahf
jnc @positiv
mov al, '-' ; если число отрицательное - выводим минус
int 29h
fchs ; и получаем модуль числа
@positiv:
fld1 ; загружаем единицу
fld st(1) ; копируем число на вершину стека
fprem ; выделим дробную часть
fsub st(2), st ; отнимем ее от числа - получим целую часть
fxch st(2) ; меняем местами целую и дробную части
xor cx, cx ; обнуляем счетчик
; далее идет стандартный алгоритм вывода целого числа на экран
@1:
fidiv ten ; делим целую часть на десять
fxch st(1) ; обменяем местами st и st(1) для команды fprem
fld st(1) ; копируем результат на вершину стека
fprem ; выделим дробную часть (цифру справа от целой части)
fsub st(2), st ; получим целую часть
fimul ten ; *10
fistp temp ; получаем очередную цифру
push temp ; заталкиваем ее глубже в стек
inc cx ; и увеличим счетчик
fxch st(1) ; подготовим стек к следующему шагу цикла (полученное частное на вершину, в st(1) - 1)
ftst ; проверим не получили ли в частном 0?
fstsw ax
sahf
jnz @1 ; нет - продолжим цикл
@2: ; извлекаем очередную цифру, переводим её в символ и выводим.
pop ax
add al, '0'
int 29h
loop @2
; далее то же самое, только для дробной части. Алгоритм похож на вывод целого числа, только вместо деления умножение и проход по числу слева
fstp st ; сначала проверим, есть ли дробная часть
fxch st(1)
ftst
fstsw ax
sahf
jz @quit ; дробная часть отсутствует
mov al, '.'
int 29h ; если присутствует - выведем точку
mov cx, length_frac ; помещаем в счетчик длину дробной части
@3:
fimul ten ; умножим на 10
fxch st(1) ; подготовка для fprem - меняем st и st(1) местами и
fld st(1) ; копируем число на вершину
fprem ; отделим дробную часть от целой
fsub st(2), st ; и оставляем дробную
fxch st(2)
fistp temp ; выталкиваем полученное число из стека в temp
mov ax, temp ; по дробной части идем слева, значит число выводим сразу, без предварительного сохранения в стек
or al, 30h ; перевод в ascii
int 29h ; на экран
fxch st(1) ; подготовим стек к следующему шагу цикла (полученное частное на вершину, в st(1) - 1)
ftst
fstsw ax
sahf ; проверим на 0 остаток дробной части
loopne @3
@quit:
fstp ; готово. Чистим стек сопроцессора
fstp st
leave ; эпилог
ret 2
OutFloat endp
Calc_1 proc ;Їа®жҐ¤га а бзсв Y 1-®¬ гз бвЄҐ
finit
fldX
fld a2
fmul
fld a1
fsub
fstY
ret
Calc_1 endp
Calc_2 proc ;Їа®жҐ¤га а бзсв Y 2-®¬ гз бвЄҐ
finit
fld a1 ;Загружаем показатель степени
fld x
fsub
fld x ;Загружаем основание
fyl2x ;Стек FPU теперь содержит: ST(0)=y*log2(x)
fld st(0) ;Создаем еще одну копию z
frndint ;Округляем ST(0)=trunc(z) | ST(1)=z
fxch st(1);ST(0)=z | ST(1)=trunc(z)
fsub st(0),st(1) ;ST(0)=z-trunc(z) | ST(1)=trunc(z)
f2xm1 ;ST(0)=2**(z-trunc(z))-1 | ST(1)=trunc(z)
fld1 ;ST(0)=1 ST(1)=2**(z-trunc(z))-1 | ST(2)=trunc(z)
faddp st(1),st ;ST(0)=2**(z-trunc(z)) | ST(1)=trunc(z)
fscale ;ST(0)=(2**(z-trunc(z)))*(2**trunc(z))=2**(z)
fstp Y ;Результат
ret
Calc_2 endp
Calc_3 proc ;Їа®жҐ¤га а бзсв Y 3-®¬ гз бвЄҐ
finit
fld a1
fst Y
ret
Calc_3 endp
next_X proc
finit
fld X
fadd vdX
fstp X
ret
next_X endp
start:
mov ax,@data
mov ds,ax
_windowout mes_intro,len_i
;------------------------- з «® ®б®ў®© Їа®Ја ¬¬л ----------------------------
Out_Str mes1 ;ўлў®¤ ЇаЁ« иҐЁп ўў®¤
call Input_Float ;ўў®¤ n
FISTP n ;б®еа 塞 n Є Є 楫®Ґ
cmp n,5 ;Їа®ўҐаЄ ўўҐ¤с®Ј® зЁб
jl er ;®Є®з ЁҐ Їа®Ја ¬¬л Ґб«Ё n < 5
cmp n,100 ;Їа®ўҐаЄ ўўҐ¤с®Ј® зЁб
jg er ;®Є®з ЁҐ Їа®Ја ¬¬л Ґб«Ё n > 100
mov indx,0 ;indx=0
FINIT ;ЁЁж. FPU
fld L
fild n
fdiv
FSTP vdX ;Ї®«гз Ґ¬ dX
mov edx,X0 ;гбв ®ўЄ з. §X
mov X,edx ;
interval_1:
call Calc_1 ;ўлзЁб«пҐ¬ Y 1-ў®¬ гз бвЄҐ
;SPIKE1
; mov eax,X ;
;cmp eax,i1 ;ба ўҐЁҐ
;jl interval_2 ;
finit
fld x
fcomp i1
fnstsw ax
fwait
sahf
ja interval_2
in_massive ;§ ®бЁ¬ ¤ лҐ ў ¬ ббЁў
call next_X ;ўлзЁб«пҐ¬ б«Ґ¤гойЁҐ § з. X
jmp interval_1 ;ўлз. б«Ґ¤. §. Y ў н⮬ ЁвҐаў «Ґ
interval_2:
call Calc_2 ;ўлзЁб«пҐ¬ Y 2-®¬ гз бвЄҐ
finit
fld x
fcomp i2
fnstsw ax
fwait
sahf
ja interval_3
in_massive ;§ ®бЁ¬ ¤ лҐ ў ¬ ббЁў
call next_X ;ўлзЁб«пҐ¬ б«Ґ¤гойЁҐ § з. X
jmp interval_2 ;ўлз. б«Ґ¤. §. ў н⮬ ЁвҐаў «Ґ
interval_3:
call Calc_3 ;ўлзЁб«пҐ¬ Y 3-ў®¬ гз бвЄҐ
finit
fld x
fcomp Xn
fnstsw ax
fwait
sahf
ja inter
in_massive ;§ ®бЁ¬ ¤ лҐ ў ¬ ббЁў
call next_X ;ўлзЁб«пҐ¬ б«Ґ¤гойЁҐ § з.X
jmp interval_3 ;ўлз. б«Ґ¤. §. ў н⮬ ЁвҐаў «Ґ
inter:
Out_Str mes3
call infloat
fstpX
finit
fld x
fcomp X0
fnstsw ax
fwait
sahf
jb er
finit
fld x
fcomp Xn
fnstsw ax
fwait
sahf
ja er
mov indx,0
m_loop1: ;Ї®ЁбЄ ў ¬ ббЁўҐ ўв®а®© в®зЄЁ ¤«п ЁвҐаЇ®«пжЁЁ
xorax,ax ;®зЁбвЄ е
moval,indx ;ў al indx
movdl,8 ;ў dl 8
muldl ;㬮¦ Ґ¬ al 8, १, ў е
movsi,ax ;ў si indx*8
inc indx
finit
fld A[si].vX
fcomp X
fnstsw ax
fwait
sahf
jb m_loop1
FINIT ;ЁвҐаЇ®«пжЁп y(x)~=Y1+((Y2-Y1)/(X2-X1))*(X-X1)
FLDA[si].vX
FSUBA[si-8].vX;ST(0)=X2-X1
FLDA[si].vY
FSUB A[si-8].vY ;ST(0)=Y2-Y1,ST(1)=X2-X1
FDIV ST(0),ST(1) ;ST(0)=(Y2-Y1)/(X2-X1)
FLD X
FSUB A[si-8].vX
FMUL
FADD A[si-8].vY ;ў ST(0) १г«мв в
Out_Str mesY
call OutFloat
ENDPROG:;------------------ ®Є®з ЁҐ -----------------------------------------
Out_Str mes2
Get_Char
cmp al,'y'
je inter
cmp al,'Y'
je inter
cmp al,'N'
je exit
cmp al,'n'
jne ENDPROG
exit:
mov ax,4c00h
int 21h
er:
Out_Str mes_er
Get_Char
mov ax,4c01h
int 21h
end start
Размещено на Allbest.ru
Подобные документы
Разработка программы тестирования студентов по MS PowerPoint с кодом на языке Delphi. Создание алгоритма для решения функциональных требований задачи. Описание переменных, вспомогательных процедур, входных и выходных данных для реализации программы.
курсовая работа [1,5 M], добавлен 21.09.2010Написание программного обеспечения на языке ассемблер для AVR-МК ATmega16, позволяющего осуществлять вычисление заданной функции. Введение входных данных с помощью определенного макроса с командой загрузки значений в регистры ldi. Исходный код программы.
контрольная работа [521,0 K], добавлен 23.11.2014Написание программы для работы с клиентами средствами языка Delphi, которая предусматривает ввод, редактирование и удаление информации. Разработка алгоритма решения задачи, описание переменных, вспомогательных процедур, входных и выходных данных.
курсовая работа [355,7 K], добавлен 21.09.2010Создание программы с кодом на языке Delphi, которая ищет в тексте заглавные буквы, выдает сообщение о количестве и замене их на малые буквы. Описание переменных, вспомогательных процедур, входных и выходных данных, необходимых для реализации задачи.
курсовая работа [540,4 K], добавлен 21.09.2010Создание схем алгоритмов и составление программы на языке Pascal для вычисления значений заданных функций. Сущность и порядок нахождения значения определенного интеграла. Анализ работы подпрограмм. Разработка тестов для проверки правильности алгоритмов.
контрольная работа [831,0 K], добавлен 24.11.2013Создание программы для обработки и хранения информации о пациентах, сделанных им назначениях и их выписке из больницы. Описание структуры и определение формы представления входных и выходных данных. Разработка системы средствами C++ и Builder 6.0.
курсовая работа [552,0 K], добавлен 19.02.2013Определение этапов разработки программного обеспечения. Разработка модели представления данных и структуры интерфейса. Проектирование входных и выходных форм. Этапы программирование приложения. Проверка функциональности на контрольном примере.
курсовая работа [1,2 M], добавлен 25.05.2009Проектирование программного модуля: сбор исходных материалов; описание входных и выходных данных; выбор программного обеспечения. Описание типов данных и реализация интерфейса программы. Тестирование программного модуля и разработка справочной системы.
курсовая работа [81,7 K], добавлен 18.08.2014Комбинированный тип данных для хранения входных данных о студентах и информация, содержащаяся в полях. Пример структуры входных и выходных данных. Алгоритм работы и программный код программы по успеваемости студентов, описание используемых функций.
курсовая работа [135,9 K], добавлен 28.12.2012Создание программы калькулятор, вычисляющий простейшие математические примеры на сложение, вычитание, умножение, деление и возведение в степень. Определение входных и выходных данных, требований к программе. Рекомендации по использованию программы.
курсовая работа [717,6 K], добавлен 17.01.2013