Advertisement
Leeen

sys_pro_5

May 16th, 2020
1,246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.16 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5. //вариант 20:
  6. // a > b : (b + 1)/ a + 1   |
  7. // a = b : -b               | = X
  8. // a < b : (a - 5)/ b       |
  9.  
  10. void cppcalc(double a, double b) {
  11.  
  12.     if (a > b)
  13.     {
  14.         if (a == 0) {
  15.             cout << "System err: Division by zero!" << endl;
  16.             return;
  17.         }
  18.            
  19.          cout << endl << "System computing: " << (b + 1) / a + 1;
  20.     }
  21.        
  22.     else if (a < b) {
  23.         if (b == 0) {
  24.             cout << "System err: Division by zero!" << endl;
  25.             return;
  26.         }
  27.         cout << endl << "System computing: " << (a - 5) / b;
  28.     }
  29.        
  30.     else
  31.         cout << endl << "System computing: " << 0 - b;
  32.     cout << endl;
  33.     return;
  34. }
  35.  
  36. void calc(double a, double b) {
  37.     int status;
  38.     int err_flag = 0;
  39.     double result;
  40.     const int c5 = 5;
  41.     const int c1 = 1;
  42.  
  43.     _asm {
  44.  
  45.         finit // инициализация сопроцессора
  46.         fld b // s0 = b
  47.         fld a // s0 = a, s1 = b
  48.         fcom st(1) //сравниваем a_b
  49.  
  50.         fstsw status //сохраняем регистр флагов сопроцессора
  51.         mov ah, byte ptr[status + 1]
  52.         sahf //записываем в регистр флагов сопроцессора
  53.  
  54.         ja a_bigger // переход если a больше
  55.         jb b_bigger // переход если b больше
  56.        
  57.         //если равны
  58.         fld b // s0 = b, s1 = a, s2 = b
  59.         fchs // s0 = -b
  60.         fstp result
  61.         fxam
  62.         jmp end_of_code
  63.  
  64.         a_bigger : ;
  65.         ftst // сравнение a с 0
  66.             fnstsw ax // сохраняем регистр флагов сопроцессора
  67.             sahf // записываем в регистр флагов процессора
  68.             je error // переход если a = 0
  69.  
  70.             fild c1 // s0 = 1, s1 = a, s2 = b
  71.             faddp st(2), st // s0 = a, s1 = b + 1
  72.             fdiv // s0 = (b + 1)/a
  73.             fild c1 // s0 = 1, s1 = (b + 1)/a
  74.             fadd //s0 = (b + 1)/a + 1
  75.             fstp result
  76.             fxam
  77.             jmp end_of_code
  78.  
  79.        b_bigger : ;
  80.             fldz // s0 = 0, s1 = a, s2 = b
  81.             fcomp st(2) // сравнение b с 0
  82.             fnstsw ax // сохраняем регистр флагов сопроцессора
  83.             je error // переход если b = 0
  84.  
  85.             fild c5 // s0 = 5, s1 = a, s2 = b
  86.             fsub //s0 = a - 5, s1 = b
  87.             fld b //s0 = b, s1 = a - 5, s2 = b
  88.             fdiv // s0 = (a - 5) / b
  89.             fstp result
  90.             fxam
  91.             jmp end_of_code
  92.  
  93.  
  94.                 error:
  95.             mov err_flag, 1
  96.             jmp end_of_code
  97.  
  98.         end_of_code : ;
  99.     }
  100.  
  101.  
  102.     if (err_flag == 0)
  103.         cout << "Asm computing: " << result << endl;
  104.     else
  105.         cout << "Asm err: Division by zero!" << endl;
  106. }
  107.  
  108. int main() {
  109.     cout << "a: ";
  110.     double a;
  111.     cin >> a;
  112.     cout << endl << "b: ";
  113.     double b;
  114.     cin >> b;
  115.     cout << endl;
  116.  
  117.     cppcalc(a, b);
  118.     calc(a, b);
  119.  
  120.  
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement