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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2013, 13:15   #1
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
По умолчанию Сумма ряда

В общем требуется посчитать сумму ряда на ассемблере под DOS



Проверял первую итерацию, работает нормально, а дальше проверить каждую итерацию нет возможности, поэтому смотрю сразу результат и там получается полная ерунда и результат вообще не превышает 1, при любых значения X. Процедура принимает 2 аргумента
st(0) - X
st(1) - epsilon

Прошу помощи в поиске ошибки, сам уже сижу сутки, не могу найти в чем косяк

Код:
math_ln proc near
	enter	18, 0
	pushad
	
	@__mln_result	equ word ptr [bp + 4]
	
	;=======================================
	;	int n;
	;	float addX;
	@__mln_loc_n	equ	word ptr [bp - 2]
	@__mln_loc_addX	equ	dword ptr [bp - 6]
	@__mln_loc_out	equ dword ptr [bp - 10]
	
	@__mln_arg_x	equ dword ptr [bp - 14]
	@__mln_arg_eps	equ dword ptr [bp - 18]
	
	;	load arguments
	FSTP	@__mln_arg_eps
	FSTP	@__mln_arg_x
	
	;=======================================
	;	addX = (x - 1) / x;
	FLD		@__mln_arg_x
	FLD1
	FSUBP	st(1), st
	FLD		@__mln_arg_x
	FDIVP	st(1), st
	FSTP	@__mln_loc_addX
	
	;=======================================
	;	out = 0;
	FLDZ
	;	n = 0;
	mov		@__mln_loc_n, 0
	
	;=======================================
	;	while {
@__mln_while_start:
	;	out = st(0);
		FST		@__mln_loc_out
	
	;	n++;
		inc		@__mln_loc_n
	;	if (n > 10000) break;
		cmp		@__mln_loc_n, 10000
		jg		@__mln_loop_quit
	
	;	st(0) = st(0) + n / (n+1) * addX
		FLD1
		FILD	@__mln_loc_n
		FADDP	st(1), st
		FILD	@__mln_loc_n
		FXCH	st(1)
		FDIVP	st(1), st		
		FLD		@__mln_loc_addX
		FMULP	st(1), st		
		FADDP	st(1), st
		
	;	abs(st(0) - out)
		FLD		@__mln_loc_out	; <- out
		FSUB	st, st(1)		; st(0) = st(1) - st(0)
		FABS					; st(0) = abs(st(0))
	;	... > eps
		FCOM	@__mln_arg_eps		
		FSTSW	ax
		sahf
		jg		@__mln_while_start
		FSTP	@__mln_loc_out
		
	;	} do (abs(st(0) - out) > eps);
	;=======================================
@__mln_loop_quit:
	
	popad
	leave
	ret
endp
alexprey вне форума Ответить с цитированием
Старый 15.03.2013, 22:46   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Могу посоветовать сначала отладить программу на Си/С++, а затем дизассемблировать, когда все работает и оптимизировать. Сам не брезгую таким способом. У вас бросается в глаза
Код:
	FSTSW	ax
		sahf
		jg		@__mln_while_start
Если мне не изменяет память, при таком сравнении используются команды ja/jb/jnb.
http://osinavi.ru/asm/FPUexpansion/5.php
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru

Последний раз редактировалось alexcoder; 15.03.2013 в 22:49.
alexcoder вне форума Ответить с цитированием
Старый 16.03.2013, 13:01   #3
alexprey
Форумчанин
 
Регистрация: 25.05.2010
Сообщений: 169
По умолчанию

Все равно не помогло ((
alexprey вне форума Ответить с цитированием
Старый 18.03.2013, 04:12   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Цитата:
Сообщение от alexprey
Все равно не помогло ((
alexcoder,
прямым текстом "сделайте за меня", неужели не понятно?
Mikl___ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сумма ряда! sermog Помощь студентам 5 08.04.2011 21:54
Сумма ряда Veina Помощь студентам 0 06.04.2011 19:48
сумма ряда [Te[M]ka] Паскаль, Turbo Pascal, PascalABC.NET 5 22.01.2011 17:50
Сумма ряда в С Eovin Общие вопросы C/C++ 14 20.03.2010 12:27
Сумма ряда eKStaSy Помощь студентам 4 25.10.2009 17:41