Процедура в WindowsДоброго времени суток, уважаемые подписчики. Сегодняшний урок будет больше о теоретическим программировании, чем о практическом. Завершая тему Controls, хочу сказать, что Controls могут быть разделены на два типа, Common Controls и просто Controls (далее контролы), в предыдущем уроке мы рассмотрели работу именно контрола, так как именно эта категория создаётся функцией CreateWindowsEx и обслуживается путем обмена сообщений. Common controls (которые можно перевести как обычные "контролы") отличаются тем, что из-за их многофункциональности простых сообщений иногда бывает недостаточно. Подробную информацию о контролах и процедурах можно получить, скачав 5 мегабайтный справочник WinAPI. Все контролы работают примерно одинаково, поэтому я пока не вижу смысла рассматривать отдельно каждый из них. Следующая тема, которую я хотел бы рассмотреть в сегодняшнем уроке, это построение процедуры в Windows. Наверняка многие из вас уже слышали о таких вещах, как стековой кадр или локальные переменные. Пришло время узнать, что это такое, и с чем его едят! Итак, начнём, насколько это ни удивительно, с самого начала: Что есть процедура!? Процедура это определённая часть кода, которая вызывается командой call, при этом в стеке ей передаётся адрес следующей после call команды, что и позволяет командой ret перейти на эту метку. В досе каждая программа имела собственный сегмент, поэтому при вызове функций через прерывания параметры передавались в регистрах. Однако в Windows стек наследуем, то есть при вызове определённой функции она получает в своё распоряжение тот же стек, что и вызывающая его программа. Это даёт возможность передавать параметры через стек. И тут возникает вопрос как к ним обращаться, если единственная возможность обратиться к ним является обращением через esp. Но там где одна проблема там и другая, так как при адресации через определённый регистр мы должны сохранять его значение, в нашем случае не пользоваться стеком. Тогда самым простым решением является создание стекового кадра, что значит сохранить текущее значение стека в ebp (или любой другой регистр), предварительно сохранив его в тот же стек, и адресовать наши переменные уже через этот регистр. В изучении языка программирование бесспорно наиважнейший фактор - информация, однако обучение без практики - деньги на ветер, поэтому я намериваюсь давать Вам "домашнее задание" или что-то вроде этого. В этот раз я лишь хочу заставить Вас задуматься о правильном использовании команд ассемблера (если кто не в ладах с ними, то может скачать подробный хелп по опкодам, так их называют на самом деле). Итак, сегодняшнее задание написать наиболее короткую процедуру измерения длинны строки без использования API. Размер файла всегда будет одинаков, но это нас пока не интересует, так как дописав в .bat файл ключ /Fl к программе ml.exe можно получить файл листинга, который содержит код программы и машинные коды, в которые и была трансформирована программа. Файлы с процедурой (а это должна быть именно процедура, получающая адрес начала строки как параметр) присылайте мне. На сегодня это всё. Если есть какие вопросы, пишите, обязательно отвечу. Пишите, Dark_Lord@RusFAQ.ru, Dark_Lord@land.ru. |