Другие языки программирования и технологии
Кто знает как передаются параметры в процедуру ? (Pascal/Delphi)
Вот если объявлена процедура procedure FF(a, b, c, d, x: Cardinal; s:byte; ac: Cardinal); то в eax имеем - a в edx - b в ecx - с т.е порядок такой eax, edx, ecx... а дальше ?А если их много ?
Если их много, параметры передаются через стек.
Anton V
В этой функции первые 3 параметра то точно могно через регистры выловить. А остальные только в стеке ? Мне б еще хоть 2 параметра...
Передача параметров бывает по регистрам (когда мало) или через стек (когда много) . Стек способ хранения данных, выкладываемых непосредственно в память, где находится сама программа, но он растет с хвоста к голове. Программа выкладывает данные на стек в определенном порядке (аргументы идут с права на лево или слева на право - важно) , а вызываемая процедура (функция) их оттуда в обратном порядке подбирает. Также важно кто стек чистит (значение отступа offset по стеку, хранится в регистре) , паскаль и C различаются в этом плане.
Именно это свойство использовалось на 32битных системах для взлома работающих программ (и сейчас часто бывает) - человек забивал кучу данных в поля ввода (как вот это) , и если программа не проверяла размер, то эти данные выбрасывались в стек и он рос, переписывая сам код текущей программы, что приводило к двум вариантам: сбой и/или передача контроля вставленному ("вредоносному") коду. Если дебаг контроль перехватывал такую ситуацию то выбивала ошибка stack/buffer overfollow и програма принудительно завершалась. На 64битных системах появился новый маркер доступный операционным системам (или любому коду запущенному с привилегиями) , запрещающему запуск любой страницы памяти (NXbit).
Про стек: http://ru.wikipedia.org/wiki/Стек_вызовов
Именно это свойство использовалось на 32битных системах для взлома работающих программ (и сейчас часто бывает) - человек забивал кучу данных в поля ввода (как вот это) , и если программа не проверяла размер, то эти данные выбрасывались в стек и он рос, переписывая сам код текущей программы, что приводило к двум вариантам: сбой и/или передача контроля вставленному ("вредоносному") коду. Если дебаг контроль перехватывал такую ситуацию то выбивала ошибка stack/buffer overfollow и програма принудительно завершалась. На 64битных системах появился новый маркер доступный операционным системам (или любому коду запущенному с привилегиями) , запрещающему запуск любой страницы памяти (NXbit).
Про стек: http://ru.wikipedia.org/wiki/Стек_вызовов
Anton V
О, пасибки, вылез по ссылкам на вот это
http://ru.wikipedia.org/wiki/Соглашение_вызова#fastcall
а вот если я напишу
procedure FF(var a: Cardinal; b, c, d, x: Cardinal; s:byte; ac: Cardinal);
Что то тогда манипуляции с EAX не получаются :(
Не подскажите ?
http://ru.wikipedia.org/wiki/Соглашение_вызова#fastcall
а вот если я напишу
procedure FF(var a: Cardinal; b, c, d, x: Cardinal; s:byte; ac: Cardinal);
Что то тогда манипуляции с EAX не получаются :(
Не подскажите ?
В паскале параметры передаются через стек, в обратном порядке. Результат - в EAX (Стандартные соглашения о связях) .
В других языках (например, C/C++) - в прямом порядке.
В других языках (например, C/C++) - в прямом порядке.
Anton V
fastcall
Передача параметров через регистры, обычно самая быстрая; если все параметры и промежуточные результаты умещаются в регистрах, манипуляции со стеком вообще не нужны. Fastcall не стандартизирован, поэтому используется только в функциях, которые программа не экспортирует наружу. Например, у Borland параметры передаются слева направо в eax, edx, ecx и, если параметров больше трёх, в стеке. Указатель стека на исходное значение возвращает подпрограмма.
Fastcall Borland применяется по умолчанию в Delphi.
Передача параметров через регистры, обычно самая быстрая; если все параметры и промежуточные результаты умещаются в регистрах, манипуляции со стеком вообще не нужны. Fastcall не стандартизирован, поэтому используется только в функциях, которые программа не экспортирует наружу. Например, у Borland параметры передаются слева направо в eax, edx, ecx и, если параметров больше трёх, в стеке. Указатель стека на исходное значение возвращает подпрограмма.
Fastcall Borland применяется по умолчанию в Delphi.
Похожие вопросы
- для чего используют языки програмиирования: С++,Java, Object Pascal(Delphi), C,C#, PHP.если можно то по несколько примеро
- Я в 8-ом классе,хочу после девятого пойти на программиста,т.е изучить c++,pascal,delphi и т д
- Что не так с кодом pascal/delphi
- Помогите пожалуйста подправить процедуру Pascal
- Помогите решить задачу через процедуры PASCAL
- Согласны с этим - Глубинные причины ненависти к Delphi/Pascal ?
- pascal or delphi
- Один вопрос по Pascal (или Object Pascal, или Delphi) (не надо ничего решать, просто один вопрос)
- Можно ли назвать Turbo Pascal или Delphi мёртвым языком программирования?
- В чём отличия Pascal ABC, Free Pascal, Lazarus, Delphi?