Используя разложение в ряд Тейлора найти значение 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы