dar7777

Untitled

Apr 19th, 2021
401
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.             fld x
  117.             je printX
  118.             fstp st(0)
  119.             //st0 = 0
  120.            
  121.             fld x
  122.             fsub a
  123.             //(st(0) == x-a)
  124.             fld x
  125.             //[st(2) == 0 st(1) == x-a st(0) == x]
  126.             fdivp st(1), st(0)
  127.             //st(1) = st(1)/st(0) и вытолкнуть
  128.             //[st(1) == 0 st(0) == (x-a)/x]
  129.             fstp y
  130.             //y = st(0) и вытолкнуть (y == (x-a)/x)
  131.             //st(0) = 0
  132.             jmp printXY
  133.         Exp3 :
  134.             fld c
  135.             fcomip st(0), st(1)
  136.             fld x
  137.             je printX
  138.             fstp st(0)
  139.             // -x / c
  140.             fsub min
  141.             fmul x
  142.             fdiv c
  143.             fstp y
  144.             //y = st(0) и вытолкнуть (y == (-x/c))
  145.             jmp printXY
  146.            
  147.             //Вывод значений если Y вычислить невозможно
  148.         printX:
  149.             sub esp, 8
  150.             //указатель сегмента стека esp уменьшить на 8
  151.             fstp qword ptr[esp]
  152.             //st(0) (то есть x) загрузить в сегмент стека
  153.             //(в соответствии с указателем сегмента стека
  154.             //esp) и вытолкнуть [st(0) == 0]
  155.             lea eax, s1
  156.             //поместить адрес строки s1 в eax
  157.             push eax
  158.             //поместить eax (адрес s1) в сегмент стека,
  159.             //автоматически уменьшится указатель сегмента
  160.             //стека esp еще на 4 байта
  161.             call printf
  162.             //вызвать функцию printf(s1,x)
  163.             add esp, 12
  164.             //вернуть указатель сегмента стека esp в
  165.             //исходное состояние (увеличить на 12)
  166.             jmp beforeEndLoop
  167.  
  168.             //Вывод значений X и Y
  169.         printXY:
  170.             sub esp, 8
  171.             //указатель сегмента стека esp уменьшить на 8
  172.             fld y
  173.             fstp qword ptr[esp]
  174.             //st(0) (то есть y) загрузить в сегмент стека
  175.             //(в соответствии с указателем сегмента стека
  176.             //esp) и вытолкнуть [st(0) == 0]
  177.             fld x
  178.             sub esp, 8
  179.             fstp qword ptr[esp]
  180.             lea eax, s0
  181.             push eax
  182.             call printf
  183.             add esp, 20
  184.  
  185.         beforeEndLoop:
  186.             fld x
  187.             fadd t
  188.             fst x
  189.             //Сохранение вершины стека x в память
  190.             fld x2
  191.             fcomip st(0), st(1)
  192.             jb endLoop
  193.             //Перейти, если меньше
  194.             jmp the_begin
  195.  
  196.         endLoop:
  197.             mov eax, 0
  198.             jmp the_end
  199.         errorBorder :
  200.             mov eax, 1
  201.         the_end :
  202.             mov error, eax
  203.     };
  204.     if (error) {
  205.         cout << "X не может быть больше X2";
  206.     }
  207.     return 0;
  208. }
  209.  
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.

×