Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Выдается NAN после нескольких циклов


Автор: krasgames 2.10.2011, 07:08
Код
.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

Автор: Kaimi 2.10.2011, 12:42
Видимо проблема со стеком 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. 


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

Автор: Kaimi 2.10.2011, 14:52
Пишешь ведь на masm, воспользуйся fpulib, в ней есть методы для вывода дробных чисел из FPU, например, в строку.
Да и сорцы открыты.

Автор: 586 7.10.2011, 00:36
Код
.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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)