Аргумент функции - структура а не указатель Fasm

Тема в разделе "WASM.BEGINNERS", создана пользователем assorted, 4 фев 2008.

  1. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    столкнулся с такой проблемой, нужно написать функцию, котрая в качестве аргумента принимает саму структуру, а не указатель на нее. Извлеч из стека аргументы - не проблема, хотелось бы красиво оформить макросом proc...
    sizeof.mystruct тоже не помогло. Но уверен выход есть.


    proc myproc xx:WORD, yy:mystruct

    ret
    endp
     
  2. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    assorted
    каков размер структуры?
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    В макросе proc (а точнее, это надо в push) вряд ли можно определить, что это структура. Реализация-то простая:
    Код (Text):
    1. lea  esi,[structvar]
    2. mov edi,esp
    3. mov ecx,sizeof.struct
    4. rep movsb
    5. invoke myproc,xx
     
  4. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    struct mystruct
    xxx dw ?
    yyy dw ?
    ........
    ends

    15 слов.
     
  5. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    IceStudent
    Кажется немножко не то...
    Вызывающий код затолкает мне 15 DWORD в стек (WSPUPCALLTABLE).
    я их могу брать
    lea eax, [structvar]
    [eax+2]
    [eax+4]
    [eax+6]

    вопрос в том как оформить шапку proc и чтобы ret endp мне стек выравнял.
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    assorted
    А, тебе только доставать.. Можно что-нибудь придумать, спроси на форуме фасма, там есть фанаты macro-art'a. В конце концов, локальные переменные могут быть и структурами, значит, можно добавить и в параметры функций.
    А если просто, чтобы заработало - объяви фейковые аргументы, чтобы автоматом стек выравнивался. Например, 6 tbyte'ов, а за ними lpProcTable.
     
  7. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Проверить возможности нет, но можно поправить макросы определяющие структуру и процедуру
    1) В макросе создавать константу типа name.struc=true
    2) В макросе процедуры проверять значение константы name.struc и если она true, то сливать в стек структуру целиком.
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    pas
    Это первое, что приходит в голову. Я так делал перегрузку и вызов локальных функций через invoke. Просто думаю, что могут быть более элегантные решения.
     
  9. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    первое что прешло в голову
    Код (Text):
    1. FORMAT PE GUI 4.0 at 500000h
    2. entry EntryPoint
    3. include '%fasminc%\win32a.inc'
    4. section '.main' code readable writable executable
    5.  
    6. macro xproc name,[arg]                   ;макро определенийа процедуры
    7.  { common
    8.     name:
    9.     virtual at ebp+8
    10.     if ~ arg eq
    11.        forward
    12.        match names-ty, arg
    13.        \{
    14.                 names ty
    15.        \}
    16.        common
    17.     end if
    18.     ..ret = $ - (ebp+8)
    19.     end virtual
    20.  
    21.     local ..dynamic_data,..dynamic_size
    22.     dynamic_data equ ..dynamic_data
    23.     dynamic_size equ ..dynamic_size
    24.     virtual at ebp - dynamic_size
    25.     dynamic_data: }
    26.  
    27. macro enter                             ;макро начала кода в процедуре
    28.  { rb (2 - ($-dynamic_data) and 1b) and 1b
    29.    dynamic_size = $ - dynamic_data
    30.    end virtual
    31.    push ebp
    32.    mov ebp,esp
    33.    sub esp,dynamic_size}
    34.  
    35. macro return                            ;макро возврата
    36.  { leave
    37.    ret ..ret }
    38.  
    39. macro xstdcall proc,[arg]                ;макро вызова
    40.  { reverse
    41.    match name-ty, arg
    42.    \{
    43.         local ..size1
    44.         local ..size2
    45.  
    46.         virtual at esi
    47.                 ..size1 ty
    48.                 ..size2 = $-..size1
    49.         end virtual
    50.         sub  esp,..size2
    51.         pusha
    52.         lea  edi,[esp+20h]
    53.         lea  esi,[name]
    54.         mov  ecx,..size2
    55.         rep  movsb
    56.         popa
    57.    \}
    58.    common
    59.    call proc }
    60.  
    61. ;
    62. ;Описание тестовых структур
    63. ;
    64. struct TEST1
    65.         t1      dd ?
    66.         t2      dd ?
    67. ends
    68.  
    69. struct TEST2
    70.         t       TEST1
    71.         t1      dd ?
    72.         t2      dd ?
    73. ends
    74.  
    75. ;
    76. ;Структуры
    77. ;
    78. s1 TEST1
    79. s2 TEST2
    80.  
    81.  
    82. proc EntryPoint
    83.         ;
    84.         ;тестовые значенийа
    85.         ;
    86.         push    1
    87.         push    2
    88.         pop     [s1.t2]
    89.         pop     [s2.t1]
    90.  
    91.         ;
    92.         ;Вызов процы
    93.         ;
    94.         xstdcall testeng,s1-TEST1,s2-TEST2
    95.         jmp     $
    96. endp
    97.  
    98. ;
    99. ;Проца
    100. ;
    101. xproc testeng,par1-TEST1,par2-TEST2
    102.         lll dd ?;здесь объявляем локальные переменные
    103.      enter
    104.         ;
    105.         ;Попробуем извлечь значенийа из струтуры
    106.         ;
    107.         mov     eax,[par1.t2]
    108.         mov     edx,[par2.t1]
    109.  
    110. ;
    111. ;Выход
    112. ;
    113. return