· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Передача параметров в функции OS с FLOAT

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


Дата: Ноя 14, 2003 12:10:24

Странная тема, но лучше не получилось...

Вопрос:
Во многие (ну, некоторые) функции системы или библиотек типа OpenGL передаются параметры двойной точности (float, они, кажется занимают 8 байт).
В заголовочных файлах встречается такое:
BOOL SomeFunc(FLOAT f);
Asm:
 SomeFunc :DWORD,:DWORD

Разве не имеет никакого значения, сколько было данных было послано в стек? Сразу 8 байт или 4+4?

Хм, кажется не имеет, но разве можно заменить FLOAT двумя DWORD? Если да, то как?


Дата: Ноя 14, 2003 13:14:49 · Поправил: Grenader

Не понял... Какая разница - 8 байт они и в Африке 8 байт. Как их не передавай - хоть 2-мя двордами, хоть 4-мя вордами. А вот как ИНТЕРПРИТИРОВАТЬ эти байты - как два in32, или как float - это уже проблема функции (ну, и немного твоя - надо правильно подготовить флоат). А в стек конечно по 4 байта данные помещаются. (это если push делать. можно ведь написать sub esp, 8h; а потом в movsb... - суть не меняется)


Дата: Ноя 14, 2003 13:24:08

FLOAT двумя DWORD? Если да, то как?
О первом я уже догадался, когда вспомнил, как push работает :) Всё ещё последствия HLL...

Так как интерпретировать? Хотя бы 1.0 в стек загнать?


Дата: Ноя 14, 2003 13:43:16 · Поправил: q_q

IceStudent
.386
...
.data
  o1 REAL4  1.0
  o2 REAL8  1.0
  o3 REAL10 1.0

.code
...
  push dword ptr o1

  push dword ptr o2+4
  push dword ptr o2

  push  word ptr o3+8
  push dword ptr o3+4
  push dword ptr o3
...
Если не .386, то word'ами.
PS asm-код, генерируемый Си'шным компилятором рулит.


Дата: Ноя 14, 2003 13:47:24 · Поправил: Grenader

IceStudent
Для начала надо понять, как представляются числа с плавующей точкой в памяти. Для интел это выглядит так (есть много тонкостей, это один из нескольких форматов):
|s (1 бит) | характерстика q | мантисса M |
Это т.н. "длинный формат" - 64 бита. Пример:
dq 45.46
в памяти: 40 46 c7 ae 14 7a e1 47
(знаковый бит: 0, и т.д.).

Все это гораздо лучше освещено с справочниках и учебниках - но принип общий - знак + мантисса + знак порядка + порядок


Дата: Ноя 14, 2003 22:22:21

q_q
PS asm-код, генерируемый Си'шным компилятором рулит.
для фасма можно написать такой макрос:
macro push_double,value
{
local .low,.high
virtual at 0
dq value
end virtual
load .low dword from 0
load .hight dword from 4
push .high
push .low
}


Дата: Ноя 14, 2003 22:40:51

Grenader
Да, теперь понял! Не всё, но дальше и сам дойду.

Просто литературы мало, только начинаю разживаться, вот и вопросы такие задаю.


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