Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 22.09.2017
Сообщений: 65
1

Вычисление показательной функции (Ассемблерные вставки с++)

20.12.2017, 19:25. Просмотров 1595. Ответов 1
Метки нет (Все метки)


Привет!
Подскажите как это можно реализовать в ассемблерскую вставку
C++
1
2
for(int i=0; i<=10; i++);
mas[i] = 2 * (pow(2, i));
Добавлено через 14 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    setlocale(0, "");
    double a, b;
    cout << "Возведения числа в степень:)" << endl;
    cout << "Пример: 5^2" << endl;
    cout << "Введите число: " << endl;
    cin >> a;
    cout << "Введите степень: " << endl;
    cin >> b;
    cout << "Ваш ответ = " << pow(a,b) << endl;
 
    return 0;
}
точнее это
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2017, 19:25
Ответы с готовыми решениями:

Сопроцессор. Вычисление показательной функции.
Здравствуйте, у меня вопрос. Как с использованием функций сопроцессора (среда MASM, семейство x86))...

Вычисление суммы ряда (ассемблерные вставки)
Вычислить сумму ряда \sum_{k=1}^{n}(2k-1), (n \leq 10), используя ассемблерные вставки. Проблема в...

Вычисление показательной комплексной функции
Преподаватель попросил меня вычислить e^2Пi и показать ему именно вычисления. В интернете я нашел...

Ассемблерные вставки в C++
Собственно сабж ...: Имею следующий код : short Carry = 2; unsigned short Mas; Mas = 12;...

1
Модератор
Эксперт по электронике
7476 / 3677 / 1444
Регистрация: 01.02.2015
Сообщений: 11,454
Записей в блоге: 2
20.12.2017, 21:02 2
Лучший ответ Сообщение было отмечено VipHack как решение

Решение

Наверное, так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
double res;
__asm{
        ;перед началом работы очищаем стек FPU
        finit
        ;в вершину стека помещаем аргумент функции
        fld     [a]
    fld [b]
    ;вычисление функции
    fxch    st(1)       ; st(0)=a   st(1)=x
 
        fldln2                  ; st(0)=ln(2)   st(1)=a     st(2)=x
        fxch    st(1)           ; st(0)=a   st(1)=ln(2) st(2)=x
        fyl2x                   ; st(0)=log2(a)*ln(2)=ln(a) st(1)=x
 
    fmulp   st(1),  st(0)   ; st(0)=x*ln(a)=B
 
        fldl2e                  ;st(0)=1/ln(2)=log2(e)
        fmul                    ;st(0)=B/ln(2)=B*log2(e)
        fld     st
        frndint
        fsub    st(1), st
        fxch    st(1)
        f2xm1
        fld1
        fadd
        fscale
        fstp    st(1)
        fstp    res
}
    cout << "Ваш ответ = " << res << endl;
Только переведите комментарии под стандарт языка С. Я его не знаю и проверял на чистом ассемблере.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
.486
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        A               dq      7.4
        Xstart          dq      4.0     ;начальное значение аргумента
        Xfinish         dq      5.0     ;конечное значение аргумента
        N               dd      10      ;количество интервалов интегрирования
 
        aszMsgResult    db      13, 10, 'Result: ', 0
        aszPressLeftAlt db      0Dh, 0Ah, 0Dh, 0Ah, "Press Left Alt to exit", 0
        dwColorRed      dd      FOREGROUND_RED
        dwColorWhite    dd      FOREGROUND_RED + FOREGROUND_GREEN + FOREGROUND_BLUE
        dwCursorPosition        COORD   <20, 10>
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        X               dq      ?       ;текущее значение аргумента
        DeltaX          dq      ?       ;шаг приращения аргумента
        Result          dq      ?       ;результат - значение интеграла
        FpuSw           dw      ?       ;слово состояния FPU (для команд сравнения)
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
 
.code
 
start   proc
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
        ;очистка экрана
        invoke  ClearScreen
 
        finit
        ;получим Xstart
        fld     [Xstart]
        ;вычислим Xfinish
        fld     [Xfinish]
        ;вычисление приращения аргумента DeltaX
        fld     [Xfinish]
        fsub    st(0),  st(2)
        fild    [N]
        fdivp   st(1),  st(0)
        fst     [DeltaX]
        ;
        fxch    st(2)
 
        ;st(0)  - X
        ;st(1)  - Xfinish
        ;st(2)  - DeltaX
        mov     ecx,    [N]
        inc     ecx
        @@for:
                fld     [A]
                fld     st(1)
                call    pow
                fstp    [Result]
 
                fadd    st(0),  st(2)
 
                ; - вывод
                pushad
                invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                        LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
                invoke  FloatToStr2, [Result], ADDR Buffer
                invoke  StrLen, ADDR Buffer
                mov     [BufLen],       eax
                invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                        BufLen, ADDR BufLen, NULL
                popad
        loop    @@for
 
 
        ;ожидание нажатия Left Alt
        invoke  SetConsoleTextAttribute, hConsoleOutput, [dwColorWhite]
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressLeftAlt,\
                LENGTHOF aszPressLeftAlt - 1, ADDR BufLen, NULL
        @@WaitForLAlt:
                invoke  GetAsyncKeyState, VK_LMENU
                and     eax,    8000h
        jz      @@WaitForLAlt
        ;завершение программы
        invoke  ExitProcess, 0
start   endp
 
;Показательная функция f=a^x
;на входе:
;  st(0) - значение аргумента x
;  st(1) - значение аргумента a
;на выходе:
;  st(0) - значение показательной функции
;Способ вычисления
;f=a^x=exp(ln(a^x))=exp(x*ln(a))
pow     proc
        LOCAL   @StateFPU[108]:byte     ;108 use32, 94 use16
        LOCAL   @X:QWord
        LOCAL   @A:QWord
        LOCAL   @Result:QWord
        ;перед очисткой стека FPU сохраним:
        fstp    [@X]            ; вершину стека (аргумент функции)
        fstp    [@A]            ; вершину стека (аргумент функции)
        fsave   [@StateFPU]     ; состояние FPU
        ;перед началом работы очищаем стек FPU
        finit
        ;в вершину стека помещаем аргумент функции
        fld     [@A]
        fld     [@X]
        ;вычисление функции
        fxch    st(1)           ; st(0)=a       st(1)=x
 
        fldln2                  ; st(0)=ln(2)   st(1)=a         st(2)=x
        fxch    st(1)           ; st(0)=a       st(1)=ln(2)     st(2)=x
        fyl2x                   ; st(0)=log2(a)*ln(2)=ln(a)     st(1)=x
 
        fmulp   st(1),  st(0)   ; st(0)=x*ln(a)=B
 
        fldl2e                  ;st(0)=1/ln(2)=log2(e)
        fmul                    ;st(0)=B/ln(2)=B*log2(e)
        fld     st
        frndint
        fsub    st(1), st
        fxch    st(1)
        f2xm1
        fld1
        fadd
        fscale
        fstp    st(1)
 
        ;перед восстановлением состояния FPU сохраним результат функции
        fst     [@Result]
        ;восстановление состояния FPU
        frstor  [@StateFPU]
        ;результат вычислений на вершину стека
        fld     [@Result]
 
        ret
pow     endp
 
end start
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2017, 21:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

ассемблерные вставки
Здраствуйте Есть функция X^2+7*X-10 / x^2 - 8*X + 12 ее нужно реализовать в виде ассемблерной...

С++ + Ассемблерные вставки
Помогите с задачей:&quot;Нахождение и отображение смежных групп цифр в числовой последовательности&quot;....

ассемблерные вставки
Здравствуйте. Есть код. Нужно сделать ассемблерные вставки(вставку), если такое возможно. В...

Ассемблерные вставки:(
Есть программа которая В исходную строку вставляет после заданного символа все символы,...

Ассемблерные вставки
1)Всем добрый вечер.Хотелось бы узнать как считать а потом вывести что либо (код должен быть...

Ассемблерные вставки
Здрасти всем.Нужна помощь.Объявления переменных на си,основная логика на ассемблере.Нужно считать с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.