Разработка программы на языке 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

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

c05

0. 5

dd

c10

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

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-ом интервале функции

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

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

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

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

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

33

69,50 000 108 991 350 448

6,5

69,5

0,1 568

66

69,49 999 986 394 048 240

6,5

69,5

0,196

100

69,49 999 913 727 555 024

6,5

69,5

0,1 241

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

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

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

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

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

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

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

33

0,5 949 902 288 795 802

7

0,59 499

0,38 468

66

0,5 949 904 968 095 455

7

0,59 499

0,83 499

100

0,595 190 017 795 587

7

0,59 499

0,33 617 001

Рисунок 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; бзЁв вм Є®(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

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