Изменение пролога в masm32

Тема в разделе "WASM.ASSEMBLER", создана пользователем MSoft, 3 апр 2009.

  1. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Приветствую.
    Масм, выделяя в стеке место под переменные, пишет код add esp,-xxx. Возможно ли задать ему какую-либо опцию, чтобы место выделялось как sub esp,xxx? Прописывание такого руками просьба не предлагать, иначе замучаюсь с обращениями к переменным.
     
  2. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    имхо маловероятно.
    можно например после компиляции пробегать по бинарнику, искать по сигнатуре такой пролог, менять опкод и знак операнда.
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а чем вам не угодил add esp, -xxx (хотя могу предположить что длиной, но вообще-то странно
    Код (Text):
    1. 0x83 0xC4 -0xXX - add esp, -0xXX
    2. 0x83 0xEC 0xXX - sub esp, 0xXX
    )
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    нет, не длиной
    скажем так, просто надо :)
     
  5. BlackParrot

    BlackParrot New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2009
    Сообщения:
    163
    Юзать альтернативные макросы.
    Код (Text):
    1.   ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    2.     ;
    3.     ; MASM Stack Probing PROLOGUE macro
    4.     ; by chep, 2005/07/04
    5.     ;
    6.     ; Parameter bytes stored in ML equate added by Zooba, 02/01/2006
    7.     ; Stack frame always created for Assert compatibility, 25/06/2006
    8.     ; Renamed ASMRTPrologue by Zooba, 25/06/2006
    9.     ;
    10.     ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    11.    
    12.     ASMRTPrologue MACRO procname, flags, argbytes, localbytes, reglist, userparms:VARARG
    13.       LOCAL parm, reg, probe, max_probe, line, page_size, unrolled, @rolled
    14.       ;; Memory page size, can be changed for other architectures
    15.       page_size = 4096
    16.       ;; Use unrolled probing by default
    17.       unrolled = 1
    18.       ;; Don't force a stack frame unless told to
    19.       forceframe = 0
    20.       ;; Throw an error if not in FLAT model, because stack probing is irrelevant otherwise
    21.       IF @Model NE 7
    22.         line TEXTEQU %@Line
    23.         % ECHO @FileCur(line) : STACKPROBE prologue ERROR: stack probing is irrelevant if not using FLAT model
    24.         .ERR
    25.         EXITM <1>
    26.       ENDIF
    27.       ;; Detect macro arguments, give a warning if unknown argument
    28.       IFNB <userparms>
    29.         FOR parm,<userparms>
    30.           IFIDNI <parm>,<ROLLED>
    31.             unrolled = 0
    32.           ELSEIFIDNI <parm>,<FORCEFRAME>
    33.             forceframe = 1
    34.           ELSE
    35.             line TEXTEQU %@Line
    36.             % ECHO @FileCur(line) : STACKPROBE prologue warning: unknown prologue argument : parm
    37.           ENDIF
    38.         ENDM
    39.       ENDIF
    40.    
    41.       parameter_bytes = -1
    42.       IF localbytes GT 0
    43.         ;; Set up stack frame
    44.         push ebp
    45.         mov  ebp, esp
    46.        
    47.         max_probe = (localbytes+page_size-1) AND (-page_size) ;; round up to next page size
    48.         IF localbytes LT page_size
    49.           ;; Normal stack frame, no probing
    50.           add  esp, (-localbytes)
    51.         ELSEIF unrolled
    52.           ;; Unrolled stack probing
    53.           probe = page_size
    54.           WHILE probe LE max_probe
    55.             ;; Probe stack
    56.             mov  DWORD PTR [ebp-probe], eax
    57.             probe = probe + page_size
    58.           ENDM
    59.           add  esp, (-localbytes)
    60.         ELSE
    61.           ;; Rolled stack probing
    62.           add  ebp, (-max_probe)
    63.         @rolled:
    64.           mov  DWORD PTR [ebp], eax
    65.           add  ebp, page_size
    66.           cmp  ebp, esp
    67.           jne  @rolled
    68.           add  esp, (-localbytes)
    69.         ENDIF
    70.         parameter_bytes = argbytes
    71.       ELSEIF argbytes GT 0
    72.         ;; Set up stack frame
    73.         push ebp            ; this code gets executed instead of the next block
    74.         mov  ebp, esp
    75.         parameter_bytes = argbytes
    76.       ELSEIF forceframe NE 0
    77.         push ebp             ; this code never gets executed
    78.         mov  ebp, esp
    79.         parameter_bytes = argbytes
    80.       ENDIF
    81.    
    82.       ;; USES clause
    83.       IFNB <reglist>
    84.         FOR reg,reglist
    85.           push reg
    86.         ENDM
    87.       ENDIF
    88.      
    89.       EXITM <0>
    90.     ENDM