Advertisement
dar7777

Untitled

Apr 19th, 2021
770
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.72 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.         //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.             fld y
  172.             fstp qword ptr[esp]
  173.             fld x
  174.             sub esp, 8
  175.             fstp qword ptr[esp]
  176.             lea eax, s0
  177.             push eax
  178.             call printf
  179.             add esp, 20
  180.  
  181.         beforeEndLoop:
  182.             fld x
  183.             fadd t
  184.             fst x
  185.             //Сохранение вершины стека x в память
  186.             fld x2
  187.             fcomip st(0), st(1)
  188.             jb endLoop
  189.             //Перейти, если меньше
  190.             jmp the_begin
  191.  
  192.         endLoop:
  193.             mov eax, 0
  194.             jmp the_end
  195.         errorBorder :
  196.             mov eax, 1
  197.         the_end :
  198.             mov error, eax
  199.     };
  200.     if (error) {
  201.         cout << "X не может быть больше X2";
  202.     }
  203.     return 0;
  204. }
  205.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement