Advertisement
dar7777

Untitled

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