Возведение в квадрат и произведение без команды mul

Для того чтобы лучше разобраться в алгоритме возведения в квадрат и произведения, без команды mul, рассмотрим программу, выполняющую вычисление значения функции
y=7(a-b)^2
вот код программы который работает в MS Visual studio:
#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();

}
Без алгоритма работы программы здесь сложновато разобраться поэтому читаем вторую часть алгоритмы возведения в квадрат и произведения

Комментариев нет:

Отправить комментарий