Текст задания:
- По заданным вещественным числам С и D (C<D) вычислить
D Pi/4
2 -10x
arctg (x)dx + sin(e )dx.
C Pi/2
Интегралы вычислять приближенно по формуле трапеций при n=20 для первого интервала и при n=40 для второго:
b
n-1
f(x)dx·h*[f(a)/2+сумма f(a+ih)+f(b)/2], где h=(b-a)/n.
a i=1
Блок-схема алгоритма программы:
Текст программы на ассемблере:
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 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 |
;//Лабораторная работа №3. Арифметический сопроцессор .386 ;Определение данных data segment use16 eps dd 0.001;//Для вычисление экспоненты x dd 2.0 one dd 1.0; two dd 2.0; four dd 4.0; mten dd -10.0; f dd 0.0;//Для хранения результатов функций ; f1 dd 0.0; ; f2 dd 0.0; z dd 0.0;//результа вычисления экспоненты half dd 0.5;//для хранения константы status1 dw 0;//текущее слово управления status dw 0;//текущее слово управления или состояния C dd 1.0;//нижняя граница интеграла D dd 6.0;//верхняя граница интеграла ;// cl dd 0.0;//счётчик для организации цикла ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;//Для вычисления интеграла a dd 0.0 b dd 0.0 n dd 0.0 h dd 0.0 resint dd 0.0;//для хранения результата интеграла bufint dd 0.0;//буфер для вычисления интеграла i dd 0.0;// для организации цикла n1 dd 20; n2 dd 40; func dw ?;//для хранения адреса функции result dd 0.0;//Для хранения окончательного результата вычисления выражения data ends ; Сегмент кода code segment use16 assume cs:code,ds:data start: mov ax,data ; настроить сегментный mov ds,ax ; регистр DS на данные finit; call exp; fld z; call calculate fld result fninit; mov ah,4ch; int 21h; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;Функция 1 ;;//arctg(x)^2 ;;//Входные данные в x ;;//Выходные данные в f func1 proc fld x; fld one fpatan; fmul st,st(0); fstp f; ret func1 endp; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;Функцмя 2 ;;//sin(e^(-10x)) ;;//Входные данные в x ;//Выходные данные в f func2 proc fld x; fld mten; fmul; ;;;;;;;;;;;;;;;; ;;Теперь возводим e в степень -10*x push x; fstp x; call exp pop x; fld z; fsin; fstp f; ret func2 endp; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;вычисление экспоненты ;;//Входные данные в x ;;//Выходные данные в z exp proc fld x ; загрузить x fldl2e ; загрузить log e fmulp st(1),st(0) ; вычислить y=x*log e fld st(0) ; обpазовать копию y frndint ; окpуглить до целого y1 fsub st(1),st(0) ; выделить дpобную часть fxch ; обменять y2 и y1 f2xm1 ; вычислить 2**(y2)-1 fld1 ; загрузить 1 faddp st(1),st ; вычислить 2**(y2) fscale ; домножить на 2^y1 fstp st(1) ; удалить y1 fstp z ; сохранить результат ret exp endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;ФУНКЦИЯ ВЫЧИСЛЕНИЯ ИНТЕГРАЛА ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;//Входные данные в a(нижняя граница), ;;//b(верхняя граница), func(адрес подинтегральной функции) ;;//n - n в соответствии с лабораторной работой (влияет на ;;//число итераций) ;;//Выходные данные в resint ;;Функция вычисления h (подфункция функции вычисления интеграла) calch proc fld b; fld a; fsub; fild n fdiv ; fstp h; ret calch endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;Функция вычисления интеграла integral proc ;;//Вычисление h=(b-a)/n call calch ;;//Вычисляем f(a)/2; mov eax,a; mov x,eax; call [func]; fld f; fdiv two; fstp resint; ;;//инициализируем цикл mov eax,1; mov i,eax; mloop: fld resint; ;//вычисляем f(a+ih); fild i; fld h; fmul; fadd a; fstp x; call [func]; fld f; ;;//добавляем к resint fadd; ;//умножаем на h и получаем след. fstp resint; ;;;;;;;;;;;;;;; ;;теперь сравниваем st c C и если он больше или равен С, то переход к следующей итерации mov eax,n; dec eax cmp i,eax;//сравниваем i и n-1. Цикл идёт от 1 до n-1 je dalee inc i; jmp mloop; dalee: fld resint; ;;//Вычисляем f(b)/2 mov eax,b; mov x,eax; call [func]; fld f; fdiv two; ;;//Добавляем в resint fadd; fmul h; fstp resint; ret; integral endp; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;calculate функция вычисляет всё, что необходимо в данной лабораторной работе calculate proc ;//Вычисляем первый интеграл mov eax,D; mov b,eax; mov eax,C mov a,eax; mov eax,n1 mov n,eax; mov ax,offset func1; mov func,ax; call integral fld resint; ;//Вычисляем второй интеграл fldpi; fdiv four; fstp b; fldpi; fdiv two; fstp a; mov eax,n2; mov n,eax; mov ax,offset func2; mov func,ax; call integral; fld resint; fadd; fstp result; ret calculate endp; code ends end start |
Результаты контрольных примеров:
№ опыта | D | C | Результат | Ожидаемый результат |
1 | 1 | 0 | 0.2454058… | 0.245406 |
2 | 5.2 | 0 | 6.4776740… | 6.477675 |
3 | 6 | 1 | 7.7823266… | 7.782326 |
Вывод: составленная программа работает верно.