dar7777

Untitled

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

×