SOS! Магия с assembler + pascal

Узнай цену своей работы

Формулировка задачи:

Программа много раз проверена, но что-то не так.writeln(d);// если закомментирую эту строчку то считает не правильно. Можете объяснить причину. Уже нет ни каких догадок. Пожалуйста, помогите!

Само задание такое:

my_del считает количество натуральных делителей числа.

А ещё может кто-нибудь на Delphi её запустить, а то у меня нет, но интересно - будет ли работать или нет? В чём же причина??

Спасибо заранее!

{$asmmode intel}
 
var
   b : longint;
   s : string;
   a : array[0..5] of longint;
 
function my_sqrt(n: longint): longint;
var
   f : real;
begin
   f := n;
   asm
      finit
      fld f
      fsqrt
      fst f
   end;
   my_sqrt := round(f);
end;
 
function del(n: longint): longint;
var
   i, d : longint;
begin
   d := 0;
   i := my_sqrt(n);
//   writeln(n, ' ', i);
   asm
      mov ecx, 0
      mov ebx, i
      add ebx, 1
      @while:
         sub ebx, 1
         cmp ebx, 0
         jle @endw
         mov eax, n
         cdq
         idiv ebx
         cmp edx, 0
         jne @while
         cmp ebx, eax
         je @one
         add ecx, 2
         jmp @while
         @one:
            add ecx, 1
            jmp @while
      @endw:
         mov d, ecx
   end;
   writeln(d);//если закоментирую эту строчку то считает не правильно. (правильный ответ 110) почему?
   del := d;
end;
 
function f(n: longint): longint;
var
   j,  q, g : longint;
begin
   q := 0;
   for j := 1 to n - 1 do begin
      q := q + (n - j) * del(j);
   end;
   f := q + n;
end;
 
{
   a[0] - m      ecx
   a[1] - i      ecx+4
   a[2] - j      ecx+8
   a[3] -        ecx+12
   a[4] -        ecx+16
   a[5] -        ecx+20
}
begin
   a[2] := 10;
   a[0] := f(a[2]);
   writeln(a[0]);
   readln;
end.

Решение задачи: «SOS! Магия с assembler + pascal»

textual
Листинг программы
{$asmmode intel}
 program test;
 
 
function my_sqrt(n: longint): longint;
var
   f : real;
begin
   f := n;
 
  asm
      finit
      fld f
      fsqrt
      fst f
   end;
 
   my_sqrt := round(f);
end;
 
function del(n: longint): longint;
var
   i, d : longint;
begin
   d := 0;
   i := my_sqrt(n);
//   writeln(n, ' ', i);
   asm
      push ebx
      mov ecx, 0
      mov ebx, i
      add ebx, 1
      @while:
         sub ebx, 1
         cmp ebx, 0
         jle @endw
         mov eax, n
         cdq
         idiv ebx
         cmp edx, 0
         jne @while
         cmp ebx, eax
         je @one
         add ecx, 2
         jmp @while
         @one:
            add ecx, 1
            jmp @while
      @endw:
         mov d, ecx
     mov eax, ecx
     pop ebx
   end;
   //writeln(' -> ',d);//если закоментирую эту строчку то считает не правильно. (правильный ответ 110) почему?
   del := d;
end;
 
function f(n: longint): longint;
var
   j,  q : longint;
begin
   q := 0;
   for j := 1 to n - 1 do begin
      q := q + (n - j) * del(j);
   end;
   f := q + n;
end;
var
   a : array[0..5] of longint;
{
   a[0] - m      ecx
   a[1] - i      ecx+4
   a[2] - j      ecx+8
   a[3] -        ecx+12
   a[4] -        ecx+16
   a[5] -        ecx+20
}
begin
   //a[2] := 10;
   //a[0] := f(a[2]);
   //writeln(a[0]);
   writeln(f(10));
  // readln;
end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5