· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Оптимизация под WIN32

Посл.отвђт Сообщенiе


Дата: Май 26, 2003 09:48:40

Как сделать так, чтобы MASM заменял команды PUSH BP / MOV BP,SP / ADD SP,-LOCALSIZE на более современную команду ENTER при формировании пролога подпрограммы?


Дата: Май 26, 2003 12:34:53

Совсем заболел? ENTER это старье и раз в двадцать медененней push ebp/mov ebp, esp


Дата: Май 26, 2003 13:38:27

Не, не в двадцать, поменьше... Делал я такое, когда в доках масмовых разбирался.
Макросы не учитывают соглашения о передаче параметров, точнее они считают что всегда STDCALL.
Улучшить их можно анализируя параметр flag.
Вобщем, вся теория описана в главе 7 "Controlling Program Flow", раздел "Generating Prologue and Epilogue Code".

.386
.model flat, stdcall
option casemap:none

option prologue:OWNPROLOGUE
option epilogue:OWNEPILOGUE

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; I N C L U D E F I L E S
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

include \masm32\include\windows.inc

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; M A C R O S
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

OWNPROLOGUE MACRO procname, flag, parmbytes, localbytes, reglist, userparms

echo
echo procedure procname prologue
echo params: parmbytes
echo locals: localbytes
echo used registers: reglist

enter parmbytes, 0

IFNB <reglist>
FOR r, reglist
push r
ENDM
ENDIF
EXITM %parmbytes
ENDM

OWNEPILOGUE MACRO procname, flag, parmbytes, localbytes, reglist, userparms
IFNB <reglist>
FOR r, reglist
pop r
ENDM
ENDIF

leave
ret parmbytes

ENDM

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; C O N S T A N T S
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

.const
szMessage1 db "This proc has one param and no locals.", 0
szMessage2 db "This proc has two params and one local variable.", 0
szCaption db "OwnPrologEpilog.", 0

.code

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; DropMessage1
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

DropMessage1 proc <FORCEFRAME> pszMessage:LPSTR

invoke MessageBox, 0, pszMessage, 0, 0
ret

DropMessage1 endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; DropMessage2
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

DropMessage2 proc <FORCEFRAME> uses esi edi pszMessage:LPSTR, pszCaption:LPSTR

local zero:DWORD

and zero, 0
invoke MessageBox, zero, pszMessage, pszCaption, zero
ret

DropMessage2 endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
; start
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::

start:
invoke DropMessage1, addr szMessage1
invoke DropMessage2, addr szMessage2, addr szCaption
invoke ExitProcess, 0
end start


Дата: Май 27, 2003 17:14:59

Нужно читать документацию на процессоры, а не на MASM.

Например:
http://www.intel.com/design/mobile/manuals/24281603.pdf


Дата: Май 27, 2003 20:46:14 · Поправил: Four-F

Для того, чтобы заставить masm генерировать нестандартный пролог/эпилог нужно читать именно доки по masm. А для того чтобы понять, что enter медленнее чем push/mov/add необязательно тянуть с интела мегабайты инфы, достаточно заглянуть к Агнеру Фогу http://www.agner.org/assem/pentopth.zip


Дата: Май 27, 2003 21:27:10

А если размер кода важнее? в масме есть макросы для замешения стандартных прологов и эпилогов, жаль не помню какие - покопайся в доке по масму. Если я что вспомню - запостю сюда-же...


Дата: Май 27, 2003 21:28:49

Вспомнил: (в доке по масм32)
OPTION EPILOGUE:macroname
Description:
PROLOGUE registers <macroname> as the macro function to be called
when a prologue needs to be generated. EPILOGUE registers
<macroname> as the macro procedure to be called when a RET or IRET
instruction is encountered.
и т.д.

аналогично:
OPTION EPILOGUE:macroname
.........


Дата: Май 27, 2003 21:55:43

А на три постинга выше лень посмотреть?


Дата: Июл 20, 2003 21:34:31

И в чем же тут фокус? Я о большом примере выше.
В обоих случаях код процедуры начинается с ENTER.
Но при компиляции пишет,что да,макросы обнаружены и процесс пошел.
Или компилить нужно хитро?


Дата: Июл 21, 2003 14:22:03

All
Присоединяюсь к Four-F
К чёрту ENTER :)))

Кроме того, вы господа забываете, что очень часто стеквый кадр можно не использовать. (ЭТО ДАЖЕ ЯВУ ЗНАЕТ :))


Дата: Июл 21, 2003 19:28:20

Недавно тоже с этим (прологом и эпилогом) разбирался.
И возникла такая проблема:
если во вновь созданном макросе для пролога, заменить команду push ebp стандартного пролога, на, допустим последовательность:
push ebp
push ebx,
то как учитывать в смещения на параметры, передаваемые процедуре в стеке?
По умолчанию смещение +4 байта, а для двух push нужно +8 байт. Напишите может кто сталкивался и решил.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.094