Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выдается NAN после нескольких циклов 
:(
    Опции темы
krasgames
Дата 2.10.2011, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый мастер
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 4.12.2009

Репутация: нет
Всего: нет



Код
.386                      
      .model flat, stdcall      
      option casemap :none      

      include C:\masm32\include\windows.inc
      include C:\masm32\include\user32.inc
      include C:\masm32\include\kernel32.inc
      includelib C:\masm32\lib\user32.lib
      includelib C:\masm32\lib\kernel32.lib
  .CONST
  .DATA?
  .DATA
u dq 10.0                             
w dq 2000.0
t dq 0.0002
d dq 0.0002
.CODE
start:
m1:
FLD w
FLD t
FMUL ST(0), ST(1)
FCOS
FLD t
FLD d
FADD
FSTP t
jz m1
invoke ExitProcess,0
end start

Комменты, думаю, это уж слишком, но в программе сначала частота перемножается со временем, затем берется cos, а затем увеличивается время на некоторый шаг. Так вот, примерно на 4-м цикле время обращается в NAN! Как такsmile
PM MAIL   Вверх
Kaimi
Дата 2.10.2011, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.10.2011
Где: USA

Репутация: нет
Всего: 1



Видимо проблема со стеком FPU, отсюда и NaN. Обрати внимание на последний абзац:
Цитата

FLD (Load real number)

Syntax:    fld Src

Exception flags: Stack Fault, Invalid operation, Denormalized value

This instruction decrements the TOP register pointer in the Status Word and loads the floating point value from the specified source (Src) in the new TOP data register. The source can be one of the FPU's data registers or the memory address of a REAL4, REAL8, or REAL10 value (see Chap.2 for addressing modes of real numbers).

If the ST(7) data register which would become the new ST(0) is not empty, both a Stack Fault and an Invalid operation exceptions are detected, setting both flags in the Status Word. The TOP register pointer in the Status Word would still be decremented and the new value in ST(0) would be the INDEFINITE NAN. 


PM MAIL WWW ICQ   Вверх
krasgames
Дата 2.10.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый мастер
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 4.12.2009

Репутация: нет
Всего: нет



Да, было переполнение стека. А как вывести вещественное число с сопроцессора? Не очень понял формат числа. Начнем с того, что рассмотрим сопроцессор без всего. Вот в стеке получилось значение косинуса. Теперь нужно подать его на выводы. С целым числом в процессоре понятно - в двоичном виде посылаю 8-битное число, например (16-битное - за 2 цикла и тп). А тут? Отдельно целую часть, отдельно после запятой, отдельно степень?

Это сообщение отредактировал(а) krasgames - 2.10.2011, 12:49
PM MAIL   Вверх
Kaimi
Дата 2.10.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.10.2011
Где: USA

Репутация: нет
Всего: 1



Пишешь ведь на masm, воспользуйся fpulib, в ней есть методы для вывода дробных чисел из FPU, например, в строку.
Да и сорцы открыты.
PM MAIL WWW ICQ   Вверх
586
Дата 7.10.2011, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Код
.386                      
      .model flat, stdcall      
      option casemap :none      
      include C:\masm32\include\windows.inc
      include C:\masm32\include\user32.inc
      include C:\masm32\include\kernel32.inc
      include C:\masm32\include\msvcrt.inc
      includelib C:\masm32\lib\user32.lib
      includelib C:\masm32\lib\kernel32.lib
      includelib C:\masm32\lib\msvcrt.lib
  .CONST
  .DATA?
buf db 128 dup(?)
  .DATA
u dq 10.0                             
w dq 2000.0
t dq 0.0002
d dq 0.0002
fmt db "%f",0
.CODE
start:
m1:
FLD w
FLD t
FMUL ST(0), ST(1)
FCOS
FLD t
FLD d
FADD
FSTP t
jz m1

invoke sprintf, offset buf, offset fmt, t
invoke MessageBoxA, 0, offset buf, 0, 0

invoke ExitProcess,0
end start

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.