Помощь в написании студенческих работ
Антистрессовый сервис

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

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Архитектура компьютеров на базе микропроцессоров вначале опиралась исключительно на целочисленную арифметику. С ростом мощи, а главное с осознанием разработчиками микропроцессорной техники того факта, что их устройства могут составить достойную конкуренцию своим «большим» предшественникам, в архитектуре компьютеров на базе микропроцессоров стали появляться устройства для обработки чисел… Читать ещё >

Разработка программы на языке Assembler с использованием процедур (реферат, курсовая, диплом, контрольная)

СОДЕРЖАНИЕ Введение.

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 80×86 устройство для обработки чисел с плавающей точкой появилось в составе компьютера на базе микропроцессора 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.

db.

len_in.

db.

buf_in.

db.

buf_end.

0.0.

db.

NumTmp.

0.5.

dw.

cn10.

dd.

cn48.

dd.

ftosymb.

a1.

dq.

pow_dec.

dw.

i_save.

dd.

f_save.

0.0.

dq.

c05.

0.5.

dd.

c10.

dd.

i_tol.

dw.

i_part.

dw.

f_part.

dt.

flag.

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.

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 на каждом из трех участков.

Calc1 proc ;

процедура расчёта Y на 1-ом участке finit.

fldX.

fld a2.

fmul.

fld a1.

fsub.

fstY.

ret.

Calc1 endp.

Calc2 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.

Calc2 endp.

Calc3 proc ;процедура расчёта Y на 3-ом участке.

finit.

fld a1.

fst Y.

ret.

Calc3 endp.

4. ТЕСТИРОВАНИЕ Произведем оценку погрешности вычислений на основе линейной интерполяции. Оценка производится исходя из значения погрешности, рассчитываемой по формуле (4.1), которая позволяет получить значение погрешности.

(4.1).

где yист — истинное значение функции;

yп — полученное значение функции.

— погрешность вычислений.

Таблица 4.1 — Погрешность расчетов на 1-ом интервале функции.

Кол-во интервалов.

Полученное значение.

Введенное число.

Истинное значение.

Погрешность, %.

69,50 000 108 991 350 448.

6,5.

69,5.

0,1 568.

69,49 999 986 394 048 240.

6,5.

69,5.

0,196.

69,49 999 913 727 555 024.

6,5.

69,5.

0,1 241.

Рисунок 4.1 — График погрешности на 1-ом интервале.

Таблица 4.2 — Погрешность расчетов на 2-ом интервале функции.

Кол-во интервалов.

Полученное значение.

Введенное число.

Истинное значение.

Погрешность, %.

0,5 949 902 288 795 802.

0,59 499.

0,38 468.

0,5 949 904 968 095 455.

0,59 499.

0,83 499.

0,595 190 017 795 587.

0,59 499.

0,33 617 001.

Рисунок 4.2 — График погрешности на 2-ом интервале Таблица 4.3 — Погрешность расчетов на 3-ом интервале функции.

Кол-во интервалов.

Полученное значение.

Введенное число.

Истинное значение.

Погрешность, %.

Рисунок 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 ;бзЁв вм Є®(r)а¤Ё­ вл Єгаб®а ў.

mov ah, 13h.

mov al, 01b.

mov cx,_count.

mov bl, 1011b ;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?; ўбЇ®(r)Ј вҐ"м­ п ЇҐаҐҐ­­ п.

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.

Calc1 proc ;Їа®жҐ¤га, а бзсв Y ­ 1-® гз бвЄҐ.

finit.

fldX.

fld a2.

fmul.

fld a1.

fsub.

fstY.

ret.

Calc1 endp.

Calc2 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.

Calc2 endp.

Calc3 proc ;Їа®жҐ¤га, а бзсв Y ­ 3-® гз бвЄҐ.

finit.

fld a1.

fst Y.

ret.

Calc3 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.

;————————————- ­ з «® (r)б­®ў­®© Їа®Ја л —————————————-;

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 ;

interval1:

call Calc1 ;ўлзЁб"пҐ Y ­ 1-ў® гз бвЄҐ.

;SPIKE1.

; mov eax, X ;

;cmp eax, i1 ;ба ў­Ґ­ЁҐ.

;jl interval2 ;

finit.

fld x.

fcomp i1.

fnstsw ax.

fwait.

sahf.

ja interval2.

in_massive ;§ ­®бЁ ¤ ­­лҐ ў ббЁў.

call next_X ;ўлзЁб"пҐ б"Ґ¤гойЁҐ §­ з. X.

jmp interval1 ;ўлз. б"Ґ¤. §­. Y ў нв® Ё­вҐаў «Ґ.

interval2:

call Calc2 ;ўлзЁб"пҐ Y ­ 2-® гз бвЄҐ.

finit.

fld x.

fcomp i2.

fnstsw ax.

fwait.

sahf.

ja interval3.

in_massive ;§ ­®бЁ ¤ ­­лҐ ў ббЁў.

call next_X ;ўлзЁб"пҐ б"Ґ¤гойЁҐ §­ з. X.

jmp interval2 ;ўлз. б"Ґ¤. §­. ў нв® Ё­вҐаў «Ґ.

interval3:

call Calc3 ;ўлзЁб"пҐ Y ­ 3-ў® гз бвЄҐ.

finit.

fld x.

fcomp Xn.

fnstsw ax.

fwait.

sahf.

ja inter.

in_massive ;§ ­®бЁ ¤ ­­лҐ ў ббЁў.

call next_X ;ўлзЁб"пҐ б"Ґ¤гойЁҐ §­ з.X.

jmp interval3 ;ўлз. б"Ґ¤. §­. ў нв® Ё­вҐаў «Ґ.

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.

Показать весь текст
Заполнить форму текущей работой