Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сохранение регистров в процедуре

7
18 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Здравствуй,CodeNet!
У меня небольшой вопрос:я пишу процедуру на асме,в которой используются регистры EBX,ECX и EDX.По стандарту вызываемые процедуры должны сохранять EBX,EDX,EDI и ESI,а про ECX там ни слова.Мне повторить за ними:) и тоже не сохранять ECX?
И ещё кое-что:там ведь должен быть код вида
 
Код:
Push EBP
Mov EBP,ESP

Mov ESP,EBP
Pop EBP
Могу ли я его исключить,ибо стек в начале процедуры и в конце сбалансирован?К каким последствиям может привести исключение этого кода(если,конечно,они будут)?
1.9K
18 марта 2009 года
andriano
474 / / 10.01.2008
Насколько мне известно, в языке Ассемблера нет никакого стандарта, который предписывал бы сохранять те или иные регистры. Такие "стандарты" придумываются авторами компиляторов с ЯВУ для обеспечения ассемблерных вставок с высокоуровневым кодом.
Смотри, как ты используешь регистры в том месте, откуда вызываешь процедуру, и, исходя из этого, сохраняй те или иные регистры.

Сщхранение ESP в EBP - дополнительная степень защиты и, кроме того, обычное обрамление для локальных переменных процедуры. Обычно третьей строкой:
ADD ESP, SizeOfLocalVariables
7
18 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Благодарю за быстрый ответ
А стандарты я имел в виду не на сам Ассемблер,а общие(на WinAPI,например–там же функции должны сохранять выше описанные регистры).Просто я пишу функцию в DLL(которую планирую экспортировать,дабы другие пользовались),и вот у меня возник такой вопрос
Т.е. моя функция совершенно автономна(считай,чёрный ящик…хотя вряд ли я выразился корректно).Значит,буду поступать как все–сохранять EBX(только что вычитал в OllyDbg,что по стандарту сохраняется EBX,EDI и ESI).А EBP и ESP я сохранять не буду–у меня всё сбалансировано,и переменных локальных нет–функция достаточно проста.Да и вообще,я ж вроде как "Специалист",насчёт локальных переменных таким образом мне положено знать:)
Можешь посмотреть вот тут,только там ещё не раскрыта идея…Тоже подготовительный этап:)
261
19 марта 2009 года
ahilles
1.5K / / 03.11.2005
Все изветные мне ассемблеры (FASM, TASM, MASM) имеют очень хороший макрос proc, который сам генерит этот код, непонимаю зачем с этим париться?
как уже было сказано
 
Код:
Push EBP
Mov EBP,ESP

Mov ESP,EBP
Pop EBP

нужно для обрабления локальных переменных.

И вообще, лично я рекомендую сохранять все регистры
 
Код:
proc ProcName,.....
pushad

popad
endp

это если функция ничего не возвращает.

а если надо возвращать результат, то так
 
Код:
proc ProcName,.....
pushad

;в eax результат
mov [esp+28], eax
popad
endp
349
19 марта 2009 года
Phantom-84
656 / / 27.10.2005
"По стандарту" должны сохраняться регистры ebx, ebp, esi, edi (ну и естественно esp). Сохранять их или нет в твоих подпрограммах, дело твое. Конечно, если ты пишешь какую-нибуть паблик лайбрари или просто твоя подпрограмма может вызываться из какого-либо внешнего по отношению к твоему кода, то сохранять стоит. В ином случае все зависит от твоих собственных соглашений (предпочтений) по вызову подпрограмм в целом или даже в данном конкретном проекте.
14
20 марта 2009 года
Phodopus
3.3K / / 19.06.2008
Если ты объявишь свою функцию экспортируемой, с возможностью использования из других программ, на других языках, тогда разумно будет объявить ее как stdcall что подразумевает
Цитата: Phantom-84
должны сохраняться регистры ebx, ebp, esi, edi (ну и естественно esp)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог