· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Очистка стека сопроцессора

Посл.отвђт Сообщенiе


Дата: Дек 16, 2003 16:43:16 · Поправил: vyacheslav

Обязательна ли?

Задача: Вращаем объект (OpenGL), и при достижении угла в 90градусов сбрасываем угол вращения в 0, для инкремента угда вращения используется сопроцессор.

	fld	DWORD PTR Layer_Angle			;Загрузка угла
	fadd	DWORD PTR Layer_Speed			;Инкремент угла
	fcom	DWORD PTR Angle90			;Сравнение с 90.0f
	fstsw	ax
	and	ax,100h					;Просматриваем флаги результатов сопроцессора
	jnz	@@inc_angle				;Если угол менее 90, извлекаем результет
	ffree	st(0)					;В противном случае очищаем стек
	
	xor	eax,eax
	mov	Layer_Angle,eax				;И устанавливаем значение угла вращения в 0
	
	mov	eax,RotateInfo					;В данном случе не принципиальный код
	ROTATECOLORS (ROTATE_LAYER PTR [eax]).ROTATE_COLOR	;сопроцессор не использующий
	invoke	LoadRoteteInfo					;
	
	jmp	@@main_loop
	
	@@inc_angle:
	fstp	DWORD PTR Layer_Angle			;Собственно извлечение

Если пропустить оператор ffree st(0), очищающий верхушку стека, то изобращение моргает, если данная ветвь алгоритма задействована, что явносвидетельствует о каких то сбоях в алгоритмах библиотеки OpenGL

Вопрос: Обязательно ли следить за стеком сопроцессора, и очищать его по завершении испльзования?

Вопрос 2 (наверное лучше новый топик).
как, используя MASM передать в ф-ию float?
invoke glFunction,DWORD PTR 1.2f
выдает ошибку
real or BCD number not allowed


Дата: Дек 16, 2003 17:36:57 · Поправил: Black_mirror

vyacheslav
Сбоев в алгоритмах OpenGL скорее всего нет.
Просто при переполнении стека сопроцессора в нем оказывается "не число". Естественно что при использовании "не числа" происходит всякая лажа. Вообще как-то можно установить чтобы OpenGL сохранял состояние сопроцессора. Что может упростить отладку. Только я не помню как это сделать.
А вообще лучше писать программу так, чтобы при вызове функций OpenGL стек сопроцессора был бы пуст.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072