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 x dq 0.000001 xmax dq 2.0 xdelta dq 0.01 mulone dq 1.0 prev dq 0.0 sum dq 0.0 one dq 1.0 two dq 2.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: movsd xmm0, [x] ; получаем с помощью библиотеки libm mov eax, 1 ; значение функции call log ; ln(x) movq rax, xmm0 ; и кладём mov [res], rax ; в переменную res mov rax, 1 mov [n], rax ; n = 1 mov rax, 3 mov [dnp1], rax ; dnp1 = 3 fld qword [x] fsub qword [one] ; st1 = (x-1) fld qword [x] fadd qword [one] ; st0 = (x+1) fdivp ; st1 = (x-1) / (x+1), st(0) popped fst qword [sum] ; (x-1)/(x+1) кладём в sum fmul st0, st0 ; st0 = ((x-1)/(x+1))^2 fstp qword [mulone] ; => mulone fld qword [sum] fld qword [two] fmulp ; sum *= 2 fld qword [sum] ; prev loop1: ; st1: sum ; st0: prev fld qword [mulone] fmulp ; st1 = prev * mulone, st0 popped fst qword [prev] fld qword [two] fild qword [dnp1] ; 2*N+1 ; st3: sum ; st2: prev ; st1: 2 ; st0: 2*N+1 fdivp ; st1 = 2 / (2*N+1), st0 popped fmulp ; st1 = prev * mulone * 2/(2*N+1), st0 popped faddp ; st1 = sum + prev, st0 popped ;fst qword [tmp] ;movsd xmm0, [tmp] ;mov rdi, dbg ;mov rax, 1 ;call printf 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 mov rax, qword [dnp1] add rax, 2 mov qword [dnp1], rax jmp loop1 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