Advertisement
dar7777

Untitled

Apr 19th, 2021
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.65 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.     double min = 1;
  8.     double a, b, c, x, y;
  9.     double five = 5;
  10.     cout << "a = ";
  11.     cin >> a;
  12.     cout << "b = ";
  13.     cin >> b;
  14.     cout << "c = ";
  15.     cin >> c;
  16.     char m1[] = "-----------------------------\n";
  17.     char m2[] = "|      x      |      y      |\n";
  18.     char m3[] = "-----------------------------\n";
  19.     char s0[] = "| %11.3lf     | %11.3lf     |\n";
  20.     char s1[] = "| %11.3lf     | ----------- |\n";
  21.     double x1 = 0; //левая граница отрезка
  22.     double x2 = 0; //правая граница отрезка
  23.     cout << "x1 = ";
  24.     cin >> x1;
  25.     cout << "x2 = ";
  26.     cin >> x2;
  27.     double t; //шаг
  28.     cout << "t = ";
  29.     cin >> t;
  30.     int error;
  31.  
  32.     _asm {
  33.         //=====Заголовок таблицы=====
  34.         lea ebx, m1
  35.         push ebx
  36.         call printf
  37.         add esp, 4
  38.         lea ebx, m2
  39.         push ebx
  40.         call printf
  41.         add esp, 4
  42.         lea ebx, m3
  43.         push ebx
  44.         call printf
  45.         add esp, 4
  46.         //=====Таблица значений функции y=====
  47.         //инициализация сопроцессора и проверка на правую границу
  48.         finit
  49.         fld x
  50.         fld x2
  51.         fcomip st(0), st(1)
  52.         fstp st(0)
  53.         //Перейти, если меньше
  54.         jb errorBorder
  55.  
  56.         the_begin :
  57.             //=====Расчет y(x)=====
  58.             //если x<5, c!=0, то y=-a*x*x-b
  59.             //если x>5, c==0, то y=(x-a)/x
  60.             // но если x==0 – деление на 0
  61.             //иначе y=-(x/c)
  62.             // но если c==0 - деление на 0
  63.            
  64.             //Проверка и вычисление первого выражения           
  65.             //x<5, c!=0, y=-a*x*x-b
  66.         Exp1 :
  67.             fld five
  68.             //[st(0) == 5]
  69.             fld x
  70.             //[st(1) == 5 st(0) == x]
  71.             fcomip st(0), st(1)
  72.             fstp st(0)
  73.             //если x >= 5,
  74.             //то переход на метку Exp2
  75.             jnb Exp2
  76.             fldz
  77.             fld c
  78.             fcomip st(0), st(1)
  79.             //если c == 0, то переход на метку Exp2
  80.             je Exp2
  81.             //-a*x*x-b
  82.             fsub min
  83.             fmul a
  84.             fmul x
  85.             fmul x
  86.             fsub b
  87.             //y = st(0) и вытолкнуть (y == -a*x*x-b)
  88.             fstp y
  89.             jmp printXY
  90.                
  91.             //x>5, c==0, y=(x-a)/x
  92.         Exp2 :
  93.             fld five
  94.             fld x
  95.             fcomip st(0), st(1)
  96.             fstp st(0)
  97.             //если x = 5,
  98.             //то переход на метку Exp3
  99.             je Exp3
  100.             fldz
  101.             fld c
  102.             fcomip st(0), st(1)
  103.             //если c != 0,
  104.             //то переход на метку Exp3
  105.             jne Exp3
  106.             // (x - a) / x
  107.             fld x
  108.             fcomip st(0), st(1)
  109.             je printX
  110.  
  111.             fld x
  112.             fsub a
  113.             //(st(0) == x-a)
  114.             fld x
  115.             //[st(2) == 0 st(1) == x-a st(0) == x]
  116.             fdivp st(1), st(0)
  117.             //st(1) = st(1)/st(0) и вытолкнуть
  118.             //[st(1) == 0 st(0) == (x-a)/x]
  119.             fstp y
  120.             //y = st(0) и вытолкнуть (y == (x-a)/x)
  121.             //[st(0) == 0]
  122.             jmp printXY
  123.         Exp3 :
  124.             fld c
  125.             fcomip st(0), st(1)
  126.             je printX
  127.             // -x / c
  128.             fsub min
  129.             fmul x
  130.             fdiv c
  131.             fstp y
  132.             //y = st(0) и вытолкнуть (y == (-x/c))
  133.             jmp printXY
  134.            
  135.             //Вывод значений если Y вычислить невозможно
  136.         printX:
  137.             sub esp, 8
  138.             fstp qword ptr[esp]
  139.             lea eax, s1
  140.             push eax
  141.             call printf
  142.             add esp, 12
  143.             jmp beforeEndLoop
  144.  
  145.             //Вывод значений X и Y
  146.         printXY:
  147.             sub esp, 8
  148.             fld y
  149.             fstp qword ptr[esp]
  150.             fld x
  151.             sub esp, 8
  152.             fstp qword ptr[esp]
  153.             lea eax, s0
  154.             push eax
  155.             call printf
  156.             add esp, 20
  157.         beforeEndLoop:
  158.             fld x
  159.             fadd t
  160.             fst x
  161.             fld x2
  162.             fcomip st(0), st(1)
  163.             jb endLoop
  164.             jmp the_begin
  165.         endLoop:
  166.             mov eax, 0
  167.             jmp the_end
  168.         errorBorder :
  169.             mov eax, 1
  170.         the_end :
  171.             mov error, eax
  172.     };
  173.     if (error) {
  174.         cout << "X не может быть больше X2";
  175.     }
  176.     return 0;
  177. }
  178.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement