Помогите танкисту!

Тема в разделе "WASM.OpenGL", создана пользователем hypers, 3 окт 2007.

  1. hypers

    hypers New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    34
    OpenGL.
    Скомпилил в си одну функцию, чтобы посмотреть как передаются параметры:

    Код (Text):
    1. ;;; 1) glOrtho(1.0, 1.0, 1.0, 1.0, 1.0, 1.0):
    2.  
    3. var_30         = qword ptr -30h
    4. var_28         = qword ptr -28h
    5. var_20         = qword ptr -20h
    6. var_18         = qword ptr -18h
    7. var_10         = qword ptr -10h
    8. var_8          = qword ptr -8
    9.  
    10. push    ebp
    11. mov     ebp, esp
    12. and     esp, 0FFFFFFC0h
    13. fld1
    14. sub     esp, 30h
    15. fst     [esp+30h+var_8]
    16. fst     [esp+30h+var_10]
    17. fst     [esp+30h+var_18]
    18. fst     [esp+30h+var_20]
    19. fst     [esp+30h+var_28]
    20. fstp    [esp+30h+var_30]
    21. call    ds:glOrtho
    22. xor     eax, eax
    23. mov     esp, ebp
    24. pop     ebp
    25. retn
    ещё разок:
    Код (Text):
    1. ;;; 1) glOrtho(1.0, 1.0, 1.0, 1.0, 1.0, 0.0):
    2. var_30         = qword ptr -30h
    3. var_28         = qword ptr -28h
    4. var_20         = qword ptr -20h
    5. var_18         = qword ptr -18h
    6. var_10         = qword ptr -10h
    7. var_8          = qword ptr -8
    8.  
    9. push    ebp
    10. mov     ebp, esp
    11. and     esp, 0FFFFFFC0h
    12. fldz
    13. sub     esp, 30h
    14. fstp    [esp+30h+var_8]
    15. fld1
    16. fst     [esp+30h+var_10]
    17. fst     [esp+30h+var_18]
    18. fst     [esp+30h+var_20]
    19. fst     [esp+30h+var_28]
    20. fstp    [esp+30h+var_30]
    21. call    ds:glOrtho
    22. xor     eax, eax
    23. mov     esp, ebp
    24. pop     ebp
    25. retn
    26. endp
    1) А теперь расскажите мне - вот зачем выделяется кадр в стеке (30h)?
    2)Потом сверху ещё чтото кладётся? fst кладёт одно и тоже?

    Объясните, пожалуйста, этот трюк поподробней. для танкиста ;)
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Таким способом передаются аргументы: размер стека 48 = 6*8 (6 - кол-во аргументов, 8 - размер каждого из них). И аргументы не размещаются "сверху" кадра, а внутри него.
    Инструкция fst(p) "кладет" в стек функции содержимое вершины ST(0).
     
  3. hypers

    hypers New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    34
    ок. я не заметил в листинге.

    Но зачем несколько раз одно и тоже из вершины в стек копируется? fst ведь не меняет TOP ?
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    hypers
    У тебя в первом примере все аргументы равны 1.0, соответственно в ST(0) кладется это значение (инструкцией fld1), которое затем 6 раз размещается внутри кадра, последняя инструкция fstp после размещения "освобождает" ST(0).
    Во втором примере все аргументы кроме одного равны 1.0, соответственно сначала в ST(0) кладется 0.0 (инструкцией fldz), которое размещается внутри кадра, "освобождается" ST(0), в ST(0) кладется 1.0 и 5 раз размещается внутри кадра...
     
  5. hypers

    hypers New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    34
    Спасибо, crypto!