Другие языки программирования и технологии

Кто знает как передаются параметры в процедуру ? (Pascal/Delphi)

Вот если объявлена процедура procedure FF(a, b, c, d, x: Cardinal; s:byte; ac: Cardinal); то в eax имеем - a в edx - b в ecx - с т.е порядок такой eax, edx, ecx... а дальше ?А если их много ?
Anton V
Anton V
1 048
Если их много, параметры передаются через стек.
АА
Арман Абдильдинов
4 722
Лучший ответ
Anton V В этой функции первые 3 параметра то точно могно через регистры выловить. А остальные только в стеке ? Мне б еще хоть 2 параметра...
Передача параметров бывает по регистрам (когда мало) или через стек (когда много) . Стек способ хранения данных, выкладываемых непосредственно в память, где находится сама программа, но он растет с хвоста к голове. Программа выкладывает данные на стек в определенном порядке (аргументы идут с права на лево или слева на право - важно) , а вызываемая процедура (функция) их оттуда в обратном порядке подбирает. Также важно кто стек чистит (значение отступа offset по стеку, хранится в регистре) , паскаль и C различаются в этом плане.
Именно это свойство использовалось на 32битных системах для взлома работающих программ (и сейчас часто бывает) - человек забивал кучу данных в поля ввода (как вот это) , и если программа не проверяла размер, то эти данные выбрасывались в стек и он рос, переписывая сам код текущей программы, что приводило к двум вариантам: сбой и/или передача контроля вставленному ("вредоносному") коду. Если дебаг контроль перехватывал такую ситуацию то выбивала ошибка stack/buffer overfollow и програма принудительно завершалась. На 64битных системах появился новый маркер доступный операционным системам (или любому коду запущенному с привилегиями) , запрещающему запуск любой страницы памяти (NXbit).

Про стек: http://ru.wikipedia.org/wiki/Стек_вызовов
Андрей Бикимов
Андрей Бикимов
30 330
Anton V О, пасибки, вылез по ссылкам на вот это
http://ru.wikipedia.org/wiki/Соглашение_вызова#fastcall

а вот если я напишу
procedure FF(var a: Cardinal; b, c, d, x: Cardinal; s:byte; ac: Cardinal);

Что то тогда манипуляции с EAX не получаются :(
Не подскажите ?
В паскале параметры передаются через стек, в обратном порядке. Результат - в EAX (Стандартные соглашения о связях) .
В других языках (например, C/C++) - в прямом порядке.
Сергей Ступин
Сергей Ступин
3 769
Anton V fastcall

Передача параметров через регистры, обычно самая быстрая; если все параметры и промежуточные результаты умещаются в регистрах, манипуляции со стеком вообще не нужны. Fastcall не стандартизирован, поэтому используется только в функциях, которые программа не экспортирует наружу. Например, у Borland параметры передаются слева направо в eax, edx, ecx и, если параметров больше трёх, в стеке. Указатель стека на исходное значение возвращает подпрограмма.

Fastcall Borland применяется по умолчанию в Delphi.