Push EBP
Mov EBP,ESP
…
Mov ESP,EBP
Pop EBP
Сохранение регистров в процедуре
У меня небольшой вопрос:я пишу процедуру на асме,в которой используются регистры EBX,ECX и EDX.По стандарту вызываемые процедуры должны сохранять EBX,EDX,EDI и ESI,а про ECX там ни слова.Мне повторить за ними:) и тоже не сохранять ECX?
И ещё кое-что:там ведь должен быть код вида
Код:
Смотри, как ты используешь регистры в том месте, откуда вызываешь процедуру, и, исходя из этого, сохраняй те или иные регистры.
Сщхранение ESP в EBP - дополнительная степень защиты и, кроме того, обычное обрамление для локальных переменных процедуры. Обычно третьей строкой:
ADD ESP, SizeOfLocalVariables
А стандарты я имел в виду не на сам Ассемблер,а общие(на WinAPI,например–там же функции должны сохранять выше описанные регистры).Просто я пишу функцию в DLL(которую планирую экспортировать,дабы другие пользовались),и вот у меня возник такой вопрос
Т.е. моя функция совершенно автономна(считай,чёрный ящик…хотя вряд ли я выразился корректно).Значит,буду поступать как все–сохранять EBX(только что вычитал в OllyDbg,что по стандарту сохраняется EBX,EDI и ESI).А EBP и ESP я сохранять не буду–у меня всё сбалансировано,и переменных локальных нет–функция достаточно проста.Да и вообще,я ж вроде как "Специалист",насчёт локальных переменных таким образом мне положено знать:)
Можешь посмотреть вот тут,только там ещё не раскрыта идея…Тоже подготовительный этап:)
как уже было сказано
Код:
Push EBP
Mov EBP,ESP
…
Mov ESP,EBP
Pop EBP
Mov EBP,ESP
…
Mov ESP,EBP
Pop EBP
нужно для обрабления локальных переменных.
И вообще, лично я рекомендую сохранять все регистры
Код:
proc ProcName,.....
pushad
popad
endp
pushad
popad
endp
это если функция ничего не возвращает.
а если надо возвращать результат, то так
Код:
proc ProcName,.....
pushad
;в eax результат
mov [esp+28], eax
popad
endp
pushad
;в eax результат
mov [esp+28], eax
popad
endp
"По стандарту" должны сохраняться регистры ebx, ebp, esi, edi (ну и естественно esp). Сохранять их или нет в твоих подпрограммах, дело твое. Конечно, если ты пишешь какую-нибуть паблик лайбрари или просто твоя подпрограмма может вызываться из какого-либо внешнего по отношению к твоему кода, то сохранять стоит. В ином случае все зависит от твоих собственных соглашений (предпочтений) по вызову подпрограмм в целом или даже в данном конкретном проекте.
Цитата: Phantom-84
должны сохраняться регистры ebx, ebp, esi, edi (ну и естественно esp)