Факториал числа 500 на ASM'e... Пожалуйста помогите!

Тема в разделе "WASM.BEGINNERS", создана пользователем gross_ss, 24 сен 2007.

  1. gross_ss

    gross_ss New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    7
    Здравствуйте! Мне необходимо написать на assembler'e программку которая вычисляла бы 500!, но я столкнулся с проблемой точней с рядом проблем:
    1. Как можно реализовать этот алгоритм (знаю, что через рекурсию, но не пойму как перемножать такие числа)?
    2. Как и куда сбросить такой большой ответ?
    Помогите пожалуйста, если можно то с исходничком(его отрывком), да с кратким описанием...
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    длинную арифметику тебе надо заюзать. ищи в гугле библиотеки, как правило они уже содержат все что нужно тебе - перемножение, вывод.
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    FPU сойдет?
     
  4. gross_ss

    gross_ss New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    7
    конеш сойдёт, вот только я ещё новичёк и не запомнил что значит fpu, напомни плз...
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    необходимо написать - это в топик с вопросами о лаб раб
    Используй FPU для этого как вин калькулятор.
    Потеря точности там конечно будет(разряднасти мантиссы не хватит )
    А точняком и без FPU мож кто другой подскажет:)
     
  6. gross_ss

    gross_ss New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    7
    спасибо... попробуем через fpu
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    google FPU
     
  8. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    Да ответ не такой уж и большой будет:
    Код (Text):
    1. 1220136825991110068701238785423046926253574342803192842192413588385845373153881997605496447502203281863013616477148203584163378722078177200480785205159329285477907571939330603772960859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158735432768888680120399882384702151467605445407663535984174430480128938313896881639487469658817504506926365338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    :derisive:

    Ты, конечно, можешь использовать FPU, но ИМХО это совсем не то что от тебя хотят. С FPU ты получишь примерно такой ответ:
    Код (Text):
    1. 1.2201368259911E+МНОГО
    согласись, потеря в кол-ве значащих цифр заметна.

    Тебе нужно реализовать перемножение числел произвольного размера — т.е. таких, которые выходят за рамки разрядной сетки CPU. Делается это совсем не сложно и не страшно — почти как умножение в столбик.

    http://courses.ece.uiuc.edu/ece390/books/artofasm/CH09/CH09-4.html
     
  9. gross_ss

    gross_ss New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    7
    спасибо огромное, но в принципе я учюсь в техноре там и с потерей значащих сойдёт. спасибо за ссылку...
     
  10. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    ИМХО преподы садисты в этом технаре :)
     
  11. gross_ss

    gross_ss New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    7
    да нет в принципе... напиши им движок сайта на PHP+MySQl и зачёт здан
     
  12. gross_ss

    gross_ss New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    7
    посмотрите пожалуйста я тут кое чо накатал (чёртичё), сам смысл таков (насчёт FPU) или это полный гон...

    .586p
    masm
    model use16 small
    .data
    buf dq 0
    reply dq 1
    x dq 1
    report_1 db 'Interim result : $'
    report_2 db 'Factorial 500(dec) : $'
    .const
    num dw 1F4h
    .stack 100h
    .code
    in_p:
    mov ax,@data
    mov ds,ax
    mov eax,offset num
    call comp
    comp proc
    mov dword ptr [buf],eax
    finit
    fild qword ptr [x]
    fild qword ptr [reply]
    fild qword ptr [buf]
    point_1:
    fmul st(1),st(0)
    fsub st(0),st(2)
    push eax
    mov ah,09h
    mov dx,offset report_1
    int 21h

    ;mov dx, //хочу чтоб выводил промеж. рез.
    ;int 21h
    pop eax
    dec eax
    jnz point_1
    jmp out_p
    comp endp

    out_p:
    mov ah,08h
    int 21h
    mov ax,4c00h
    int 21h
    end in_p


    это я не дописал...
     
  13. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Эту тему многократно поднимали, в том числе и я:)
    Вот до чего я пока дошёл:
    Код (Text):
    1. format PE console
    2. include 'win32axp.inc'
    3. .data
    4. dllka db 'msvcrt.dll',0
    5. name1 db 'scanf',0
    6. scanf dd ?
    7. name2 db 'printf',0
    8. printf dd ?
    9. inp db 'Input N:',0
    10. d db '%d',0
    11. d4 db '%04d',0
    12. crlf db 13,10,0
    13. N dd ?
    14. len dd 1
    15. pstack dd ?
    16. array dw ?
    17.  
    18. .code
    19. fuck:
    20. invoke GlobalAlloc,GPTR,2000000
    21. mov bx,word[eax]
    22. mov [array],bx
    23. inc [array]
    24. invoke LoadLibrary,dllka
    25. push eax
    26. invoke GetProcAddress,eax,name1
    27. mov [scanf],eax
    28. pop eax
    29. invoke GetProcAddress,eax,name2
    30. mov [printf],eax
    31. cinvoke printf,inp
    32. cinvoke scanf,d,N
    33.  
    34. mov ebx,[N]
    35. test ebx,ebx
    36. jl konets
    37.  
    38. mov [pstack],esp
    39. xor edi,edi
    40. xor esi,esi
    41. xor eax,eax
    42. xor esp,esp
    43. inc edi
    44. inc esi
    45. mov esp,2710h
    46. cmp ebx,esi
    47. jb mtk1
    48.  
    49. mtk0:
    50. xor ecx,ecx
    51.  
    52. mtk:
    53. movzx edx,word [array+ecx*2]
    54. imul edx,esi
    55. add eax,edx
    56. xor edx,edx
    57. div esp
    58. mov word[array+ecx*2],dx
    59. inc ecx
    60. cmp ecx,edi
    61. jb mtk
    62. test eax,eax
    63. jnz mtk
    64. inc esi
    65. cmp esi,ebx
    66. mov edi,ecx
    67. jbe mtk0
    68.  
    69. mtk1:
    70. mov esp,[pstack]
    71. movzx eax,word [array-2+edi*2]
    72. cinvoke printf,d,eax
    73. dec edi
    74. jz konets
    75.  
    76. mtk2:
    77. dec edi
    78. movzx ecx,word[array+edi*2]
    79. cinvoke printf,d4,ecx
    80. test edi,edi
    81. jnz mtk2
    82.  
    83. konets:
    84. cinvoke printf,crlf
    85. invoke ExitProcess,0
    86. .end fuck
     
  14. gross_ss

    gross_ss New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    7
    А с помощью сопроцессора, пусть и с потерей значащих сыфорок, не как не получится чтоли? А если получится то как вывести на экран содержимое регистра стека FPU st(1)?
     
  15. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Adrax
    Прости, но бред (насчет выделения памяти)
     
  16. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 KeSqueer
    Этому бреду аосвящена соседняя темка:)
    Знаю, что бред - но работает же! Хотя сам вижу там, глюки и думаю, как их пофиксить
    Факториал 500 вычислит... и даже 1000... а на 100000 запарывается
    А статический массив и для больших чисел рулит... Косячу где-то...