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.