Перерывал тут папку со всякой фигней и наткнулся на сорец.Открыв его я вспомнил,что это было решение квадратного уравнения на встроенном ассемблере.Решил запостить в блог(все равно за него рассчитались),вдруг каким то несчастным студентам пригодится:)
Условие:
ур-ие забивается сразу.Ввод целых чисел (без проверки на ввод с плавающей точкой).Не юзать сопроцессор.
{na primere uravneniya x^2-11x+30}
program Project2;
uses
windows;
var i:integer;
{$APPTYPE CONSOLE}
function sqrt(x: cardinal): integer;
asm
bsr edx, eax // skaniruem bity
jz @exit
mov ecx, edx // 1-y bit v ecx
test ecx, 1 // bit
jz @even // esli net prodolzim
@odd:
shr ecx, 1
inc ecx
shr eax, cl
mov edx, 1
shl edx, cl
shr edx, 1
add eax, edx
mov edx, $B504F334 // magicheskoe chislo 2^32=sqrt(2)
mul edx
mov eax, edx
ret
@even:
shr ecx, 1
inc ecx
shr eax, cl
mov edx, 1
shl edx, cl
shr edx, 2
add eax, edx
@exit:
end;
var x1,x2:dword;
a,b,d,e,r,j,h:dword;
g:integer;
begin
writeln('vvedite koef pir 1-x');
readln(a);
writeln('vvedite pri 2-x');
readln(b);
writeln('vvedite 3-y koef');
readln(e);
asm
mov eax,b //kof v registr
mul b // vozvodim v kvadrat
mov r,eax // kvadrat zapishem v peremenuu
mov eax,4
mul a // 4*a*c
mul e
sub r,eax // tut znachenie b*b -4 * a * c =1
mov eax,r // v eax 1
mov h,eax // v h eax
{sqrt(1)=1 -funkciya ne shitaet}
xor edx,edx
mov eax,b
neg eax
add eax,1
mov ecx,2
div ecx
mov x1,eax //x1
xor edx,edx
mov eax,b
neg eax
sub eax,1
mov ecx,2
div ecx
mov x2,eax
end;
writeln('x1=',x1,' ','x2=',x2);
readln;
end.
Условие:
ур-ие забивается сразу.Ввод целых чисел (без проверки на ввод с плавающей точкой).Не юзать сопроцессор.
{na primere uravneniya x^2-11x+30}
program Project2;
uses
windows;
var i:integer;
{$APPTYPE CONSOLE}
function sqrt(x: cardinal): integer;
asm
bsr edx, eax // skaniruem bity
jz @exit
mov ecx, edx // 1-y bit v ecx
test ecx, 1 // bit
jz @even // esli net prodolzim
@odd:
shr ecx, 1
inc ecx
shr eax, cl
mov edx, 1
shl edx, cl
shr edx, 1
add eax, edx
mov edx, $B504F334 // magicheskoe chislo 2^32=sqrt(2)
mul edx
mov eax, edx
ret
@even:
shr ecx, 1
inc ecx
shr eax, cl
mov edx, 1
shl edx, cl
shr edx, 2
add eax, edx
@exit:
end;
var x1,x2:dword;
a,b,d,e,r,j,h:dword;
g:integer;
begin
writeln('vvedite koef pir 1-x');
readln(a);
writeln('vvedite pri 2-x');
readln(b);
writeln('vvedite 3-y koef');
readln(e);
asm
mov eax,b //kof v registr
mul b // vozvodim v kvadrat
mov r,eax // kvadrat zapishem v peremenuu
mov eax,4
mul a // 4*a*c
mul e
sub r,eax // tut znachenie b*b -4 * a * c =1
mov eax,r // v eax 1
mov h,eax // v h eax
{sqrt(1)=1 -funkciya ne shitaet}
xor edx,edx
mov eax,b
neg eax
add eax,1
mov ecx,2
div ecx
mov x1,eax //x1
xor edx,edx
mov eax,b
neg eax
sub eax,1
mov ecx,2
div ecx
mov x2,eax
end;
writeln('x1=',x1,' ','x2=',x2);
readln;
end.
Комментариев нет:
Отправить комментарий