extern printf extern log extern puts extern scanf section .data ish db "Введите эпсилон: ",0 ishpat db "%lf" err db "Эпсилон введён неверно (e.g. 0.001), e не может быть равен 0",0 border db "===============================================",0 header db "| x | Ряд | Ст. функ | n |",0 fmt db "| %10.6f | %10.6f | %10.6f | %.4d |", 10, 0 dbg db "%f",10,0 x dq 0.1 xmax dq 0.9 xdelta dq 0.01 prev dq 0.0 sum dq 0.0 tmp dq 0.0 aone dq -1.0 one dq 1.0 zero dq 0.0 res dq 0.0 n dq 1 dnp1 dq 1 e dq 0 %macro print_border 0 mov edi, border mov eax, 0 call puts %endmacro section .text global main main: push rbp mov rbp, rsp mov rdi, ish mov rax, 0 call printf mov rdi, ishpat mov rsi, qword e mov rax, 0 call scanf mov rax, qword [e] cmp rax, 0 je error fld qword [e] fabs fstp qword [e] print_border mov rdi, header mov rax, 0 call puts print_border row: fld qword [x] fld qword [one] faddp fstp qword [tmp] ; получаем x+1 и кладём в tmp movsd xmm0, [tmp] ; получаем с помощью библиотеки libm mov eax, 1 ; значение функции call log ; ln(x+1) movq rax, xmm0 ; и кладём mov [res], rax ; в переменную res mov rax, 2 mov [n], rax ; n = 2 fld qword [x] ; sum fld qword [x] ; prev cloop: ; st1: sum ; st0: prev fld qword [aone] ; меняем знак (умножаем на -1) fld qword [x] ; умножаем на нужный знак X fmulp fmulp ; умножаем prev на (-1)^n*X fst qword [prev] fild qword [n] ; делим на N fdivp faddp ; суммируем с суммой fld qword [prev] fld qword [res] ; st2: sum ; st1: prev ; st0: res fsub st2 ; st0 = res-sum fabs ; st0 = |res-sum| fld qword [e] ; st3: sum ; st2: prev ; st1: |res-sum| ; st0: e fcomi st1 ; cmp e, |res-sum| jbe cont ; e <= |res-sum| ; |res-sum| >= e jmp stop cont: fcompp mov rax, qword [n] inc rax mov qword [n], rax jmp cloop stop: fcompp fstp qword [sum] ; sum = prev fstp qword [sum] ; sum = sum movsd xmm2, xmm0 movsd xmm0, [x] movsd xmm1, [sum] mov rdi, fmt mov rsi, qword [n] mov rax, 3 call printf print_border fld qword [xmax] fld qword [x] fadd qword [xdelta] fst qword [x] fcomi st1 jbe next jmp exit next: fcompp jmp row error: mov rdi, err mov rax, 0 call puts exit: mov rax,0 ret