Общее·количество·просмотров·страницы

понедельник, 9 января 2012 г.

Перерывал тут папку со всякой фигней и наткнулся на сорец.Открыв его я вспомнил,что это было решение квадратного уравнения на встроенном ассемблере.Решил запостить в блог(все равно за него рассчитались),вдруг каким то несчастным студентам пригодится:)
Условие:
ур-ие забивается сразу.Ввод целых чисел (без проверки на ввод с плавающей точкой).Не юзать сопроцессор.


{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.


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

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