OpenGL. Скомпилил в си одну функцию, чтобы посмотреть как передаются параметры: Код (Text): ;;; 1) glOrtho(1.0, 1.0, 1.0, 1.0, 1.0, 1.0): var_30 = qword ptr -30h var_28 = qword ptr -28h var_20 = qword ptr -20h var_18 = qword ptr -18h var_10 = qword ptr -10h var_8 = qword ptr -8 push ebp mov ebp, esp and esp, 0FFFFFFC0h fld1 sub esp, 30h fst [esp+30h+var_8] fst [esp+30h+var_10] fst [esp+30h+var_18] fst [esp+30h+var_20] fst [esp+30h+var_28] fstp [esp+30h+var_30] call ds:glOrtho xor eax, eax mov esp, ebp pop ebp retn ещё разок: Код (Text): ;;; 1) glOrtho(1.0, 1.0, 1.0, 1.0, 1.0, 0.0): var_30 = qword ptr -30h var_28 = qword ptr -28h var_20 = qword ptr -20h var_18 = qword ptr -18h var_10 = qword ptr -10h var_8 = qword ptr -8 push ebp mov ebp, esp and esp, 0FFFFFFC0h fldz sub esp, 30h fstp [esp+30h+var_8] fld1 fst [esp+30h+var_10] fst [esp+30h+var_18] fst [esp+30h+var_20] fst [esp+30h+var_28] fstp [esp+30h+var_30] call ds:glOrtho xor eax, eax mov esp, ebp pop ebp retn endp 1) А теперь расскажите мне - вот зачем выделяется кадр в стеке (30h)? 2)Потом сверху ещё чтото кладётся? fst кладёт одно и тоже? Объясните, пожалуйста, этот трюк поподробней. для танкиста
Таким способом передаются аргументы: размер стека 48 = 6*8 (6 - кол-во аргументов, 8 - размер каждого из них). И аргументы не размещаются "сверху" кадра, а внутри него. Инструкция fst(p) "кладет" в стек функции содержимое вершины ST(0).
ок. я не заметил в листинге. Но зачем несколько раз одно и тоже из вершины в стек копируется? fst ведь не меняет TOP ?
hypers У тебя в первом примере все аргументы равны 1.0, соответственно в ST(0) кладется это значение (инструкцией fld1), которое затем 6 раз размещается внутри кадра, последняя инструкция fstp после размещения "освобождает" ST(0). Во втором примере все аргументы кроме одного равны 1.0, соответственно сначала в ST(0) кладется 0.0 (инструкцией fldz), которое размещается внутри кадра, "освобождается" ST(0), в ST(0) кладется 1.0 и 5 раз размещается внутри кадра...