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

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

  1. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Видишь константы?



    В итоге надо написать че нить вроде этого:
    Код (Text):
    1. macro inHash count
    2. {
    3.     mov dword[esi],H#count
    4.     add esi,4d
    5. }
    6. repeat 8
    7.     inHash %
    8. end repeat




    чтобы в итоге:
    Код (Text):
    1. mov dword[esi],H1
    2. add esi,4d
    3. mov dword[esi],H2
    4. add esi,4d
    5. mov dword[esi],H3
    6. add esi,4d
    7. mov dword[esi],H4
    8. add esi,4d
    9. mov dword[esi],H5
    10. add esi,4d
    11. mov dword[esi],H6
    12. add esi,4d
    13. mov dword[esi],H7
    14. add esi,4d
    15. mov dword[esi],H8
    16. add esi,4d


    Все понятно?
     
  2. 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"
    5.  
    6. macro movHash WhereToPut,NumberToPut,PartOfName
    7. {
    8.   __NTP = NumberToPut
    9.   while __NTP <> 0
    10.     ttt = PartOfName#'1' + NumberToPut - __NTP
    11.     mov dword [WhereToPut+NumberToPut*4-__NTP*4],ttt
    12.     __NTP = __NTP - 1
    13.   end while
    14. }
    15.  
    16.  
    17. H1 equ 12345678h
    18. H2 equ 22345678h
    19. H3 equ 32345678h
    20. H4 equ 42345678h
    21. H5 equ 52345678h
    22.  
    23. .code
    24. __EntryPoint:
    25.         sub esp,5*4
    26.         mov esi,esp
    27.         movHash esi,5,'H'
    28.         ;mov dword [esi],H1
    29.         ;mov dword [esi+4],H2
    30.         ;...
    31.         add esp,5*4
    32.         ret
    33. .end __EntryPoint  




    то есть макросу movHash передаёться 3 параметра:

    1)куда будет положено

    2)количество повторений

    3)начальное имя хеш констант.



    то есть вы обьявляете не более 9 констант, где отличаеться только последний символ(1-9). то что до этого символа и передаёться макросу как строка.

    макрос будет добавлять к концу это строки от 1 до 9 и использовать в качестве параметра к mov.

    макрос просто формирует строку:

    mov [a+b],c

    a - первый параметр

    b - формируеться в зависимости от количетва заполнений.

    то есть: на первом проходе b = 0,на втором 4, на 3ем - 8 ...

    а кол-во проходов зависит от второго параметра.

    с - это есть третий параметр + 1...9

    первый проход - третий_параметр1;H1

    2 проход - третий_параметр2;H2

    3 проход - третий_параметр3;H3



    или обязательно надо было сделать с

    mov dword [a],h1

    add a,4

    mov dword [a],h2



    если надо можно доделать макрос до такого вида:

    movHash esi,"H(1...20)"

    и код будет таким:

    mov dword [esi],H1

    add esi,4

    mov dword [esi],H2

    add esi,4

    ...

    mov dword [esi],H20

    add esi,4



    тобто второй параметр будет как строка формата.
     
  3. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Hiew:
    Код (Text):
    1. ▓.00401003: C70648310000                 mov         d,[esi],000003148  ---↓ (1)
    2. ▓.00401009: C7460449310000               mov         d,[esi][04],000003149  ---↓
    3. ▓.00401010: C746084A310000               mov         d,[esi][08],00000314A  ---↓
    4. ▓.00401017: C7460C4B310000               mov         d,[esi][0C],00000314B  ---↓
    5. ▓.0040101E: C746104C310000               mov         d,[esi][10],00000314C  ---↓
    6. ▓.00401025: C746144D310000               mov         d,[esi][14],00000314D  ---↓
    7. ░.0040102C: C746184E310000               mov         d,[esi][18],00000314E  ---↓
    8. ░.00401033: C7461C4F310000               mov         d,[esi][1C],00000314F  ---↓
    Подставлены не константы, а вот Базово-индексная рулит!
     
  4. dead_body

    dead_body wasm.ru

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



    тебе нужна директива irp.

    irp val,1,2,3,4_04

    {

    mov dword [esi],H#val

    add esi,4

    }

    will generate:
    Код (Text):
    1.  
    2.   mov dword [esi],H1
    3.   add esi,4
    4.   mov dword [esi],H2
    5.   add esi,4
    6.   mov dword [esi],H3
    7.   add esi,4
    8.   mov dword [esi],H4_04
    9.   add esi,4
    10.  
     
  5. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    dead_body

    Спасибо за помощь, а кстати было бы не плохо иметь макрос подобный тому что ты писал выше, т.е не к виду:



    mov [esi],H#numConst

    add esi,4d



    а к виду:

    mov [esi+0d],H#numConst

    mov [esi+4d,H#numConst



    Код генереровался бы более наглядным и в окне дебугера меньше места занимал! :)))
     
  6. dead_body

    dead_body wasm.ru

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

    хорошо попытаюсь сделать.
     
  7. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Код (Text):
    1.  
    2.        n = 0
    3.        irp value,H0,H1,H2,H3,H4,H5
    4.        {
    5.          mov dword [esi+n],value
    6.          n = n + 4
    7.        }
    8.  


    или надо именно макросом?

    типа:

    ffill dword [esi+],H0,H1,H2,H3,H4,H5

    mov [esi+sizeof.dword*%],H0

    ...

    ?

    этот макрос более сложен, но сделать можно.
     
  8. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    dead_body

    Я изучаю фасм и хотелось бы взглянуть на него со всех сторон, пока с горем пополам читаю английскую доку к нему, плюс S_T_A_S_ че то перевел, но там не все идеально в этой доке, что он перевел.

    Ну так как сумеешь? Не к спеху, а для коллекции макросов
     
  9. Android

    Android New Member

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

    1. Мы динамически загружаем библиотеку и получаем адрес процедуры

    inovke LoadLibrary,addr szDllName

    invoke GetProcAddress,eax,addr szProcName

    mov lpProc,eax



    2. Каким-то образом описываем процедуру Proc (нас интересует кол-во параметров), что-то типа PROTO

    3. Когда вызываем процедуру через макрос, должна осуществляться проверка кол-ва параметров как в invoke, адрес процедуры - lpProc



    мы пишем

    invoke Proc,par1,par2



    в результате должен получиться код

    push par2

    push par1

    call lpProc
     
  10. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Если сравнивать систему макро в масм и фасм какая мощнее?
     
  11. dead_body

    dead_body wasm.ru

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

    к стандартным АПИ есть проверка в WIN32AXP.INC, то наверное можно и так сделать. надо?

    EvilsInterrupt

    сделаю, хорошо.



    они просто разные, и нечего тут растекаться мыслью по тарелке ;)
     
  12. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Мне в проекте на масм надо библиотеки подгружать динамически, неудобно писать call lpProc, макрос написать не проблема а вот проверять колво параметров не знаю как. Может в фасм это как-то предусмотренно.
     
  13. dead_body

    dead_body wasm.ru

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

    я гляну если в фасме нет сделаю, после сна и универа.
     
  14. Privalov

    Privalov New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2004
    Сообщения:
    16
    rept 6 n:0 { mov dword [esi+n*4],H#n }
     
  15. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Privalov

    Спасибо!

    Только можно не rept 6 n:0, а -> rept 6 n {...



    Я толкько сегодня сумел распечатать доку, жаль что на русском нет, для меня было бы продуктивней читать на родном, а не тратить уйму время на инглишь, хоть он и нужный!



    Еще вопрос:

    Я не видел в сорцах, чтобы хотя бы один пример был по написанию драйвера. Наверняка это возможно и на фасм!
     
  16. requiem

    requiem New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2005
    Сообщения:
    71
    EvilsInterrupt

    есть перевод к fasm 1.64, русский...



    Я не видел в сорцах, чтобы хотя бы один пример был по написанию драйвера. Наверняка это возможно и на фасм!


    возможно
     
  17. dead_body

    dead_body wasm.ru

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

    сделай как в fasm\include\pcount\?.inc

    только используй INCLUDE\WIN32AXP.INC




    Код (Text):
    1.  
    2. Proc% = 2;like PROTO :DWORD,DWORD
    3. invoke Proc,par1,par2
    4. invoke Proc,par1;will generate a error.
    5.  


    или тебя этот способ чем - то не устраивает?
     
  18. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    dead_body

    Вот еще вопрос на засыпку:

    Есть массив: InitHash rd 8



    Было бы не плохо его расценивать как(Псевдо):

    InitHash.dd1 = a + InitHash.dd1

    InitHash.dd2 = b + InitHash.dd2



    и так далее, но вот в чем загвозка: - нет 'assume'!



    Один из выход, создать структуру(псевдо):

    InitHash struct dd1,dd2,dd3,dd4,dd5,dd6,dd7,dd8

    {

    .h1 dd dd1

    .h2 dd dd2

    ......

    .h8 dd dd8

    }



    Но это не наглядно, если была бы 'assume' код был бы наглядней!



    Можно ли ее с эмулировать на фасме? было бы неплохо!
     
  19. dead_body

    dead_body wasm.ru

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

    в последней версии(1.65.16) assume есть.
     
  20. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Privalov

    Заметил особенность:
    Код (Text):
    1.     rept 8 n:0 { mov dword[esi+n*4d],H#n } и:
    2. D:\programming\hash\hash.asm [134]:
    3.     rept 8 n:0 { mov dword[esi+n*4d],H#n }
    4. error: undefined symbol.


    А если так:
    Код (Text):
    1.     rept 8 n { mov dword[esi+(n-1)*4d],H#n }


    то все нормально!