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




.

;Программа вычисления Yn=(10Xn+7Xn-1+4Xn-2+Xn-3-2Xn-4-5Xn-5)/15

.model small;модель памяти SMALL

.stack 64;модель стека 64

.data;начало сегмента данных

xn dw 0;резервирование

xn1 dw 0;места в памяти

xn2 dw 0;под переменные

xn3 dw 0;xn,xn1,xn2,xn3

xn4 dw 0;xn4

xn5 dw 0;xn5

yn dw 0;yn

;************************************************************************

;

;Константы для деления и выявления переполнения

;

r1m equ 7ff1h;константа r1m примет значение k(+ymax)мл

r1c equ 0007h;константа r1c примет значение k(+ymax)ст

r2m equ 8000h;константа r2m примет значение k(-ymax)мл

r2c equ 0fff8h;константа r2c примет значение k(-ymax)ст

k equ 15;делитель

;************************************************************************

;

;Программа вычисления выражения

.code;начало кодового сегмента

filtr proc;начало процедуры filtr

mov ax,@data;указание регистра DS

mov ds,ax;сегмент данных

;************************************************************************

;

;Сброс переменных xn,xn1,xn2,xn3,xn4,xn5,yn

sub ax,ax;сброс аккумулятора AX

mov xn,ax;сброс xn

mov xn1,ax;сброс xn1

mov xn2,ax;сброс xn2

mov xn3,ax;сброс xn3

mov xn4,ax;сброс xn4

mov xn5,ax;сброс xn5

mov yn,ax;сброс yn

;************************************************************************

;Вычисление W1=10xn

M1: mov ax,xn;запись xn в AX

cwd;расширение слова до двойного слова

add ax,ax;получим 2Xnмл и сохраним в AX

adc dx,dx;получим 2Xnст и сохраним в DX

mov di,ax;запомним 2Xnмл в DI

mov si,dx;запомним 2Xnст в SI

add ax,ax;вычисление 4Xnмл и запись в AX

adc dx,dx;вычисление 4Xnст и запись в DX

add ax,ax;вычисление 8Xnмл и запись в AX

adc dx,dx;вычисление 8Xnст и запись в DX

add ax,di;вычисление 10Xnмл и запись в AX

adc dx,si;вычисление 10Xnст и запись в DX

mov bx,ax;сохранение

mov bp,dx;результатов в BP:BX

;************************************************************************

;

;Вычисление W2=W1+7xn1

mov ax,xn1;запись xn1 в аккумулятора

cwd;расширение xn1 до двойного слова

mov di,ax;запомним Xn1мл в DI

mov si,dx;запомним Xn1ст в SI

add ax,ax;вычисление 2Xn1мл и сохраним в AX

adc dx,dx;вычисление 2Xn1ст и сохраним в DX

add ax,ax;вычисление 4Xn1мл и запись в AX

adc dx,dx;вычисление 4Xn1ст и запись в DX

add ax,ax;вычисление 8Xn1мл и запись в AX

adc dx,dx;вычисление 8Xn1ст и запись в DX

sub ax,di;вычисление 7Xn1мл и запись в AX

sbb dx,si;вычисление 7Xn1ст и запись в DX

add bx,ax;вычисление младшей части 10xn+7xn1

adc bp,dx;вычисление старшей части 10xn+7xn1

;************************************************************************

;;Вычисление W3=W2+4xn2

mov ax,xn2;запись xn2 в аккумулятора

cwd;расширение xn2 до двойного слова

add ax,ax;вычисление 2Xn2мл и сохраним в AX

adc dx,dx;вычисление 2Xn2ст и сохраним в DX

add ax,ax;вычисление 4Xn2мл и запись в AX

adc dx,dx;вычисление 4Xn2ст и запись в DX

add bx,ax;вычисление младшей части 10xn+7xn1+4xn2

adc bp,dx;вычисление старшей части 10xn+7xn1+4xn2

;************************************************************************

;Вычисление W4=W3+1xn3

mov ax,xn3;запись xn3 в аккумулятора

cwd;расширение xn3 до двойного слова

add bx,ax;вычисление младшей части 10xn+7xn1+4xn2+1xn3

adc bp,dx;вычисление старшей части 10xn+7xn1+4xn2+1xn3

;************************************************************************

;

;Вычисление W5=W3-2xn4

mov ax,xn4;запись xn4 в аккумулятора

cwd;расширение xn4 до двойного слова

add ax,ax;вычисление 2Xn4мл и сохраним в AX

adc dx,dx;вычисление 2Xn4ст и сохраним в DX

sub bx,ax;вычисление младшей части 10xn+7xn1+4xn2+1xn3-2xn4

sbb bp,dx;вычисление старшей части 10xn+7xn1+4xn2+1xn3-2xn4

;************************************************************************

;

;Вычисление W6=W5-5xn5

mov ax,xn5;запись xn5 в аккумулятора

cwd;расширение xn5 до двойного слова

mov di,ax;запомним Xn5мл в DI

mov si,dx;запомним Xn5ст в SI

add ax,ax;вычисление 2Xn5мл и сохраним в AX

adc dx,dx;вычисление 2Xn5ст и сохраним в DX

add ax,ax;вычисление 4Xn5мл и запись в AX

adc dx,dx;вычисление 4Xn5ст и запись в DX

add ax,di;вычисление 5Xn5мл и запись в AX

adc dx,si;вычисление 5Xn5ст и запись в DX

sub bx,ax;вычисление младшей части 10xn+7xn1+4xn2+1xn3-;2xn4-5xn5

sbb bp,dx;вычисление старшей части 10xn+7xn1+4xn2+1xn3-;2xn4-5xn5

;************************************************************************

;Проверка на переполнение

mov ax,bx;передача делимого W6

mov dx,bp;в DX:AX

cmp ax,r1m;сравнение ax с r1m

sbb dx,r1c;сравнение dx с r1c

jns m2;переход на метку m2 если W5>15(+ymax)

mov dx,bp;восстановить DX

cmp ax,r2m;сравнить ax c r2m

sbb dx,r2c;сравнить dx с r2c

js m3;переход на метку m3 если W5<15(-ymax)

;************************************************************************

;Деление DX:AX на k=15

mov dx,bp;восстановить dx

mov si,k;запись делителя k в si

idiv si;ax <- dx:ax/si

mov yn,ax;запись результата деления в yn

jmp m4;переход на метку m4

m2: mov yn,7FFFh;запись в yn константы 7FFFh

jmp m4;переход на метку m4

m3: mov yn,8000h;запись в yn константы 8000h

jmp m4;переход на метку m4

;************************************************************************

;Формирование очереди

m4:

mov ax,xn4;передать xn4

mov xn5,ax;на место xn5

mov ax,xn3;передать xn3

mov xn4,ax;на место xn4

mov ax,xn2;передать xn2

mov xn3,ax;на место xn3

mov ax,xn1;передать xn1

mov xn2,ax;на место xn2

mov ax,xn;передать xn

mov xn1,ax;на место xn1

jmp M1;переход на метку M1

;************************************************************************

;

;Окончание программы

mov AH,4CH;функция DOS

int 21H;выход из программы

filtr ENDP;конец процедуры filtr

END filtr;конец программы



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: