dar7777

Untitled

Apr 19th, 2021
298
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.  
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×