Решить уравнение на Ассемблере

Я использую Ассемблерную вставку на языке Си. Немного запутался в вычислениях. Вот само уравнение: (12 / c - d * 4 + 73)/(a*a+1). Регистры нужно использовать для 16 бит. В режиме Шаг с заходом выбивает в вычислениях числителя (я указал в коде.) Укажите пожалуйста на мои ошибки.

#include <stdio.h>
#include <cstdlib>

int main()
{
short int a, c, d, res_asm, res_c;
printf("Enter a:"); scanf_s("%hd", &a);
printf("Enter c:"); scanf_s("%hd", &c);
printf("Enter d:"); scanf_s("%hd", &d);
res_c = (12 / c - d * 4 + 73) / (a * a + 1);
printf("res_c= %d", res_c);
printf("\n");
__asm
{
    // Знаменатель (считает правильно)
    mov ax, a;
    mov bx, a;
    imul bx;
    mov bx, 1;
    idiv bx;
    add ax, 1;

    mov a, ax;

    // Числитель (считает неправильно)
    mov ax, 12;
    cwd;
    mov cx, c;
    idiv cx;
    mov bx, d;
    mov cx, 4;
    imul cx;
    mov cx, 1;
    idiv cx;
    sub ax, bx;
    add ax, 73;
    cwd;
    mov cx, a;
    idiv cx;




    mov res_asm, ax;


}
printf("res_asm = %d", res_asm);
return 0;

}


Ответы (1 шт):

Автор решения: Chample

Проблема решена.

#include <stdio.h>
#include <cstdlib>

int main()
{
short int a, c, d, res_asm, res_c;
printf("Enter a:"); scanf_s("%hd", &a);
printf("Enter c:"); scanf_s("%hd", &c);
printf("Enter d:"); scanf_s("%hd", &d);
res_c = (12 / c - d * 4 + 73) / (a * a + 1);
printf("res_c= %d", res_c);
printf("\n");
__asm
{
    // Знаменатель
    mov ax, a; // ax = a
    mov bx, a; // bx = a
    imul bx; // ax:dx = a*a
    mov bx, 1; // bx = 1
    idiv bx; // ax = a*a
    add ax, 1; // ax = a*a+1

    mov a, ax; 

    // Свободные регистры: ax,bx,cx,dx;
    // Числитель
    mov ax, 12; // ax = 12
    cwd; // ax:dx = 12
    mov bx, c; // bx = c
    idiv bx; // ax = 12/c
    mov bx, ax;
    mov ax, d; // ax = d
    mov cx, 4; // cx = 4
    imul cx; // ax:dx = d*4 
    mov cx, 1; // cx = 1
    idiv cx; // ax = d*4
    sub bx, ax; // bx = 12/c-d*4
    add bx, 73; // bx = 12/c-d*4+73
    mov ax, bx; // ax = 12/c-d*4+73
    cwd;
    mov cx, a;
    idiv cx;

    mov res_asm, ax;


}
printf("res_asm = %d", res_asm);
return 0;

}

→ Ссылка