надо ли, кому либо из здесь присутствующих макросы для фасме?

Тема в разделе "WASM.ZEN", создана пользователем dead_body, 22 фев 2006.

  1. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    shoo

    вот, вроде должно работать:
    Код (Text):
    1.  
    2. macro   fObject pStruct,StructName,[FieldName,ValueToFill]
    3. {
    4.     common
    5.     if pStruct eqtype eax
    6.         virtual at pStruct
    7.             local ..foo
    8.             pStruct equ ..foo
    9.             pStruct StructName
    10.             restore pStruct
    11.         end virtual
    12.     end if
    13.     forward
    14.     mov [pStruct#.#FieldName],ValueToFill
    15. }
    16.  


    но пока только заполняет.

    я просто незнаю как из макроса определть переменнцю в секции .data,и очень бы хотел узнать.
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    нет, мне не нужны операции в этом макросе, мне нужно на выходе получить просто статический экземпляр структуры.

    типа:
    Код (Text):
    1. macro fObject StructName,[FieldName,ValueToFill]
    2. {
    3. local _base
    4. common
    5. _base = $
    6.   StructName
    7. forvard
    8.   store dword ValueToFill at (_base + StructName.FieldName)
    9. }
    в этом макросе у меня два вопроса:

    1.как заменить дворд на реальную размерность члена

    2.верно ли синтаксически выражение "StructName.FieldName"



    вариант с mov-ами тоже может быть полезен для инициализации структур в рантайме, но в этом случае пока проблем не возникало:
    Код (Text):
    1.     local l_item:LVITEM
    2.     invoke SendMessage,[hWnd],LVM_GETITEMCOUNT,0,0
    3.     mov [l_item.iItem],eax
    4.     mov [l_item.mask],0
    5.     mov [l_item.iSubItem],0
    6.  
    - все и так довольно наглядно
     
  3. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка


    то есть узнвть размер ValueToFill?

    ...

    сейчас спешу надо уходить, но я вроде понял, что надо прийду напишу.
     
  4. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine


    ну да, только точнее размер FieldName: для store нужно ж явно размер указывать (по-моему)
     
  5. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    shoo

    то есть это для определения структуры в секции .data ?
     
  6. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    я имел ввиду прямо на месте - использовать макрос вместо обычного способа задания инициализированных структур. макрос, по идее, должен иметь как раз структуру, которую я представил. просто я не уверен в плане синтаксиса.
     
  7. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Код (Text):
    1. macro fObject StructLabel,StructName,[FieldName,ValueToFill]
    2. {
    3. common
    4.     StructLabel StructName
    5. forward
    6.     store ValueToFill at StructLabel#.#FieldName
    7. }


    должно работать.
     
  8. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    вот может кому то пригодиться, позволяет запись вида:
    Код (Text):
    1.  
    2. mov [MainModuleHandle],<$invoke GetModuleHandle(0)>
    3. mov [result],<$invoke MessageBox(0,0,0,0)>




    как в масме было. делал на скорую руку поэтому могут быть глюки. и пока только с mov, но завтра думаю сделаю и с push :

    push <$invoke GetModuleHandle(0)>

    [​IMG] 103753215__fasm macro addon.7z
     
  9. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
  10. jecxz

    jecxz New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2006
    Сообщения:
    75
    Адрес:
    Brazil
    dead_body

    спасибо, это то, что надо :)
     
  11. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    dead_body

    кажись, работает (еще не смотрел дамп). я только подправил:
    Код (Text):
    1. macro fobject StructName,[FieldName,ValueToFill]
    2. {
    3. common
    4. local StructLabel
    5.     StructLabel StructName
    6. forward
    7.     store ValueToFill at StructLabel#.#FieldName
    8. }
    9.  
    тк, если придется цепочку таких структур объявлять, то присваивать каждой метку мне не улыбается, хотя тут возможны варианты. думаю, макрос будет полезным ;) спасибо, а то мысль старая, а вот руки у меня не доходили до конца разобраться :)
     
  12. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    о да
     
  13. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    принимаем в испытание

    ---

    только лучше так:
    Код (Text):
    1.     dd sizeof.#StructName + 4


    [​IMG] 534707035__fobject.inc
     
  14. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
  15. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    shoo

    всё работает вроде.

    jecxz и всё

    что ещё надо?(а пока пытаюсь сделать:

    invoke MessageBox,0,TA0("text"),TA0("fff"))

    типа макросы Four-F только под фасм.
     
  16. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Код (Text):
    1.  
    2. format PE GUI 4.0
    3.  
    4. include "C:\fasm\INCLUDE\WIN32AX.INC";standart macro + standart include
    5. include "C:\radasm\Fasm\Projects\fasm macro\macro\fasm macro addon.inc";macro addon
    6.  
    7. .code;all strings will be placed after code. macro '.code' was redefined.
    8. __EntryPoint:
    9.     lea eax,[__TA0_StringTable]         ;__TA0_StringTable - label to strings if you need.
    10.     mov edx,$TA0("lap")
    11.     mov eсx,<$invoke MessageBox(0,$TA0("lap"),$TA0("123"),0)>
    12.     push 0
    13.     push $TA0("123")
    14.     push $TA0("lap")
    15.     push 0
    16.     Call [MessageBox]
    17.     ;push 0 eax $TA0("lap") - this is invalid string
    18.     ;because macro redefine 'push' and I don't do normal parse yet :(.
    19.     ret
    20. .end __EntryPoint   ;macro '.end' war redefine, but all
    21.                     ;that was added will be not included in the code.
    22.  
    23.  




    планирую доделать push и сделать

    xchg и другие команды.





    [​IMG] 1272417613__fasm macro.7z
     
  17. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    доделал push и исправил глюк со стеком макроинструкций.

    теперь возможна строка такого вида:
    Код (Text):
    1.  
    2. push eax $TA0("push offset of string") edx ecx


    xchg пока не трогал.

    в планах сделать:
    Код (Text):
    1.  
    2. \\         5Ch            '\'
    3. \0          0             zero byte/word
    4. \a          7             alert (BEL)
    5. \b          8             backspace
    6. \t          9             horizontal tabulation
    7. \n         0Dh, 0Ah       new line
    8. \l         0Ah            line feed
    9. \v         0Bh            verticalal tabulation
    10. \f         0Ch            formfeed
    11. \r         0Dh            carrige return
    12. \=         22h            '"'
    13.  


    то есть слизать всё у Four-F.

    что надо ещё?
     
  18. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
  19. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Есть константы:
    Код (Text):
    1. H1  equ 0x6A09E667
    2. H2  equ 0xBB67AE85
    3. H3  equ 0x3C6EF372
    4. H4  equ 0xA54FF53A
    5. H5  equ 0x510E527F
    6. H6  equ 0x9B05688C
    7. H7  equ 0x1F83D9AB
    8. H8  equ 0x5BE0CD19


    и есть:

    InitHash rd 8



    при работе программы происходит инициализация массива InitHash, простыми действиями:

    mov esi,InitHash

    mov [esi],H1

    add esi,4d

    .. аналогично все 8 констант



    Как наиболее эффективно и наглядно для кода это сделать прибегая к макроинструкциям и директиве повтора repeat?
     
  20. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    хоть я опять не понял, что надо попытаюсь обьяснить что же я понял(а зачем тут repeat?):

    что то в виде такого?:



    ...

    InitVar esi,4,8,H

    ...

    где первое это указатель того куда класть, второе - размер того что класть, третье скольк раз ложить, а 4 - начальный

    кусок имени констант которые будут положены, к нему соответственно будет прибавлено H#1 =>H1,H#2=> H2 и так далее.



    с ассемблируеться это всё примерно так:

    mov dword [esi],H#(номер_цикла+1);H1

    add esi,4

    mov dword [esi],H#(номер_цикла+1);H2

    add esi,4

    ...



    так или нет?

    или синтаксис другой сделать? возможны варианты:

    InitVar(esi,4,8,H)

    InitVar{esi,4,8,H}

    и почти всё остальное.