Advertisement
dar7777

Untitled

Apr 19th, 2021
616
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.98 KB | None | 0 0
  1. #include<stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.     double minys = 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.     int key;
  24.     cout << "x1 = ";
  25.     cin >> x1;
  26.     cout << "x2 = ";
  27.     cin >> x2;
  28.     double t; //шаг
  29.     cout << "t = ";
  30.     cin >> t;
  31.     _asm {
  32.         //=====Заголовок таблицы=====
  33.         lea ebx, m1
  34.         push ebx
  35.         call printf
  36.         add esp, 4
  37.         lea ebx, m2
  38.         push ebx
  39.         call printf
  40.         add esp, 4
  41.         lea ebx, m3
  42.         push ebx
  43.         call printf
  44.         add esp, 4
  45.         //=====Таблица значений функции y=====
  46.         //инициализация сопроцессора
  47.         finit
  48.         //загрузить вещественное значение в стек FPU st(0) = x1
  49.         fld x1
  50.         //Сохранить вещественное значение с извлечением из стека x = st(0) и вытолкнуть (x == x1)
  51.         //[стек пуст]
  52.         fstp x
  53.         fldz
  54.         //st(0) = 0
  55.         the_begin :
  56.             fld x2
  57.             //[st(1) == 0 st(0) == x2]
  58.             fsub x
  59.             //st(0) = st(0)-x (st(0) == (x2–x))
  60.             fcomip st(0), st(1)
  61.             //st(0) сравнить с st(1) и вытолкнуть
  62.             //[st(0) == 0]
  63.             //если (x2-x)<0 (выход за правую границу),
  64.             //то переход на метку end
  65.             fstp st(0)
  66.             jb the_end
  67.             //=====Расчет y(x)=====
  68.             //если x<5, c!=0, то y=-a*x*x-b
  69.             //если x>5, c==0, то y=(x-a)/x
  70.             // но если x==0 – деление на 0
  71.             //иначе y=-(x/c)
  72.             // но если c==0 - деление на 0
  73.             //Стратегия: если значение функции в точке x
  74.             //определено, то результат помещаем в y
  75.             //и key присваиваем 0, иначе key присваиваем 1.
  76.             //Стек пуст        
  77.             //x<5, c!=0, то y=-a*x*x-b
  78.             fld five
  79.             //[st(0) == 5]
  80.             fld x
  81.             //[st(1) == 5 st(0) == x]
  82.             fcomip st(0), st(1)
  83.             fstp st(0)
  84.             //если x >= 5,
  85.             //то переход на метку Expression1
  86.             jae Expression1
  87.             fldz
  88.             fld c
  89.             fcomip st(0), st(1)
  90.             //если c == 0, то переход на метку Expression1
  91.             je Expression1
  92.            
  93.             // -a*x*x-b
  94.             fsub minys
  95.             fmul a
  96.             fmul x
  97.             fmul x
  98.             fsub b
  99.             //y = st(0) и вытолкнуть (y == -a*x*x-b)
  100.             fstp y
  101.             mov key, 0
  102.             //key = 0 (значение y определено)
  103.             jmp l1
  104.                
  105.             //случай x>5, c==0, y=(x-a)/x
  106.         Expression1 :
  107.             fld five
  108.             fld x
  109.             fcomip st(0), st(1)
  110.             fstp st(0)
  111.             //если x = 5,
  112.             //то переход на метку Expression2
  113.             je Expression2
  114.             fldz
  115.             fld c
  116.             fcomip st(0), st(1)
  117.             //если c != 0,
  118.             //то переход на метку Expression2
  119.             jne Expression2
  120.  
  121.             // (x - a) / x
  122.             fld x
  123.             fcomip st(0), st(1)
  124.             je zero
  125.  
  126.             fld x
  127.             fsub a
  128.             //(st(0) == x-a)
  129.             fld x
  130.             //[st(2) == 0 st(1) == x-a st(0) == x]
  131.  
  132.             fdivp st(1), st(0)
  133.             //st(1) = st(1)/st(0) и вытолкнуть
  134.             //[st(1) == 0 st(0) == (x-a)/x]
  135.             fstp y
  136.             //y = st(0) и вытолкнуть (y == (x-a)/x)
  137.             //[st(0) == 0]
  138.             mov key, 0
  139.             //key = 0 (значение y определено)
  140.             jmp l1
  141.  
  142.         Expression2 :
  143.             fld c
  144.             fcomip st(0), st(1)
  145.             je zero
  146.             // -x / c
  147.             fsub minys
  148.             fmul x
  149.             fdiv c
  150.             fstp y
  151.             //y = st(0) и вытолкнуть (y == (-x/c))
  152.             //[st(0) == 0]
  153.             mov key, 0
  154.             //key = 0 (значение y определено)
  155.             jmp l1
  156.         zero :
  157.             mov key, 1
  158.             //key = 1 (значение y не определено)
  159.         l1 :
  160.             //=====Вывод строки таблицы=====
  161.             // если значение функции
  162.             //в точке x определено,
  163.             //то результат лежит в y и key == 0,
  164.             //иначе key == 1
  165.             //В стеке [st(0) == 0]
  166.             cmp key, 0
  167.             //сравнить key c 0
  168.             je l5
  169.             //если равны, переход на метку l5
  170.            //~~~случай, когда y не определен (key==1)~~~
  171.             sub esp, 8
  172.             //указатель сегмента стека esp уменьшить на 8
  173.             fld x
  174.             //st(0) = x [st(1) == 0 st(0) == x]
  175.             fstp qword ptr[esp]
  176.             //st(0) (то есть x) загрузить в сегмент стека
  177.             //(в соответствии с указателем сегмента стека
  178.             //esp) и вытолкнуть [st(0) == 0]
  179.             lea eax, s1
  180.             //поместить адрес строки s1 в eax
  181.             push eax
  182.             //поместить eax (адрес s1) в сегмент стека,
  183.             //автоматически уменьшится указатель сегмента
  184.             //стека esp еще на 4 байта
  185.             call printf
  186.             //вызвать функцию printf(s1,x)
  187.             add esp, 12
  188.             //вернуть указатель сегмента стека esp в
  189.             //исходное состояние (увеличить на 12)
  190.             jmp l6
  191.             //переход на метку l6
  192.             //~~~случай, когда y определен (key==0)~~~
  193.         l5 :
  194.             sub esp, 8
  195.             //указатель сегмента стека esp уменьшить на 8
  196.             fld y
  197.             //st(0) = y [st(1) == 0 st(0) == y]
  198.             fstp qword ptr[esp]
  199.             //st(0) (то есть y) загрузить в сегмент стека
  200.             //(в соответствии с указателем сегмента стека
  201.             //esp) и вытолкнуть [st(0) == 0]
  202.             sub esp, 8
  203.             //указатель сегмента стека esp уменьшить на 8
  204.             fld x
  205.             //st(0) = x [st(1) == 0 st(0) == x]
  206.             fstp qword ptr[esp]
  207.             //st(0) (то есть x) загрузили в сегмент стека
  208.             //(в соответствии с указателем сегмента стека
  209.             //esp) и вытолкнуть [st(0) == 0]
  210.             lea eax, s0
  211.             //поместить адрес строки s0 в eax
  212.             push eax
  213.             //поместить eax (адрес s0) в сегмент стека,
  214.             //автоматически уменьшится указатель сегмента
  215.             //стека esp еще на 4 байта
  216.             call printf
  217.             //вызвать функцию printf(s0,x,y)
  218.             add esp, 20
  219.             //вернуть указатель сегмента стека esp в
  220.             //исходное состояние (увеличть на 20)
  221.         l6:
  222.             fld x
  223.             //st(0) = x
  224.             //[st(1) == 0 st(0) == x]
  225.             fadd t
  226.             //st(0) = st(0)+t (st(0) == (x+t))
  227.             fstp x
  228.             //x = st(0) и вытолкнуть
  229.             //(x увеличился на шаг t) [st(0) == 0]
  230.             jmp the_begin
  231.             //переход на метку begin
  232.         the_end :
  233.     }
  234.     return 0;
  235. }
  236.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement