Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2009, 22:17   #1
Max-R
Пользователь
 
Регистрация: 14.06.2009
Сообщений: 11
По умолчанию Сопроцессор

Здравствуйте. Такой вопрос. Нужно на асме написать прогу для вычисления вот такой формулы: x!=sqrt(2*pi)*exp((x+0.5)*ln(x))*ex p(-x). (Формула Стирлинга). Это можно сделать с помощью сопроцессора, но я только начал что-то понимать в ассемблере. Если у кого-то есть возможность, помогите пожалуйста разобраться, может какие-то примеры посоветуете.

зы. в часности я не понял, есть ли стандартная функция возведения в степень?

Последний раз редактировалось Max-R; 14.06.2009 в 22:21.
Max-R вне форума Ответить с цитированием
Старый 14.06.2009, 22:30   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
есть ли стандартная функция возведения в степень?
Нет стандартной нету. Даю процедурку. Может возводить в отр. и нецелую степень.
Код:
fpower		proc
		; st0=X, st1=Y

		ftst                   ; st0=X=0 ?
		fstsw	ax
		sahf
		jz	@@Zero         ; Да, результат = 0 (CF=NC=0, кстати!)
		mov	bl,ah          ; BL and 1=1 при X<0, 0 при X>0 (исп-ся после получения результата)
		ja	@@PositiveX    ; Если X>0, то никаких проверок нам больше не надо

		fxch                   ; Обмен st0 <-> st1 (st0=Y, st1=X)
		fld	st(0)          ; st2=st1=X, st1=st0=Y, st0=st0=Y
		frndint                ; st0=Round(st0)=Round(Y)
		fcomp                  ; Сраниваем st0 и st1; st0=st1=Y, st1=st2=X, st3=пусто
		fstsw	ax             ; В AH флаг ZF=ZR=1 при целом Y
		sahf                   ; Y целое?
		jnz	@@Error        ; Нет, отрицательные числа нельзя возводить в нецелую степень!

		fld1
		fld1
		fadd                   ; st2=st1=X, st1=st0=Y, st0=2
		fld	st(1)          ; st3=st2=X, st2=st1=Y, st1=st0=2, st0=st1=Y
		fprem                  ; st0=st0 mod st1=Y mod 2
		ftst                   ; st0=0 (Y mod 2=0, т.е. чётное) ?
		fstsw	ax             ; В AH флаг ZF=ZR=1 при чётном Y (CF=NC=0, кстати!)
		fstp	st(0)          ; Удаляем остаток от деления
		fstp	st(0)          ; Удаляем число 2 (st0), st0=st1=Y, st1=st2=X, st2=пусто
		fxch                   ; Обмен st0 <-> st1 (st0=X, st1=Y)
@@PositiveX:
		fabs                   ; st0=|st0|=|X|
		fyl2x                  ; st0 = st1*log2(st0) = Y*log2(|X|)
		fld	st(0)          ; st1=st0
		frndint                ; st0=Round(st0)
		fsub	st(1),st(0)    ; st1=st1-st0
		fld1                   ; st1=st0, st0=1
		fscale                 ; st0=st0*2^st1
		fstp	st(1)          ; Удаляем st1
		fincstp                ; st7=st0, st0=st1
		f2xm1                  ; st0=(2^st0)-1
		fmul	st(0),st(7)    ; st0=st0*st7
		fdecstp                ; st1=st0, st0=st7
		fadd                   ; st0=st0+st1, st0=пусто
		; Результат в st0 !!!

		test	bl,1           ; X<0 ? (CF=NC=0, кстати!)
		jz	@@End          ; Нет, завершаем
		sahf                   ; Y чётное
		jz	@@End          ; Да, завершаем
		fchs                   ; Если X<0, а Y нечётное, то меняем знак результата
@@End:		ret                    ; Выходим!
@@Error:
		fldz                   ; Заносим 0
		fstp	st(1)          ; Удаляем X
		stc                    ; CF=CY=1 - ошибка
@@Zero:
		fstp	st(1)          ; Удаляем Y
		ret                    ; Выходим!

fpower		endp
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 14.06.2009, 22:42   #3
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Код:
Factorial proc uses edi esi ebx n:DWORD
	mov ecx,RegSize    ;в ecx - количество DWORD`ов в числе
	mov edi,R1            ;edi - указатель на число
	xor eax,eax
	rep stosd
	mov esi,n
	mov dword ptr [edi-4],esi
	sub edi,8
	mov ebp,1
	dec esi
	.repeat
		mov ecx,ebp
		xor ebx,ebx
		.repeat
			mov eax,dword ptr [edi+4*ecx]
			mul esi
			add eax,ebx
			adc edx,0
			mov ebx,edx
			mov dword ptr [edi+4*ecx],eax
		.untilcxz
		.if !ZERO?
			mov dword ptr [edi],edx
			.if dword ptr [edi+4*ebp]
				inc ebp
			.endif
			sub edi,4
		.endif
		dec esi
	.until ZERO?
	pop ebx
	pop edi
	pop esi
	pop ebp
	retn 4
Factorial endp
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 15.06.2009, 11:41   #4
Max-R
Пользователь
 
Регистрация: 14.06.2009
Сообщений: 11
По умолчанию

Goodwin98
большое спасибо

MalCer А что это такое? это на масме, да?
Max-R вне форума Ответить с цитированием
Старый 15.06.2009, 13:38   #5
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Цитата:
MalCer А что это такое? это на масме, да?
Это тоже процедура нахождения файториала, только на MASM'е
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 15.06.2009, 14:33   #6
Max-R
Пользователь
 
Регистрация: 14.06.2009
Сообщений: 11
По умолчанию

Цитата:
Сообщение от MalCer Посмотреть сообщение
тоже процедура нахождения файториала
любого или только целого?
Max-R вне форума Ответить с цитированием
Старый 15.06.2009, 15:54   #7
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Для целого
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 16.06.2009, 15:48   #8
Max-R
Пользователь
 
Регистрация: 14.06.2009
Сообщений: 11
По умолчанию

А как вещественные числа на консоль выводить? Вообщем-то только эта проблема осталась

Цитата:
Сообщение от MalCer Посмотреть сообщение
Для целого
Дак в том-то вся фишка гамма-функции, что можно факториалы любых чисел считать

Последний раз редактировалось rpy3uH; 16.06.2009 в 17:38.
Max-R вне форума Ответить с цитированием
Старый 16.06.2009, 17:41   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Max-R Посмотреть сообщение
А как вещественные числа на консоль выводить? Вообщем-то только эта проблема осталась
Вот здесь в конце статьи есть пример того как можно преобразовать вещественное число в строку, или можно заюзать функции из С++ DLL


Цитата:
Сообщение от Max-R Посмотреть сообщение
Дак в том-то вся фишка гамма-функции, что можно факториалы любых чисел считать
Объясни пожалуйста, что такое факториал дробного числа?
rpy3uH вне форума Ответить с цитированием
Старый 16.06.2009, 18:15   #10
Max-R
Пользователь
 
Регистрация: 14.06.2009
Сообщений: 11
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
можно заюзать функции из С++ DLL
А как использовать функции С?

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
Объясни пожалуйста, что такое факториал дробного числа?
Гамма-функция:


Связь с гамма-функцией
Факториал связан с гамма-функцией от целочисленного аргумента соотношением:
n! = Γ(n + 1)
Таким образом, гамма-функцию рассматривают как обобщение факториала для положительных вещественных чисел.

Формула Стирлинга — асимптотическая формула для вычисления факториала:
(с)Вики
Вот эту формулу мне и надо запрограммировать
Max-R вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц