пролог в фасме-исправляем макрос

Тема в разделе "WASM.ASSEMBLER", создана пользователем doctor_Ice, 23 апр 2007.

  1. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    proc32.inc

    Код (Text):
    1. macro prologuedef procname,flag,parmbytes,localbytes,reglist
    2.  { if parmbytes | localbytes
    3.     push ebp
    4.     mov ebp,esp
    5.     if localbytes
    6.        if localbytes>4095
    7.        mov eax, localbytes
    8.      call __chkstk    
    9.        else            
    10.      sub esp,localbytes
    11.      end if
    12.     end if
    13.    end if
    14.    irps reg, reglist \{ push reg \} }
    это рекомендую положить гдето в теле своего кода

    Код (Text):
    1. __chkstk:                                                                       ; sub_401528+8p ...
    2.                 push    ecx
    3.                 lea     ecx, [esp+4]
    4.                 sub     ecx, eax
    5.                 sbb     eax, eax
    6.                 not     eax
    7.                 and     ecx, eax
    8.                 mov     eax, esp
    9.                 and     eax, 0FFFFF000h
    10.  
    11. .loc_401014:                             ; CODE XREF: sub_401000+29j
    12.                 cmp     ecx, eax
    13.                 jb      .loc_401022
    14.                 mov     eax, ecx
    15.                 pop     ecx
    16.                 xchg    eax, esp
    17.                 mov     eax, [eax]
    18.                 mov     [esp+0], eax
    19.                 retn
    20. ; ---------------------------------------------------------------------------
    21.  
    22. .loc_401022:                             ; CODE XREF: sub_401000+16j
    23.                 sub     eax, 1000h
    24.                 test    [eax], eax
    25.                 jmp     .loc_401014
    при желании можно в тот же инк всунуть но тогда фасм сорудит лишнюю секцию....хотя смотря где инклуды сидят....
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    doctor_Ice
    Код (Text):
    1. macro chkstk_impl {
    2.   __chkstk:
    3.  .. orig chkstk code
    4.  }
    Так проще вставлять куски кода в любое место. Опять же - стандартный макрос лучше не трогать, а просто переопределить его, вызвав оригинальный по надобности.
     
  3. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    а верно. и не будет проблем с обновлением фасма. может кто то на форуме фасма запостит про этот недочет и в следующей версии глядиш исправят.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Я бы не назвал это недочётом - редко когда надо выделять больше страницы на стеке, а стандартный chkstk слишком избыточен - можно и поменьше написать. И оформить как отдельный макрос или параметр к объявлению подпрограммы.
     
  5. doctor_Ice

    doctor_Ice New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    845
    Адрес:
    Russia
    и всетаки отсутствие проверки недочет (проверка происходит в макре и на размере компелируемого кода не скажется)...а чек стем мона и получше написать что вообщем не очень важно. а вот важно то что некоторые кодеры даже незнают зачем это нада и редко но найдется чел у которого нестабильно работет прога а он никак не может раздуплится почему. я лично думаю что в проверке больше пользы чем зла =)
     
  6. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    А можно просто директиву stack использовать с желаемым р-ром.