Инициализация структур в FASM'e при создании

Тема в разделе "WASM.BEGINNERS", создана пользователем Johnikum, 28 окт 2004.

  1. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    Добрый вечер.



    Как в FASM'е инициализировать структуру в коде как это делается в MASM'е:

    .data

    pos POINT <100,100>



    При попытке компиляции

    pos POINT 100,100

    FASM ошибку выдает:

    Fasm выдает ошибку:

    pos POINT 100,100

    error: invalid macro arguments.


    Я так понимаю нужно описывать структуры в виде:
    Код (Text):
    1.  
    2. [b]struc point x,y
    3. {
    4.    .x dw x
    5.    .y dw y
    6. }[/b]
    7.  


    Но ввиду того, что структур много, менять их нет возможности.

    Как это можно решить?



    PS. Заполнять структуры в коде mov'ами не выход.
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Код (Text):
    1. ;===================================================================== ==
    2. На board.flatassembler читал, что свою структуру объявлять примерно так:
    3. ;===================================================================== ==
    4. struc       POINT  x,y {
    5.      .x     dw x
    6.      .y     dw y
    7. }
    8. ;===================================================================== ==
    9. virtual     at 0
    10. POINT       POINT ?,?
    11. sizeof.POINT = $
    12. end         virtual
    13. ;===================================================================== ==
    14. macro       POINT x,y {
    15. local       lbl
    16. lbl         POINT x,y
    17. }
    18. ;===================================================================== ==
    19. Потом можно использовать:
    20. ;===================================================================== ==
    21. pos         POINT 100,100
    22. ;===================================================================== ==
    23. Как по другому, х.з., наверное можно покороче
    24. ;=======================================================================
     
  3. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    В том то и дело, что в этом случае к каждому описанию структуры надо прикручивать список параметров и менять

    .x dd ? на .x dd x .

    Только вот структур много.
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Я тебя понял, мне тоже лишние мувы не нужны, а структур действительно дофига в win32api, на ум пока приходит только:
    Код (Text):
    1. store 100 at pos.x
    2. store 100 at pos.y
    Но всеравно х-ня, я не спец ещё в фасме
     
  5. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    легче всего написать так:

    pos:

    .x dd 100

    .y dd 100



    или оформить в виде макроса

    macro POINT sname,x,y

    {

    sname:

    .x dd x

    .y dd y

    }



    только тогда использовать так POINT pos,100,100
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    >




    IMHO можно написать какой-нить скрипт, который пропарсит стандартные include и приведют все структуры к виду:


    Код (Text):
    1.  
    2. struc point x,y
    3. {
    4.    .x dw x +0
    5.    .y dw y +0
    6. }


    Тогда можно будет использовать их как с параметрами, так и без.
     
  7. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    Так не получится. struc - тоже макрос, пришить ему дополнительные параметры нельзя.
     
  8. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Turkish Почему? Вроде работает
    Код (Text):
    1. ;========================================================
    2. struc      POINT x,y
    3. {
    4.   .x dd x +0
    5.   .y dd y +0
    6. }
    7. ;========================================================
    8. struc      MSGS hwnd,message,wParam,lParam,time,pt.x,pt.y
    9. {
    10.   .hwnd    dd hwnd    +0
    11.   .message dd message +0
    12.   .wParam  dd wParam  +0
    13.   .lParam  dd lParam  +0
    14.   .time    dd time    +0
    15.   .pt      POINT      pt.x,pt.y
    16. }
    17. ;========================================================
    18. wMsg       MSGS 1,2,3,4,5,0Ah,0Bh
    19. ;========================================================
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Да, struc - это тот же макро, значит обрабатывается на стадии препроцессора.

    Например:
    Код (Text):
    1.  
    2. struc      POINT x,y
    3. {
    4.   .x dd x +0
    5.   .y dd y +0
    6. }
    7.  
    8. foo POINT 50,60
    9.  
    10. ;будет преобразовано в
    11.  
    12. foo:
    13.   .x dd 50 +0
    14.   .y dd 60 +0
    15.  
    16.  
    17. bar POINT
    18.  
    19. ;будет преобразовано в
    20.  
    21. bar:
    22.   .x dd  +0
    23.   .y dd  +0
    24.  
     
  10. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Вот такое работает:
    Код (Text):
    1.  
    2. macro initStruc name,[var,size]
    3. {
    4. common
    5. local cu
    6. cu=0
    7. forward
    8. store size var at name+cu
    9. if size eq dword
    10. cu=cu+4
    11. end if
    12. if size eq word
    13. cu=cu+2
    14. end if  
    15. if size eq byte
    16. cu=cu+1
    17. end if  
    18. };initStruc
    19. ;endm
    20.  


    Используем так:
    Код (Text):
    1.  
    2. struc ns
    3. {
    4. .f dd 3
    5. .s db 0
    6. };ns
    7. ;ends
    8.  
    9. newst ns
    10.  
    11. initStruc newst,\
    12.                 12,dword,\
    13.                 15,byte
    14.  


    Набросал и проверил по быстрому, могут быть ошибки, работатьбудет в FASM 1.52 и выше.
     
  11. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    Написал парсер, который преобразовывает структуры к виду
    Код (Text):
    1. struc      POINT x,y
    2. {
    3.   .x dd x +0
    4.   .y dd y +0
    5. }


    Пока правда не обрабатываются вложенные структуры.



    И еще одна неопределенность...

    есть такая структура (просто пример):
    Код (Text):
    1. struc MESS
    2. {
    3.   .szMes  rb 4
    4.   .idMes  dd ?
    5. }




    Если инициализировать такую из описания структуры, то без дополнительного макроса не обойтись.

    Метод:

    message MESS

    store '0123' at message.szMes ; - это тоже не проходит - ругается компилятор



    Если инициализировать так:
    Код (Text):
    1. MESS.message:
    2.    .szMes db '111'
    3.    .idMes dd -1


    то все данные "съедут" - в откомпилированном будет нечто типа:

    31 31 31 FF FF FF FF

    хотя должно было бы быть:

    31 31 31 00 FF FF FF FF



    Я вижу только один способ - оставить все на совесть человека :)), а инициализировать так:
    Код (Text):
    1. struc MESS ,idMes ; - первый параметр опускать
    2. {
    3.   .szMes  rb 4
    4.   .idMes  dd idMes + 0
    5. }
     
  12. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Может быть, так:
    Код (Text):
    1.  
    2. struc MESS Mes,idMes
    3. {
    4. virtual
    5.   .szMes  rb 4
    6. end virtual
    7.   .Mes    dd Mes +0
    8.   .idMes  dd idMes +0
    9. }
    10.  
    11. foo MESS 'wasm',$
    12.  


    или так
    Код (Text):
    1.  
    2. struc MESS Mes,idMes
    3. {
    4.   .Mes    dd Mes +0
    5.   .idMes  dd idMes +0
    6. label .szMes byte at .Mes
    7. }
     
  13. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    4 байта это было образно...

    а если структура такая:
    Код (Text):
    1. struc MESS
    2. {
    3.   .szMes  rb 37     ; (здесь любое число)
    4.   .idMes  dd ?
    5. }


    то как быть? что то я верных вариантов не нашел
     
  14. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    Вот вроде так:
    Код (Text):
    1. macro rs len_field,arg
    2. {
    3.   if len_field eq
    4.      display "ERROR!"
    5.      .ERR
    6.   end if
    7.   local ..len_arg
    8.   local ..arg
    9.   if arg eq
    10.      ..len_arg = 0
    11.      ..arg equ arg
    12.   else
    13.      ..arg equ arg
    14.      virtual at 0
    15.         db ..arg
    16.         ..len_arg = $
    17.      end virtual
    18.   end if
    19.   if ..len_arg > len_field
    20.      display "ERROR!",10
    21.      .ERR
    22.   else
    23.      db ..arg
    24.      rb len_field - ..len_arg
    25.   end if
    26. }
    27. ;Использовать так:
    28. struc MESS Mes,idMes
    29. {
    30.   .Mes:   rs 10,Mes
    31.   .idMes  dd idMes +0
    32. }
    33. foo MESS 'Assembler!',-1


    Только вот как на автомате определить, строка ли имелась ввиду в структуре...
     
  15. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    В аттаче структуры (из стандартного дистрибутива fasm) с добавленной возможностью инициализации.

    Макросы необходимые для этого прилагаются.

    Там же и примеры с пояснениями.



    О возможных ошибках прошу сообщать в этот топ.

    [​IMG] _1017909889__strucs.rar
     
  16. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    а не подскажете, как на ФАСМе объявить массив структур?
    к примеру, как сделать массив из десяти структур

    Код (Text):
    1. struc myStruc
    2. {
    3.    .a dw ?
    4.    .b dw ?
    5. }
     
  17. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    1) massiv: rb 10*sizeof.myStruc
    2) есть оператор dup - может, тоже можно, но я им не пользовался
     
  18. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    а у меня на первый вариант ругается : 'error: undefined symbol'
     
  19. BoMBeR

    BoMBeR New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2007
    Сообщения:
    7
    В Fasm 1.66 для форточек в include/macro есть включаемый файлик ... называется struct.inc.
    Если пользоваться им то структуры объявляются так:

    struct POINT
    x dd ?
    y dd ?
    ends


    а при использовании в программе можно писать:

    p1 POINT 30, 50
    p2 POINT 70, 40


    и т.д. Собственно там все Win32 структуры во включаемых файлах уже объявлены именно через этот макрос и править ничего не нужно ...
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    BoMBeR
    Но массив по-прежнему объявляется через points rb count*sizeof.POINT