Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <iostream>
- using namespace std;
- //вариант 20:
- // a > b : (b + 1)/ a + 1 |
- // a = b : -b | = X
- // a < b : (a - 5)/ b |
- void cppcalc(double a, double b) {
- if (a > b)
- {
- if (a == 0) {
- cout << "System err: Division by zero!" << endl;
- return;
- }
- cout << endl << "System computing: " << (b + 1) / a + 1;
- }
- else if (a < b) {
- if (b == 0) {
- cout << "System err: Division by zero!" << endl;
- return;
- }
- cout << endl << "System computing: " << (a - 5) / b;
- }
- else
- cout << endl << "System computing: " << 0 - b;
- cout << endl;
- return;
- }
- void calc(double a, double b) {
- int status;
- int err_flag = 0;
- double result;
- const int c5 = 5;
- const int c1 = 1;
- _asm {
- finit // инициализация сопроцессора
- fld b // s0 = b
- fld a // s0 = a, s1 = b
- fcom st(1) //сравниваем a_b
- fstsw status //сохраняем регистр флагов сопроцессора
- mov ah, byte ptr[status + 1]
- sahf //записываем в регистр флагов сопроцессора
- ja a_bigger // переход если a больше
- jb b_bigger // переход если b больше
- //если равны
- fld b // s0 = b, s1 = a, s2 = b
- fchs // s0 = -b
- fstp result
- fxam
- jmp end_of_code
- a_bigger : ;
- ftst // сравнение a с 0
- fnstsw ax // сохраняем регистр флагов сопроцессора
- sahf // записываем в регистр флагов процессора
- je error // переход если a = 0
- fild c1 // s0 = 1, s1 = a, s2 = b
- faddp st(2), st // s0 = a, s1 = b + 1
- fdiv // s0 = (b + 1)/a
- fild c1 // s0 = 1, s1 = (b + 1)/a
- fadd //s0 = (b + 1)/a + 1
- fstp result
- fxam
- jmp end_of_code
- b_bigger : ;
- fldz // s0 = 0, s1 = a, s2 = b
- fcomp st(2) // сравнение b с 0
- fnstsw ax // сохраняем регистр флагов сопроцессора
- je error // переход если b = 0
- fild c5 // s0 = 5, s1 = a, s2 = b
- fsub //s0 = a - 5, s1 = b
- fld b //s0 = b, s1 = a - 5, s2 = b
- fdiv // s0 = (a - 5) / b
- fstp result
- fxam
- jmp end_of_code
- error:
- mov err_flag, 1
- jmp end_of_code
- end_of_code : ;
- }
- if (err_flag == 0)
- cout << "Asm computing: " << result << endl;
- else
- cout << "Asm err: Division by zero!" << endl;
- }
- int main() {
- cout << "a: ";
- double a;
- cin >> a;
- cout << endl << "b: ";
- double b;
- cin >> b;
- cout << endl;
- cppcalc(a, b);
- calc(a, b);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement