Используя разложение в ряд Тейлора найти значение sh(x) с заданной точностью - Assembler/TASM
Формулировка задачи:
Помогите пожалуйста!
Вообще не представляю как сделать ввод числа в ассемблер и вывод дробного ответа, с точностью до 5 знака.
Программы ищут sh(x) по формуле Тейлора sh(x)=Σ[k=От 0 до inf] x2k+1/(2k+1)!
Впринципе понимаю костяк и логику, программу написал на С.
Помогите с кодом, обязательно нужно использовать макросы(Я бы и сам был рад процедуры,но задание мешает), впринципе можно даже через дизассемблер прогнать, но это не рекомендуется.
#include "stdafx.h" #include "stdio.h" #include "conio.h" int main() { int x; double helpch=1; double helpzn=1; double help; double otv=0; printf("This programm calculate sh(x).\n"); printf("Enter x.\n"); scanf("%i",&x); for (int i=0; i < 10; i++) { help = 2 * i + 1; for (int j=0; j < help; j++) { helpch = helpch * x; } for (int k=0; k <= help; k++) { if(k!=0) { helpzn = helpzn * k; } } otv = otv + (helpch/helpzn); helpch = 1; helpzn = 1; } printf("Sh(x)= %.5lf",otv); _getch(); return 0; }
.model small .stack 256 .data s1 db 'This programm calculate sh(x).',0ah,0dh,'$' s2 db 'Enter x.',0ah,0dh,'$' s3 db 'Your Sh(x):',0ah,0dh,'$' x db 0 helpch db 0 helpzn db 0 help dw 0 otvet dw 0 ;Должен являться не целым числом .code stepen macro ; Макрос делает 2к+1 и результат в help xor ax,ax;Обнуление xor bx,bx mov bx,cx;Запись счетчика mov ax,2;В ах кладем 2 mul bx;Умножение inc ax;К результату +1 mov help,ax ; Запись в help xor ax,ax;Обнуление xor bx,bx stepen endm chislitel macro ;Макрос возводит х в степень 2к+1 push cx xor ax,ax;Обнуление xor bx,bx mov cx, help ; Степень-это умножение само на себя столько то раз mov bx, 1 ;Потому что умножать на 0 бессмысленно cycl: mov ax,x ;Кладем х в ах mul bx ;Умножаем bx, результат в ах mov bx,ax ;Переписываем результат в bx для дальнейшего умножения loop cycl mov helpch, bx xor ax,ax;Обнуление xor bx,bx pop cx chislitel endm znamenatel macro;Макрос считает факториал 2к+1 push cx xor ax,ax;Обнуление mov cx, help mov ax, 1 ;Потому что умножать на 0 бессмысленно cycll: cmp cx,0 ;Чтобы не умножить на 0 je endcycll mul cx; Умножаем на сх на ах, результат в ах endcycll:; И уменьшаем сх на 1, по сути факториал сmp не позволит умножить на 0 loop cycll mov helpzn, ax xor ax,ax;Обнуление pop cx znamenatel endm start: mov ax,@data mov ds,ax lea dx,s1 mov ah,09h ; Вывод строки int 21h lea dx,s2 mov ah,09h ; Вывод строки int 21h ;Считывание целого числа в x mov cx,10 BigCycl stepen ;Вызов макросов chislitel znamenatel mov ax,helpch ; otvet=otvet+chislitel/znamenatel mov bx,helpzn mul bx mov bx,otvet add bx,ax mov bx,otvet loop Bigcycl ;Вывод дробного числа с точностью до 5 символов после точки end start
Решение задачи: «Используя разложение в ряд Тейлора найти значение sh(x) с заданной точностью»
textual
Листинг программы
.model small .stack 256 .data s1 db 'This programm calculate sh(x).',0ah,0dh,'$' s2 db 'Enter x.',0ah,0dh,'$' s3 db 'Your Sh(x):',0ah,0dh,'$' x dd 0 helpch dd 0 helpzn dd 0 help dd 0 otvet dd 0 ;Должен являться не целым числом .code clearing macro ; Макрос очищает ах и bx xor ax,ax;Обнуление xor bx,bx clearing endm start: mov ax,@data mov ds,ax lea dx,s1 mov ah,09h ; Вывод строки int 21h lea dx,s2 mov ah,09h ; Вывод строки int 21h ;Считывание целого числа в x mov cx,10 BigCycl clearing mov bx,cx;Запись счетчика mov ax,2;В ах кладем 2 mul bx;Умножение inc ax;К результату +1 mov help,ax ; Запись в help clearing push cx clearing mov cx, help ; Степень-это умножение само на себя столько то раз mov bx, 1 ;Потому что умножать на 0 бессмысленно cycl: mov ax,x ;Кладем х в ах mul bx ;Умножаем bx, результат в ах mov bx,ax ;Переписываем результат в bx для дальнейшего умножения loop cycl mov helpch, bx clearing pop cx push cx clearing mov cx, help mov ax, 1 ;Потому что умножать на 0 бессмысленно cycll: cmp cx,0 ;Чтобы не умножить на 0 je endcycll mul cx; Умножаем на сх на ах, результат в ах endcycll:; И уменьшаем сх на 1, по сути факториал сmp не позволит умножить на 0 loop cycll mov helpzn, ax clearing pop cx mov ax,helpch ; otvet=otvet+chislitel/znamenatel mov bx,helpzn mul bx mov bx,otvet add bx,ax mov bx,otvet loop Bigcycl ;Вывод дробного числа с точностью до 5 символов после точки end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д