dar7777

Untitled

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

×