dar7777

Untitled

Apr 19th, 2021
406
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.         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.  
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.

×