Advertisement
dar7777

Untitled

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