Игорь Орещенков - Введение в NASM (низкоуровневое программирование для Windows)
Название: | Введение в NASM (низкоуровневое программирование для Windows) | |
Автор: | Игорь Орещенков | |
Жанр: | Статьи и рефераты, Самиздат, сетевая литература, Литература ХXI века (эпоха Глобализации экономики), Программирование: прочее, Assembler | |
Изадано в серии: | неизвестно | |
Издательство: | неизвестно | |
Год издания: | 2004 | |
ISBN: | неизвестно | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Введение в NASM (низкоуровневое программирование для Windows)"
Краткое введение в макроассемблер NASM для Windows.
Читаем онлайн "Введение в NASM (низкоуровневое программирование для Windows)". [Страница - 5]
Здесь необходимо сделать небольшое отступление и вкратце рассказать о специфике разработки приложений для Windows с использованием ассемблера. Дело в том, что каждая операционная система, предоставляя программисту определенный сервис в решении наиболее общих и востребованных задач, как-то: управление памятью, файловый ввод-вывод и интерфейс с пользователем, устанавливает и определенные правила, которым тот должен следовать при написании программ. Практически любая программа, предназначенная для выполнения в среде операционной системы Windows, использует вызовы функций Win32 API. Поэтому так важно ознакомиться с правилами их использования. Разрабатывая Windows, Microsoft придерживалась рекомендаций Intel 80x86 ABI (Application Binary Interface), в которых как раз и описываются правила взаимодействия модулей программ. Отметим только самые ключевые аспекты этих правил.
В процессе своей работы программы на ассемблере активно используют регистры. Для процессоров семейства i386 это 32-разрядные регистры EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP (в использовании сегментных регистров необходимость возникает очень редко). В соответствии с правилами ABI функции должны сохранять значения регистров EBX, ESI, EDI и EBP. Значения регистров EAX, ECX и EDX сохранять не обязательно (рис. 3). Важно понимать, что этому же правилу следуют и функции Win32 API. Поэтому после вызова какой-либо из них нельзя предполагать, что значения регистров EAX, ECX и EDX сохранятся. Если планируется их дальнейшее использование, программист должен сам позаботиться об их сохранности, например, задействовав стек.
Рис. 3. Использование регистров в соответствии с ABI
Передача параметров в функции Win32 API осуществляется через стек, причем помещаться в стек они должны в порядке, обратном тому, что можно увидеть в описании функций. За редким исключением (например, очень удобная функция wsprintf) функции Win32 API сами очищают стек от параметров. Подавляющее большинство, если не все функции Win32 API в качестве параметров принимают 32-битные значения. Если значение параметра не укладывается в указанные границы, используется 32-битный указатель. Функции Win32 API возвращают результат своей работы через регистр EAX. Рассмотрим на примере, как должен осуществляться вызов функции MessageBox, чтобы вывести диалоговое окно с сообщением pszMessage и заголовком pszCaption (предполагается, что владельцем диалога будет окно, манипулятор которого сохранен в 32-битной переменной hwnd):
…
push dword MB_ICONINFORMATION | MB_OK
push dword pszCaption
push dword pszMessage
push dword [hwnd]
call [MessageBox]
…
Здесь нужно заметить, что ассемблер NASM не отслеживает типов переменных даже если они описаны с указанием размера выделяемой памяти. Поэтому в операциях, не затрагивающих регистры, необходимо явное указание на размер операндов — в данном случае dword. Так как в программах для Windows вызовы функций Win32 API встречаются сплошь и рядом, использовать такие громоздкие описания было бы затруднительно. Поэтому хорошим выходом из сложившейся ситуации будет разработка макроса, позволяющего записывать вызов в одну строку. Автор решил использовать синтаксис, подобный обращению к подпрограмме в языках семейства DBASE IV. Макрос для этих целей записывается так:
%imacro DO 1-*
%rep %0 — 1
%rotate –1
push dword %1
%endrep
%rotate –1
call [%1]
%endmacro
%idefine WITH,
а так выглядит вызов функции MessageBox:
DO MessageBox WITH [hwnd], pszMessage, pszCaption, MB_ICONINFORMATION | MB_OK
Как уже было сказано, для NASM существует готовая библиотека импорта функций Win32 API. Однако подобную библиотеку можно создать и самостоятельно. Для этого в NASM имеются директивы extern и import. Их описание приведено в сопроводительной документации, а в этой статье рассмотрим два макроса, которые позволяют оформлять исходные тексты библиотеки импорта в более читаемом виде:
%macro DLL 1
%define DLL %1
%endmacro
%imacro FUNCT 1-2
extern %1
%if %0 = 1
import %1 DLL
%else
--">Книги схожие с «Введение в NASM (низкоуровневое программирование для Windows)» по жанру, серии, автору или названию:
Константин М Радов - Оружейник. Винтовки для Петра Первого Жанр: Альтернативная история Год издания: 2014 |
Тимур Беликов - Минные поля проектного финансирования. Пособие по выживанию для кредитных работников и инвесторов Жанр: Ценные бумаги, инвестиции Год издания: 2009 |
Марина Григорьевна Халкиди - Дед Мороз для Арины (СИ) Жанр: Любовная фантастика Год издания: 2017 |