проблемы с вызовом функций

Тема в разделе "WASM.OpenGL", создана пользователем readme, 13 июл 2005.

  1. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    вот в статье http://www.wasm.ru/article.php?article=OpenGLbyTylerDurden

    собственно её сегодня и разбирал идёт такой вызов с помощью макроса glcall gluPerspective,90.0,ratio,0.1,100.0

    тк я программирую на масме с помощию отладчика переделал на invoke gluPerspective,00000000h ,040568000h ,00000000h , 03FF00000h ,09999999Ah ,03FB99999h ,00000000h,040590000h

    проблема как выразить например 90.0 как 00000000h ,040568000h?

    может калькуляторы какие нужны ;)
     
  2. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    и ещё в вызовах допустим 1.0 можно какнибудь использовать? а то приходится их сначала в память сохранять
     
  3. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    MASM не позволяет напрямую использовать float числа в вызовах.

    Я сделал макросы:
    Код (Text):
    1.  
    2. ;---
    3. mv_float EQU mv_ffloat
    4.  
    5. ;-
    6. mv_ffloat MACRO x, y
    7.  mov x, 12345678h
    8.  ORG $-4
    9.  real4 y
    10. ENDM
    11.  
    12. ;---
    13. psh_float MACRO x
    14. LOCAL tx1, x1
    15.  tx1 equ <x>
    16.  x1 SIZESTR tx1
    17.  tx1 SUBSTR tx1, x1, 1
    18.  IFIDNI tx1, <d>
    19.   psh_dfloat x
    20.  ELSE
    21.   psh_ffloat x
    22.  ENDIF
    23. ENDM
    24.  
    25. ;---
    26. psh_ffloat MACRO x
    27. IF $x_float(x)
    28.  db 68h ;push
    29.  real4 x
    30. ELSE
    31.  push PD x
    32. ENDIF
    33. ENDM
    34.  
    35. ;---
    36. psh_dfloat MACRO x
    37. IF $x_float(x)
    38.  real8 x
    39.  ORG $-8
    40.  db 90h, 90h, 90h, 68h ;nop, nop, nop, push
    41.  ORG $+4
    42.  
    43.  db 68h ;push
    44.  real8 x
    45.  ORG $-4
    46.  
    47. ELSE
    48.  nop
    49.  nop
    50.  nop
    51.  nop
    52.  push PD x[4]
    53.  push PD x
    54. ENDIF
    55. ENDM
    56.  




    Можно писать типа

    psh_float 1.0

    или

    psh_float 1.0d ;это уже 64 битное.

    или

    mv_float eax, 5.0



    Соответственно если хочешь использовать invoke, то надо написать свой макрос типа inv_ogl который делает обычный push/ lea eax, .. push eax/psh_float и call ...
     
  4. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Вот тебе конвертер (из nehe брал) если хочешь без макросов, а вообще лучше пиши на fasm :)

    [​IMG] 1981739256__conv.zip
     
  5. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    всем спасибо щас проснусь и буду разбираться ;)
     
  6. cmdprompt

    cmdprompt New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2009
    Сообщения:
    3
    Хочу заметить, что если после такого макроса идёт вызова API функции, то случается трабла, вместо например call gluPerspective компилируется call [00000000h] или вообще мусор вместо адреса. Это всё последствия от ORG $-4, компилятор вычисляет адреса импортируемых функций заранее, а последовательность dq и ORG $-4 сдвигает адрес на 4 байта. поэтому я пользуюсь своим макро
    Код (Text):
    1.    
    2. pushd MACRO Val:REQ
    3.  
    4.     db 0B8h     ; mov eax, imm32
    5.     dq Val
    6.     org $-4
    7.     dq Val
    8.     org $-8
    9.     db 8Dh, 49h, 00h    ; lea ecx, [ecx+0]
    10.     db 068h     ; push imm32
    11.     org $+4     ; [mov eax][1][2][3][4][lea ecx][ecx][0][push][5][6][7][8]
    12.    
    13.     push eax
    14.  
    15. ENDM