|
|
| Посл.отвђт | Сообщен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 |