![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 18.04.2009
Сообщений: 688
|
![]()
Здравствуйте!
Имеется вопрос по процедурам. Если в самом начале кода написано: Код:
Вот что пишет по поводу процедуры, где параметры передаются через стек (есть аргументы) Владислав Пирогов в своей книге "Ассемблер на примерах" (стр. 94): "Замечу, что в получившемся фрашменте стек освобождается непосредственно при выходе из процедуры. Дело здесь в том что мы предполагаем что в начале программы был указан стандарт вызова процедуры (конвенция) STDCALL. Если вместо данного стандарта поставить C, то в конце процедуры будет стоять команда RET, а не RET 12. Стандарт вызова можно указать и непосредственно в директиве PROC, например, следующим образом: PROC1 PROC STDCALL" а вот здесь сам пример процедуры, о которой писал автор: Код:
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
начало кода вообще не имеет отношения к выходу из процедуры.
а в книге верно написано, при stdcall вы сами освобождаете стек за собою. а в cdecl это делает вызывающий. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 18.04.2009
Сообщений: 688
|
![]()
Короче, при стандарте C надо писать RET, а после вызова процедуры писать ADD ESP, N
А при стандарте stdcall RET N? Правильно? Но тогда вопрос: Читаю я туториалы по ассемблеру, взятые с WASM-а и вот какой код приводит автор на странице 291: Код:
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
насколько я помню масм сам подставляет ret N в конце вместо ret.(в конце proc)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 05.01.2012 в 13:21. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 18.04.2009
Сообщений: 688
|
![]()
ааааааааааааа. Теперь, наконец, понятно. Это просто типа умный МАСМ. Спасибо тебе огромное!
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Процедуры | swillrocker | Помощь студентам | 1 | 18.05.2011 21:16 |
Использование имени процедуры в качестве параметра другой процедуры | Alexey355 | Помощь студентам | 1 | 23.04.2011 13:59 |
закончить выполнение процедуры из тела другой процедуры | Alaysor | Общие вопросы Delphi | 14 | 23.01.2011 05:26 |
Управляющие структуры, процедуры Function и процедуры Sub | Natalo4ka | Помощь студентам | 0 | 17.05.2010 22:00 |
Запуск процедуры из процедуры с дополнением | 1sal1 | Общие вопросы Delphi | 3 | 06.10.2008 21:54 |