Для того чтобы лучше разобраться в алгоритме возведения в квадрат и произведения, без команды mul, рассмотрим программу, выполняющую вычисление значения функции
y=7(a-b)^2
#include <stdio.h>
#include <conio.h>
//7(a-b)^2
void main()
{
int a=666666;
int b=1;
int err=0;
int yl=0;
int yh=0;
int i;
_asm
{
//Ввод a
mov eax,a
//Ввод b
mov ebx,b
//Вычитание
sub eax,ebx
jo M_Er //Переход, если переполнение
bt eax,31 //Перевод в
прямой код
jnc M_1
neg eax
M_1:
//Возведение в квадрат
mov ebx,eax
xor edx,edx
mov ecx,32
M_3:
bt eax,0
jnc M_2
add edx,ebx
adc eax,0
M_2:
rcr edx,1
rcr eax,1
clc
sub ecx,1
jnz M_3
//Произведение 7(a-b)^2
mov ebx,eax
mov ecx,edx
clc
shl
eax,1
shl edx,1
jo M_Er
clc
shl
eax,1
shl edx,1
jo M_Er
clc
shl
eax,1
shl edx,1
jo M_Er
//Вычитание
clc
sub eax,ebx
jnc M_4
sub edx,1
add eax,0xffffffff
M_4:
sub edx,ecx
mov yl,eax
mov yh,edx
jmp M_Out
M_Er:
mov err,1
//Вывод результата в двоичном
виде
M_Out:
}
printf("yh=
");
for (i = 31; i
>= 0; i--)
{
int mask = 1
<< i;
if ( (mask
& yh) == 0 )
{
printf("0");
}
else printf("1");
}
printf ("\n");
printf ("\n");
printf("yl=
");
for (i = 31; i
>= 0; i--)
{
int mask = 1
<< i;
if ( (mask
& yl) == 0 )
{
printf("0");
}
else printf("1");
}
printf ("\n");
printf("\nERROR
= %d",err);
getch();
}
Без алгоритма работы программы здесь сложновато разобраться поэтому читаем вторую часть алгоритмы возведения в квадрат и произведения
Комментариев нет:
Отправить комментарий