Здравствуйте! Мне необходимо написать на assembler'e программку которая вычисляла бы 500!, но я столкнулся с проблемой точней с рядом проблем: 1. Как можно реализовать этот алгоритм (знаю, что через рекурсию, но не пойму как перемножать такие числа)? 2. Как и куда сбросить такой большой ответ? Помогите пожалуйста, если можно то с исходничком(его отрывком), да с кратким описанием...
длинную арифметику тебе надо заюзать. ищи в гугле библиотеки, как правило они уже содержат все что нужно тебе - перемножение, вывод.
необходимо написать - это в топик с вопросами о лаб раб Используй FPU для этого как вин калькулятор. Потеря точности там конечно будет(разряднасти мантиссы не хватит ) А точняком и без FPU мож кто другой подскажет
Да ответ не такой уж и большой будет: Код (Text): 1220136825991110068701238785423046926253574342803192842192413588385845373153881997605496447502203281863013616477148203584163378722078177200480785205159329285477907571939330603772960859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158735432768888680120399882384702151467605445407663535984174430480128938313896881639487469658817504506926365338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Ты, конечно, можешь использовать FPU, но ИМХО это совсем не то что от тебя хотят. С FPU ты получишь примерно такой ответ: Код (Text): 1.2201368259911E+МНОГО согласись, потеря в кол-ве значащих цифр заметна. Тебе нужно реализовать перемножение числел произвольного размера — т.е. таких, которые выходят за рамки разрядной сетки CPU. Делается это совсем не сложно и не страшно — почти как умножение в столбик. http://courses.ece.uiuc.edu/ece390/books/artofasm/CH09/CH09-4.html
спасибо огромное, но в принципе я учюсь в техноре там и с потерей значащих сойдёт. спасибо за ссылку...
посмотрите пожалуйста я тут кое чо накатал (чёртичё), сам смысл таков (насчёт 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 это я не дописал...
Эту тему многократно поднимали, в том числе и я Вот до чего я пока дошёл: Код (Text): format PE console include 'win32axp.inc' .data dllka db 'msvcrt.dll',0 name1 db 'scanf',0 scanf dd ? name2 db 'printf',0 printf dd ? inp db 'Input N:',0 d db '%d',0 d4 db '%04d',0 crlf db 13,10,0 N dd ? len dd 1 pstack dd ? array dw ? .code fuck: invoke GlobalAlloc,GPTR,2000000 mov bx,word[eax] mov [array],bx inc [array] invoke LoadLibrary,dllka push eax invoke GetProcAddress,eax,name1 mov [scanf],eax pop eax invoke GetProcAddress,eax,name2 mov [printf],eax cinvoke printf,inp cinvoke scanf,d,N mov ebx,[N] test ebx,ebx jl konets mov [pstack],esp xor edi,edi xor esi,esi xor eax,eax xor esp,esp inc edi inc esi mov esp,2710h cmp ebx,esi jb mtk1 mtk0: xor ecx,ecx mtk: movzx edx,word [array+ecx*2] imul edx,esi add eax,edx xor edx,edx div esp mov word[array+ecx*2],dx inc ecx cmp ecx,edi jb mtk test eax,eax jnz mtk inc esi cmp esi,ebx mov edi,ecx jbe mtk0 mtk1: mov esp,[pstack] movzx eax,word [array-2+edi*2] cinvoke printf,d,eax dec edi jz konets mtk2: dec edi movzx ecx,word[array+edi*2] cinvoke printf,d4,ecx test edi,edi jnz mtk2 konets: cinvoke printf,crlf invoke ExitProcess,0 .end fuck
А с помощью сопроцессора, пусть и с потерей значащих сыфорок, не как не получится чтоли? А если получится то как вывести на экран содержимое регистра стека FPU st(1)?
2 KeSqueer Этому бреду аосвящена соседняя темка Знаю, что бред - но работает же! Хотя сам вижу там, глюки и думаю, как их пофиксить Факториал 500 вычислит... и даже 1000... а на 100000 запарывается А статический массив и для больших чисел рулит... Косячу где-то...