
- •Введение в язык Assembler
- •Программные оболочки и их состав
- •Режимы работы процессоров Intel
- •Организация памяти
- •3.1.2. Сегментирование памяти
- •3.1.3. Адресация байтов и слов
- •Регистры процессоров и их классификация
- •Регистры общего назначения (рон)
- •Сегментные регистры
- •Регистры-указатели
- •Регистр флагов
- •Способы адресации операндов
- •Регистровая адресация
- •Непосредственная адресация
- •Прямая (абсолютная) адресация (адресация по смещению)
- •Косвенная адресация
- •Адресация по базе со сдвигом
- •Косвенная адресация с масштабированием
- •Адресация по базе с индексированием
- •Адресация по базе с индексированием и масштабированием
- •Классификация команд процессора Intel
- •Основные непривилегированные команды
- •Команды пересылки данных
- •Команды двоичной арифметики
- •Десятичная арифметика
- •Логические команды Логические операции
- •Логические команды
- •Mov ax, 00110011b
- •Операции над битами и байтами
- •Команды передачи управления
- •Директивы и операторы ассемблера
- •Структура программы
- •Директивы распределения памяти Псевдокоманды определения переменных
- •3.2.2. Структуры
- •3.3. Организация программы
- •3.3.1. Сегменты
- •Модели памяти и упрощенные директивы определения сегментов
- •3.3.3. Порядок загрузки сегментов
- •3.3.4. Процедуры
- •3.3.5. Конец программы
- •3.3.6. Директивы задания набора допустимых команд
- •3.3.7. Директивы управления программным счетчиком
- •3.3.8. Глобальные объявления
- •3.4. Выражения
- •3.5. Макроопределения
- •3.5.1. Блоки повторений
- •3.5.2. Макрооператоры
- •3.5.3. Другие директивы, используемые в макроопределениях
- •3.6. Другие директивы
- •3.6.1. Управление файлами
- •3.6.2. Управление листингом
Программные оболочки и их состав
Для программирования на языке Assembler, который изучается в данном курсе, как и в случае других языков программирования, прежде всего, необходимы программные оболочки. Но перед началом их рассмотрения отметим, что под словом Ассемблер (от англ. Assembly – «ассемблирование», «компоновка», «сборка»; Assembler – «сборщик», «транслятор») понимают два различных понятия.
1. Под Ассемблером понимают язык Ассемблера (Assembly Language – «язык ассемблирования»; Assembler Language – «язык ассемблера») – это один из языков программирования низкого уровня (машинно-ориентированный язык программирования), в котором для представления команд используются сокращения и аббревиатуры. Каждый тип процессоров имеет собственный набор машинных команд, поэтому под него создаётся свой уникальный язык Ассемблера.
2. Под Ассемблером понимают программу (оболочку) Ассемблера (Assembly Program – «программа ассемблирования», Assembler Program – «программа ассемблера») – это транслятор с языка ассемблера, компонующая программа, программа сборки. Программа Ассемблера переводит (транслирует) команды исходного текста программы на языке Ассемблера в объектный код или непосредственно в исполняемый машинный код, т. е. переводит текст с языка, понятного человеку, в язык, понятный процессору.
И в повседневной речи, и в литературе под словом «Ассемблер» понимают как сам язык программирования, так и программу для её написания, отладки и запуска на выполнение. Понятно, что, когда говорят «программа на Ассемблере», имеют в виду язык, а когда говорят «Макроассемблер версии 6.13», имеют в виду программу.
Одним из элементов любой программной оболочки, в том числе и Ассемблера, является текстовый редактор (Text Editor), который необходим для ввода текста программы.
Далее необходим компилятор (транслятор) (Compiler, Translator) – это программа, которая переводит текст программы в объектный или непосредственно исполняемый код. Процесс компиляции (трансляции) состоит из двух стадий: 1) анализа (лексического, синтаксического, семантического); 2) синтеза.
На стадии анализа программа разбивается на составные части и проверяется её корректность (правильность использования команд, переменных и т. д.).
На стадии синтеза из внутреннего представления сначала генерируется программа на промежуточном языке, которая затем оптимизируется, после чего кодогенератор порождает программу на машинном языке (объектный или исполняемый код).
В Ассемблере обязательно должна быть ещё одна программа – компоновщик (Linker), которая и создаёт исполнимые файлы из одного или нескольких объектных модулей, полученных после компиляции (трансляции).
Во всех программах встречаются ошибки. Если не только пробовать приводимые в лекциях примеры, но и писать что-то своё, то рано или поздно обязательно потребуется отладчик (Debugger). Кроме поиска ошибок отладчики иногда применяют и для того, чтобы исследовать работу существующих программ. Безусловно, самый мощный отладчик на сегодняшний день – SoftICE от NuMega Software. Это фактически единственный отладчик для Windows 95/NT, позволяющий исследовать всё – от ядра Windows до программ на С++, поддерживающий одновременно 16- и 32-битный код и многое другое. Другие популярные отладчики, распространяемые вместе с соответствующими ассемблерами, – Codeview (Microsoft), Turbo Debugger (Borland) и Watcom Debugger (Watcom).
Ещё одна особенность ассемблера, отличающая его от всех остальных языков программирования, – возможность дизассемблирования. То есть, имея исполнимый файл, с помощью специальной программы дизассемблера (Disassembler) почти всегда можно получить исходный текст на Ассемблере. Например, можно дизассемблировать BIOS вашего компьютера и узнать, как выполняется переключение видеорежимов, или драйвер для DOS, чтобы написать такой же для Windows. Дизассемблер не необходим, но иногда оказывается удобно иметь его под рукой. Лучшие дизассемблеры на сегодняшний день – Sourcer от V Communications и IDA.
И, наконец, последняя необязательная, но крайне полезная утилита – шестнадцатеричный редактор (Hexadecimal Editor). Многие такие редакторы (Hiew, Proview, Iview, Hexit) тоже имеют встроенный дизассемблер, так что можно, например, открыв в таком редакторе свою программу, посмотреть, как скомпилировался тот или иной участок программы, поправить какую-нибудь команду ассемблера или изменить значения констант и тут же, без перекомпиляции, запустить программу, чтобы посмотреть на результат изменений.
Помимо этого для разных целей могут потребоваться дополнительные вспомогательные программы – компиляторы ресурсов, расширители DOS и т. п.
В таблице 1 показаны Ассемблеры и вспомогательные программы различных фирм-производителей программного обеспечения.
Таблица 1. Ассемблеры и сопутствующие программы
|
Microsoft |
Borland |
Watcom |
DOS, 16 бит |
Masm или ML |
Tasm |
Wasm |
Link (16 бит) |
Tlink |
Wlink | |
DOS, 32 бита |
Masm или ML |
Tasm |
Wasm |
Link (32 бита) и Dosx |
Tlink |
Wlink | |
Link (16 бит) и Dos32 |
Wdosx или Dos32 |
Dos4gw, Pmodew, Zrdx или Wdosx | |
Windows EXE |
Masm386 или ML |
Tasm |
Wasm |
Link (32 бита) |
Tlink32 |
Wlink | |
RC |
Brcc32 |
Wrc | |
Windows DLL |
Masm386 или ML |
Tasm |
Wasm |
Link (32 бита) |
Tlink32 |
Wlink | |
|
Implib |
Wlib |
Трудно говорить о том, продукция какой из этих трёх компаний однозначно лучше. С точки зрения удобства компиляции Tasm лучше подходит для создания 16-битных программ для DOS, Wasm – для 32-битных программ для DOS, Masm – для Windows. С точки зрения удобства программирования развитость языковых средств растёт в ряду Wasm–Masm–Tasm. Все примеры программ в этом пособии построены так, что можно использовать любой из этих компиляторов.
Разумеется, существуют и другие компиляторы, например, бесплатно распространяемый в сети Интернет Nasm или условно бесплатный А86, но пользоваться ими проще, если вы уже знаете турбо- или макроассемблер. Бесплатно распространяемый GNU ассемблер, Gas (для программирования под Unix), вообще использует совершенно непохожий синтаксис.