@TomYol

Как решить это с помощью ассембелера?

Есть у меня выражение, нужно решить его с помощью ассемблерной вставки на с++
Моё выражение
6044e4ae836f1858625769.png

Есть даже пример решения другого выражения
Выражение с примера
6044e4e3de1ff198314639.png

Код примера
#include "iostream"
using namespace std;
 
int main()
{
    short x, y, z, f1, f2;
 
    cout << "x = ";
    cin >> x;
 
    cout << "y = ";
    cin >> y;
 
    cout << "z = ";
    cin >> z;
 
    /*
    Formula:
    (4*x*x - 3)/5*y,   (x > 5 || y == 5) && y != 0;
    (y - 3)/z + 2,     z != 0 && x <= 5;
    y*y - 3,           otherwise;
 
    (1)
    x = 10
    y = 5
    z = 5
    f = 15 / result
 
    (2)
    x = 3
    y = 21
    z = 7
    f = 4 / result
 
    (3)
    x = 6
    y = 0
    z = 3
    f = -3 / result
    */
    /* Check on C++ the right result */
    if ((x > 5 || y == 5) && y != 0)
    {
        f1 = (4 * x * x - 3) / (5 * y);
        cout << "f1 = (4 * x * x - 3) / (5 * y) = " << f1 << endl;
    }
 
    else if (z != 0 && x <= 5)
    {
        f1 = (y - 3) / z + 2;
        cout << "f1 = (y - 3) / z + 2 = " << f1 << endl;
    }
    else
    {
        f1 = y * y - 3;
        cout << "f1 = y * y - 3 = " << f1 << endl;
    }
    _asm {
        //(x > 5 || y == 5)
        cmp y, 5
        je m1
        cmp x, 5
        jg m1
 
        //z!=0;
        cmp z, 0
        jne m2
 
        m1 :
        //&& y != 0
        cmp y, 0
            je m3
 
            //(4*x*x - 3)/5*y
            mov ax, 4
            imul x
            imul x
            sub ax, 3
            mov bx, 5
            xchg ax, bx
            imul y
            xchg ax, bx
            CWD
            idiv bx
            //jump to result
            jmp stop
 
            m2 :
        //&& x <= 5 - не обязательно
        cmp x, 5
            jg m3
 
            // (y - 3)/z + 2
            mov ax, y
            sub ax, 3
            CWD
            idiv z
            add ax, 2
            //jump to result
            jmp stop
 
            m3 :
        // y*y - 3
        mov ax, y
            imul y
            sub ax, 3
 
            //jump to result
            jmp stop
 
            stop :
        mov f2, ax
    }
 
    cout << "F (C++) = " << f1 << endl;
    cout << "F (ASM) = " << f2 << endl;
 
    system("PAUSE");
    return 0;
}


Смог сделать только малую часть, дальше не понятно.
_asm {
		//(y > 0 || z == 5)
		cmp z, 0
		je m1
		cmp y, 0
		jg m1

		//x == 0;
		cmp x, 0
		je m2
	}
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы