Не работает код в Вижуал студии - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <locale.h>
#define A 12
#define B 13
long int a, b, left, right, left_a, right_a, a1, b1, err;
int main()
{
setlocale(LC_ALL, "rus");
for (;;) {
printf ("\n\tПроверить тождество (a-b)*(a-b)*(a-b)*(a-b)=(a*a*a*a)-(4*(a*a*a)*b)+(6*(a*a)*(b*b))-(4*a*(b*b*b))+(b*b*b*b);
printf ("\nВведите а: ");
scanf_s("%li", &a);
printf("Введите b: ");
scanf_s("%li", &b);
//================================ C==================================
a1 = a / A;
b1 = b / B;
left = (a - b)*(a - b)*(a - b)*(a - b);
right = (a*a*a*a) - (4 * (a*a*a)*b) + (6 * (a*a)*(b*b)) - (4 * a*(b*b*b)) + (b*b*b*b);
//============================ Assembler =============================
__asm {
// Вычислить левую часть тождества
//Нет ошибок
mov err, 0
//(a - b)*(a - b)
mov eax, a
mov ebx, A
cdq
idiv ebx
mov ecx, eax
imul ecx
imul ecx
jo Er
mov esi, eax
//(a - b)*(a - b)
mov eax, b
mov ebx, B
cdq
idiv ebx
mov edi, eax
imul edi
imul edi
jo Er
jmp Cont
//(a - b)*(a - b)
Er :
mov err, 1
Cont :
sub esi, eax
mov left_a, esi
// Вычислить правую часть тождества
//a1*a1
mov eax, a
mov ebx, A
cdq
idiv ebx
mov ecx, eax
mul eax
mov esi, eax
//b1*b1
mov eax, b
mov ebx, B
cdq
idiv ebx
mov edi, eax
imul eax
add esi, eax
//a1*b1
mov eax, edi
imul ecx
add eax, esi
mov right_a, eax
//a1-b1
mov eax, a
mov ebx, A
cdq
idiv ebx
mov esi, eax
mov eax, b
mov ebx, B
cdq
idiv ebx
sub esi, eax
mov eax, esi
imul right_a
jo Err
jmp Cont1
Err :
mov err, 1
Cont1 :
mov right_a, eax
}
// Вывод результатов
printf("\nЛевая часть тождества ( C ): %li", left);
printf("\nПравая часть тождества( С ): %li", right);
if (!err) {
printf("\nЛевая часть тождества (Asm): %li", left_a);
printf("\nПравая часть тождества(Asm): %li\n", right_a);
}
else {
printf("\nЛевая часть тождества (Asm): Переполнение!");
printf("\nПравая часть тождества(Asm): Переполнение!");
}
}
return 0;
}Решение задачи: «Не работает код в Вижуал студии»
textual
Листинг программы
__asm
{ // Вычислить левую часть тождества
mov dword ptr err,1
mov eax, a
sub eax,b
imul eax
jo _Err
imul eax
jo _Err
mov left_a, eax
// Вычислить правую часть тождества
mov eax,a
imul eax
jo _Err
imul eax
jo _Err
mov ecx,eax //a^4
idiv dword ptr a
imul dword ptr b
jo _Err
mov ebx,-4
imul ebx //-4*a^3*b
jo _Err
add ecx,eax //a^4-4*a^3*b
mov eax,a
imul eax
jo _Err
imul dword ptr b
jo _Err
imul dword ptr b
jo _Err
mov ebx,6
imul ebx //6*a^2*b^2
add ecx,eax //a^4-4*a^3*b+6*a^2*b^2
mov eax,b
imul eax
jo _Err
imul dword ptr b
jo _Err
imul dword ptr a
jo _Err
mov ebx,-4
imul ebx //-4*a*b^3
jo _Err
add ecx,eax //a^4-4*a^3*b+6*a^2*b^2-4*a*b^3
mov eax,b
imul eax
jo _Err
imul eax //b^4
jo _Err
add eax,ecx
mov right_a,eax
mov byte ptr err,0
_Err:
}