Войти
ПрограммированиеФорумОбщее

Ассемблер. Использование действительных чисел

#0
14:26, 3 янв. 2010

В общем, хочется вызвать glVertex3f, хотя бы. Но, даже, если вы не знаете OpenGL, суть не в этом. Суть в том, что она просит в себя действительные числа. Любая попытка вместо 1 передать 1.0 заканчивается этим:

real or BCD number not allowed

Win32. masm.
С real-ом планируется работа и дальше, так что использование glVertex3d - не совет.


#1
14:40, 3 янв. 2010

Вообще-то дробные числа обрабатываются FPU, для чего служит совершенно другой набор инструкций.
Не совсем понимаю, что именно ты делаешь, но попытка записать дробное число, скажем, в регистр AX, ни к чему хорошему не приведет.

#2
14:57, 3 янв. 2010

Функции нужно передавать указатели на представленные по IEEE 754 вещественные числа. Из FPU вещественные числа в таком формате выгружаются fst(p)-ом.
fld1
fstp dword [ptr]
invoke func, ptr ; func(1.0f);

#3
15:31, 3 янв. 2010

Огромное спасибо! Сейчас попробую. Постараюсь отписаться о результатах.

#4
16:33, 3 янв. 2010

petya-kurochkin
> Суть в том, что она просит в себя действительные числа.
ЩИТО? Она просит числа с число с плавающей точкой. Общего конечного представления дейсвительных чисел не существует.

#5
18:04, 3 янв. 2010

petya-kurochkin
> Любая попытка вместо 1 передать 1.0
А как ты ЭТО делаешь?

#6
23:27, 3 янв. 2010

mov eax, 1.0f))

#7
1:06, 4 янв. 2010

Это как бы пора тему перекинуть во флейм.
А автор темы иди учи матчасть, как современные процессоры работают с плавающей точкой (представление, хранение, операции и вычисления).

#8
15:49, 5 янв. 2010

kvakvs
  Link or GTFO

#9
16:08, 5 янв. 2010

kvaks как процессоры работают с числами с плавающей запятой я знаю.
Так вот, числа, с плавающей запятой могут быть в 32-х битном, 64-х битном, и 80-и битном формате. Хранится отдельно дробная часть (та, что после запятой) и степень десятки, на которую умножается эта самая часть. Вот. Самому конвертировать числа некошерно. Хотелось бы заюзать константы. Т.о., что бы ассемблер сам генерировал нужное значение. В конце-концов же: у нас есть десятичные константы, у нас есть двоичные, а есть шестнадцатеричные константы. Мы же не ковертируем значения при помощи калькулятора/бумажки/устно/мысленно, а записываем их в удобном для нас виде. Так почему я не могу записать точно так же действительные числа?

Попутно, kvaks. Почему тема должна быть во флейме?

#10
16:13, 5 янв. 2010
  mov dwX, 0
  fild   DWORD PTR dwX
  fst    DWORD PTR x
  
  mov dwY, 0
  fild  DWORD PTR dwY
  fst   DWORD PTR y
  
  invoke glVertex2f, DWORD PTR x, DWORD PTR y
Пока что решил так. Но это уродство.... Уродство...
#11
16:15, 5 янв. 2010

petya-kurochkin используй FASM.
Либо в примере N21 от Nehe http://nehe.gamedev.net/data/lessons/masm/lesson21.zip есть программка для конвертации.
Ну и самый лучший вариант это разобраться всё таки как работает и написать макрос ;) а может на форуме wasm.ru уже есть, искали ?

#12
16:23, 5 янв. 2010

v_over
Да уже решил использовать FASM. Он действительно лучше. Но этот курсач надо дописать на MASM'е. За советы спасибо. Числа, в принципе-то всё-равно мне надо конвертировать во время исполнения программы, так что разбираться с тем, что на одну часть уходит 23 бита, а на другую 9 я пока не буду (числа, ясен пень, могу не совпадать).

#13
16:48, 5 янв. 2010

Если нужны именно константы - в том же масме, вроде, можно декларировать численные константы с плавающей точкой:
fOne dd 1.0 ; float
fPi dq 3.14159265 ; double

#14
21:01, 5 янв. 2010

petya-kurochkin
> invoke glVertex2f, DWORD PTR x, DWORD PTR y
и правда ерунда какая-то:) call нада использовать и стек руками заполнять, например:

  glVertex2f(2.0f, 3.0f);
002C1415  push        ecx  
002C1416  fld         dword ptr [__real@40400000 (2C580Ch)] 
002C141C  fstp        dword ptr [esp] 
002C141F  push        ecx  
002C1420  fld         dword ptr [__real@40000000 (2C5808h)] 
002C1426  fstp        dword ptr [esp] 
002C1429  call        glVertex2f (2C1122h) 
ПрограммированиеФорумОбщее

Тема в архиве.