fasm macro

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 11 ноя 2011.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Код (Text):
    1. include '%fasm%/win64ax.inc'
    2. section '.code' executable
    3. start:
    4.         sub rsp,8
    5.  
    6.         mov [lpFileOp.fFlags],FOF_SILENT + FOF_NOCONFIRMATION
    7.  
    8. macro del a {
    9.  
    10.         mov [lpFileOp.wFunc],FO_DELETE
    11.         invoke RtlZeroMemory,x,MAX_PATH
    12.         invoke ExpandEnvironmentStrings,\
    13.         '%ProgramFiles(x86)%\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version\',x,MAX_PATH
    14.         invoke lstrcat,x,a
    15.         mov [lpFileOp.pFrom],x
    16.         invoke SHFileOperation,lpFileOp }
    17.  
    18.         del 'xX'
    19.         del 'zZ'
    20.  
    21.         invoke Sleep,NULL
    22. exit:
    23.         invoke ExitProcess,NULL
    24.  
    25.         FO_DELETE = 3
    26.         FOF_SILENT = 4
    27.         FOF_NOCONFIRMATION = 10h
    28.  
    29. section '.data' readable writeable
    30.  
    31.         x rd MAX_PATH
    32.  
    33. struct SHFILEOPSTRUCT
    34.  
    35.         hwnd dq NULL
    36.         wFunc dq NULL
    37.         pFrom dq NULL
    38.         pTo dq NULL
    39.         fFlags dq NULL
    40.         fAnyOperationsAborted dq NULL
    41.         hNameMappings dq NULL
    42.         lpszProgressTitle dq NULL
    43. ends
    44.         lpFileOp SHFILEOPSTRUCT
    Всёли нормально, что тут оптимизировать можно?
    Всмысле чтобы потом в огромной программе это не конфликтовало с другими переменными..

    Кстати, может лучше вынести из макроса: mov [lpFileOp.wFunc],FO_DELETE
    Я просто как бы привязать хотел определённый флаг к макросу, но с другой стороны
    наверное нет необходимости его инициализировать каждый раз?

    А почему RtlZeroMemory не прописан в импорте kernel.dll и всёравно работает?
    В (RTL) много хорошего но другие функи не работають, к сожалению. А заставить их нельзя?
    Небось в тасме они определены.
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Semiono
    Не всё. Макрос нужно убрать. Вы абсолютно не различаете, когда нужно использовать макросы, а когда процедуры.
    Прописан.
     
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    тоесть макрос заменить на процедуру... хм..
    просто я высказался не так, иначе бы и не работало, но вот жаль что из kernel.lib не достаточно всё прописанно)
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Semiono
    Иначе при каждом обращении к макросу код будет дублироваться, и бинарник будет набит повторяющимися участками кода.
    Чего конкретно не хватает? kernel32 не так уж много Rtl-функций содержит (да и те все в ntdll форвардит). Сомневаюсь, что под "не достаточно" имеется в виду RtlCaptureStackBackTrace.
     
  5. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    1. Понятно! Спасибо!
    2. Не уверен, я мало функций знаю и всё что нравиться собираю. Порой хламу много.
    Мне вот Strsafe Functions тоже понравились, и тоже облом Strsafe.h :)

    Да вот посмотрел, там в RTL много строковых функций тоже, мнеб не помешало :)


    Изначально у меня код просто дублировался прямо без макроса )))

    Обажаю RtlZeroMemory!
    Теперь можно вообще одну переменную гонять по всему коду, это то что я давно искал.
    invoke RtlZeroMemory,x,MAX_PATH
    Или это не совсем хорошо? Думаю нормально!

    С макросами и RtlZeroMemory,x код на 90% уменьшился! Класс! :lol:
    Попробую ещё на процедуры заменить.
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Semiono
    В ntdll есть много чего для работы со строками. А так это сишный рантайм, конечно, представленный в самой strsafe.h.
    Уже в третий раз линкую здесь этот сайт. Если чего-то не хватает в официальной поставке, то имеет смысл посмотреть там.