|
|
| Посл.отвђт | Сообщен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 |