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