SOS! Магия с assembler + pascal

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

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

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

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

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

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

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

Листинг программы
  1. {$asmmode intel}
  2. var
  3. b : longint;
  4. s : string;
  5. a : array[0..5] of longint;
  6. function my_sqrt(n: longint): longint;
  7. var
  8. f : real;
  9. begin
  10. f := n;
  11. asm
  12. finit
  13. fld f
  14. fsqrt
  15. fst f
  16. end;
  17. my_sqrt := round(f);
  18. end;
  19. function del(n: longint): longint;
  20. var
  21. i, d : longint;
  22. begin
  23. d := 0;
  24. i := my_sqrt(n);
  25. // writeln(n, ' ', i);
  26. asm
  27. mov ecx, 0
  28. mov ebx, i
  29. add ebx, 1
  30. @while:
  31. sub ebx, 1
  32. cmp ebx, 0
  33. jle @endw
  34. mov eax, n
  35. cdq
  36. idiv ebx
  37. cmp edx, 0
  38. jne @while
  39. cmp ebx, eax
  40. je @one
  41. add ecx, 2
  42. jmp @while
  43. @one:
  44. add ecx, 1
  45. jmp @while
  46. @endw:
  47. mov d, ecx
  48. end;
  49. writeln(d);//если закоментирую эту строчку то считает не правильно. (правильный ответ 110) почему?
  50. del := d;
  51. end;
  52. function f(n: longint): longint;
  53. var
  54. j, q, g : longint;
  55. begin
  56. q := 0;
  57. for j := 1 to n - 1 do begin
  58. q := q + (n - j) * del(j);
  59. end;
  60. f := q + n;
  61. end;
  62. {
  63. a[0] - m ecx
  64. a[1] - i ecx+4
  65. a[2] - j ecx+8
  66. a[3] - ecx+12
  67. a[4] - ecx+16
  68. a[5] - ecx+20
  69. }
  70. begin
  71. a[2] := 10;
  72. a[0] := f(a[2]);
  73. writeln(a[0]);
  74. readln;
  75. end.

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

textual
Листинг программы
  1. {$asmmode intel}
  2.  program test;
  3.  
  4.  
  5. function my_sqrt(n: longint): longint;
  6. var
  7.    f : real;
  8. begin
  9.    f := n;
  10.  
  11.   asm
  12.       finit
  13.       fld f
  14.       fsqrt
  15.       fst f
  16.    end;
  17.  
  18.    my_sqrt := round(f);
  19. end;
  20.  
  21. function del(n: longint): longint;
  22. var
  23.    i, d : longint;
  24. begin
  25.    d := 0;
  26.    i := my_sqrt(n);
  27. //   writeln(n, ' ', i);
  28.    asm
  29.       push ebx
  30.       mov ecx, 0
  31.       mov ebx, i
  32.       add ebx, 1
  33.       @while:
  34.          sub ebx, 1
  35.          cmp ebx, 0
  36.          jle @endw
  37.          mov eax, n
  38.          cdq
  39.          idiv ebx
  40.          cmp edx, 0
  41.          jne @while
  42.          cmp ebx, eax
  43.          je @one
  44.          add ecx, 2
  45.          jmp @while
  46.          @one:
  47.             add ecx, 1
  48.             jmp @while
  49.       @endw:
  50.          mov d, ecx
  51.      mov eax, ecx
  52.      pop ebx
  53.    end;
  54.    //writeln(' -> ',d);//если закоментирую эту строчку то считает не правильно. (правильный ответ 110) почему?
  55.    del := d;
  56. end;
  57.  
  58. function f(n: longint): longint;
  59. var
  60.    j,  q : longint;
  61. begin
  62.    q := 0;
  63.    for j := 1 to n - 1 do begin
  64.       q := q + (n - j) * del(j);
  65.    end;
  66.    f := q + n;
  67. end;
  68. var
  69.    a : array[0..5] of longint;
  70. {
  71.    a[0] - m      ecx
  72.    a[1] - i      ecx+4
  73.    a[2] - j      ecx+8
  74.    a[3] -        ecx+12
  75.    a[4] -        ecx+16
  76.    a[5] -        ecx+20
  77. }
  78. begin
  79.    //a[2] := 10;
  80.    //a[0] := f(a[2]);
  81.    //writeln(a[0]);
  82.    writeln(f(10));
  83.   // readln;
  84. end.

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут