Malloc в masm32.lib

Тема в разделе "WASM.ASSEMBLER", создана пользователем Booster, 30 июл 2005.

  1. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Всем доброго кодинга.

    Писал тут одну тулзень. Залез в Help к masm32.lib в пакете Masm8. Вижу описание Malloc. Но самой функи в библе почему-то не оказалось. А есть неописанная Alloc. C точно таким же единственным параметром. И обе IMHO работают с кучей. Это что описка или замена? Если замена, то для чего?



    З.Ы. В устаревших её тоже нет.
     
  2. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    В macro/macros.asm есть alloc$ и т.п. Попробуй их.
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Возможно это рудимент. Исходники masm32.lib лежат в \masm32\M32LIB



    IMHO, лучше отказаться от использования M32LIB. Периодически в ней обнаруживаются баги, которые никто не спешит исправлять. К тому же, опять же IMHO, нет там ничего такого без чего нельзя обойтись.



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


    Код (Text):
    1. .code
    2.  
    3. malloc proc dwBytes:DWORD
    4. ; allocates dwBytes from current process's heap
    5. ; and returns pointer to allocated memory block.
    6. ; HeapAlloc(GetProcessHeap(), 0, dwBytes)
    7.  
    8. option PROLOGUE:NONE
    9. option EPILOGUE:NONE
    10.  
    11.     invoke GetProcessHeap
    12.     invoke HeapAlloc, eax, 0, [esp+4]
    13.     ret (sizeof DWORD)
    14.  
    15. option PROLOGUE:PROLOGUEDEF
    16. option EPILOGUE:EPILOGUEDEF
    17.  
    18. malloc endp
    19.  
    20. free proc lpMem:LPVOID
    21. ; frees memory block allocated from current process's heap
    22. ; HeapFree(GetProcessHead(), 0, lpMem)
    23.  
    24. option PROLOGUE:NONE
    25. option EPILOGUE:NONE
    26.  
    27.     invoke GetProcessHeap
    28.     invoke HeapFree, eax, 0, [esp+4]
    29.     ret (sizeof LPVOID)
    30.  
    31. option PROLOGUE:PROLOGUEDEF
    32. option EPILOGUE:EPILOGUEDEF
    33.  
    34. free endp
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Four-F

    Скорее всего, это не даст оптимизации, а может даже дать обратный эффект.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Four-F



    А я то думал что masm32.lib это один из козырей масма. Жаль конечно, что на неё забили.8-(

    Может создадим свою wasm_masm32.lib? 8-)
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ AsmGuru62</font><!--color--><font color="gray]: Скорее всего, это не даст оптимизации, а может даже дать обратный эффект. ]</font><!--color-->



    Очень может быть. Я как-то не зацикливался. Т.к. GetProcessHeap - это всего лишь три mov'a (по крайней мере под NT+), то я и не стал париться.
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Booster

    > "А есть неописанная Alloc. C точно таким же единственным параметром. И обе IMHO работают с кучей"



    Описание см.в исходниках. На самом деле есть функция Alloc (из Alloc.asm) и макрос alloc (macros.asm). И то и другое - имхо фигня, т.к. Alloc работает через интерфейс ole32.CoGetMalloc, а alloc вызывает GlobalAlloc, которую сами микрософты не рекомендуют использовать. Так что пиши макрос или функцию с HeapAlloc и глобальной переменной для GetProcessHeap и наслаждайся ;) Ну или плюнь на это дело :))