Решить уравнение на Ассемблере
Я использую Ассемблерную вставку на языке Си. Немного запутался в вычислениях. Вот само уравнение: (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;
}