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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д