Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- double min = 1;
- double a, b, c, x, y;
- double five = 5;
- cout << "a = ";
- cin >> a;
- cout << "b = ";
- cin >> b;
- cout << "c = ";
- cin >> c;
- char m1[] = "-----------------------------\n";
- char m2[] = "| x | y |\n";
- char m3[] = "-----------------------------\n";
- char s0[] = "| %11.3lf | %11.3lf |\n";
- char s1[] = "| %11.3lf | ----------- |\n";
- double x1 = 0; //левая граница отрезка
- double x2 = 0; //правая граница отрезка
- cout << "x1 = ";
- cin >> x1;
- cout << "x2 = ";
- cin >> x2;
- x = x1;
- double t; //шаг
- cout << "t = ";
- cin >> t;
- int error;
- _asm {
- //=====Заголовок таблицы=====
- lea ebx, m1
- push ebx
- call printf
- add esp, 4
- lea ebx, m2
- push ebx
- call printf
- add esp, 4
- lea ebx, m3
- push ebx
- call printf
- add esp, 4
- //=====Таблица значений функции y=====
- //инициализация сопроцессора и проверка на правую границу
- finit
- fld x
- fld x2
- fcomip st(0), st(1)
- fstp st(0)
- //Перейти, если меньше
- jb errorBorder
- the_begin :
- //=====Расчет y(x)=====
- //если x<5, c!=0, то y=-a*x*x-b
- //если x>5, c==0, то y=(x-a)/x
- // но если x==0 – деление на 0
- //иначе y=-(x/c)
- // но если c==0 - деление на 0
- //Проверка и вычисление первого выражения
- //x<5, c!=0, y=-a*x*x-b
- Exp1 :
- fld five
- //[st(0) == 5]
- fld x
- //[st(1) == 5 st(0) == x]
- fcomip st(0), st(1)
- fstp st(0)
- //если x >= 5,
- //то переход на метку Exp2
- jnb Exp2
- fldz
- fld c
- fcomip st(0), st(1)
- //если c == 0, то переход на метку Exp2
- je Exp2
- //-a*x*x-b
- fsub min
- fmul a
- fmul x
- fmul x
- fsub b
- //y = st(0) и вытолкнуть (y == -a*x*x-b)
- fstp y
- jmp printXY
- //x>5, c==0, y=(x-a)/x
- Exp2 :
- fld five
- fld x
- fcomip st(0), st(1)
- fstp st(0)
- //если x = 5,
- //то переход на метку Exp3
- je Exp3
- fldz
- fld c
- fcomip st(0), st(1)
- //если c != 0,
- //то переход на метку Exp3
- jne Exp3
- // (x - a) / x
- fld x
- fcomip st(0), st(1)
- je printX
- fld x
- fsub a
- //(st(0) == x-a)
- fld x
- //[st(2) == 0 st(1) == x-a st(0) == x]
- fdivp st(1), st(0)
- //st(1) = st(1)/st(0) и вытолкнуть
- //[st(1) == 0 st(0) == (x-a)/x]
- fstp y
- //y = st(0) и вытолкнуть (y == (x-a)/x)
- //[st(0) == 0]
- jmp printXY
- Exp3 :
- fld c
- fcomip st(0), st(1)
- je printX
- // -x / c
- fsub min
- fmul x
- fdiv c
- fstp y
- //y = st(0) и вытолкнуть (y == (-x/c))
- jmp printXY
- //Вывод значений если Y вычислить невозможно
- printX:
- sub esp, 8
- fstp qword ptr[esp]
- lea eax, s1
- push eax
- call printf
- add esp, 12
- jmp beforeEndLoop
- //Вывод значений X и Y
- printXY:
- sub esp, 8
- fld y
- fstp qword ptr[esp]
- fld x
- sub esp, 8
- fstp qword ptr[esp]
- lea eax, s0
- push eax
- call printf
- add esp, 20
- beforeEndLoop:
- fld x
- fadd t
- fst x
- fld x2
- fcomip st(0), st(1)
- jb endLoop
- jmp the_begin
- endLoop:
- mov eax, 0
- jmp the_end
- errorBorder :
- mov eax, 1
- the_end :
- mov error, eax
- };
- if (error) {
- cout << "X не может быть больше X2";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement