- •Знакомство в языком ассемблера Что такое язык ассемблера?
- •Ядро процессора
- •Программируемые регистры
- •Регистры состояния и управления
- •Введение в язык ассемблера
- •Представление данных Двоичные числа
- •Биты, байты, слова, двойные и учетверенные слова
- •Команды и данные
- •Числовые системы
- •Правила представления числовых данных
- •Числа со знаком
- •Хранение символов
- •Команды языка ассемблера
- •Утверждения
- •Пример простой программы
- •Директивы размещения данных
- •Объявление байтов
- •Программирование для консоли. Системные функции.
- •Набор символов и функции Windows api
- •Уровни доступа
- •Типы данных Windows
- •Дескрипторы консоли
- •Функции консоли Win32
- •Использование функций
- •Ввод с консоли
- •Функция ReadConsole
- •Работа с файлами Функция создания файла
- •Параметр DesiredAccess
- •Параметр CreationDisposition
- •Примеры работы с файлами
- •Функция CloseHandle
- •Функция ReadFile
- •Функция WriteFile
- •Пример записи в файл
- •Перемещение указателя файла
- •Пример чтения файла
- •Функция SetConsoleTitle
- •Функция GetConsoleScreenBufferlnfo
- •Функция SetConsoleWindowlnfo
- •Функция SetConsoleScreenBufferSize
- •Управление курсором
- •Пример использования значений цвета
- •Функции времени и даты
- •Функции GetLocalTime и SetLocalTime
- •Функция GetTickCount
- •Функция Sleep
- •Процедура получения локального времени
- •Создание секундомера
- •Документы
- •Стыкуемые окна инструментов
- •Работа с текстом
- •Набор текста и быстрые клавиши
- •Форматирование кода
- •Нумерация строк
- •Структуризация
- •Справка
- •Групповые символы
- •Использование командного окна для поиска
- •Инкрементный поиск
- •Создание листинга исходного файла
- •Подсветка ключевых слов masm
Знакомство в языком ассемблера Что такое язык ассемблера?
Язык ассемблера — это специфический язык программирования со взаимно однозначным соответствием между его операторами и командами процессора. Язык ассемблера существует для каждого типа процессоров или целого семейства процессоров. Это связано с тем, что команды на языке ассемблера должны иметь взаимно однозначное соответствие с системой машинных команд и должны быть согласованы с архитектурой компьютера. Язык ассемблера для процессоров Intel имеет систему команд, понимаемую различными процессорами производства Intel, такими как 8086, 8088, 80186, 80286, 80386, 80486, Celeron и Pentium.
Ассемблер — это программа, преобразовывающая исходные коды языка ассемблера в машинные команды. Ассемблер может создавать листинг программы с номерами строк, адресами памяти, исходными операторами и таблицей перекрестных ссылок символов и переменных, используемых в программе. Совместно используемая с ассемблером программа, называемая компоновщик, собирает отдельные файлы, созданные ассемблером, в единую выполняемую программу. В блок базовых программ входит также отладчик, позволяющий программисту проверять и трассировать исполняемую программу и контролировать содержимое памяти. Программы на языке ассемблера можно запускать либо в операционной системе MS-DOS (или в режиме эмуляции MS-DOS в системах Windows), либо непосредственно в Windows. Язык ассемблера называется языком низкого уровня потому, что он очень близок к машинному языку по своей структуре и выполняемым функциям. Каждая команда языка ассемблера имеет взаимно-однозначное соответствие с машинными командами, что отличает его от языков высокого уровня, для которых характерно то, что одна команда транслируется во множество машинных команд.
Ядро процессора
Для программиста важно знать общий принцип работы процессора и те его элементы, к которым можно обратиться в процессе написания программы. На рис. 2.0 показан блок управления, который распределяет задания и выбирает данные из памяти, арифметико-логический блок, где непосредственно и происходят вычисления, и регистры, в которых хранятся все необходимые данные для оперативного выполнения очередной команды.
Рис. Error: Reference source not found.0. Архитектура простейшего компьютера
Регистры — это участки высокоскоростной памяти для хранения данных в процессоре. Они непосредственно подключены к блоку управления и арифметико-логическому устройству, поэтому доступ к регистрам из этих блоков происходит значительно быстрее, чем доступ к внешней памяти. Команды, использующие только обращение к регистрам, выполняются очень быстро, в отличие от команд, требующих получения операндов из внешней памяти, что необходимо учитывать при программировании, если программа должна работать максимально быстро.
Программируемые регистры
Регистры подразделяются на регистры общего назначения а также регистры состояния и управления. К регистрам общего назначения обычно относят регистры данных, а также регистры сегментов и регистры указателей и индексов. Эти регистры доступны при написании программы и программист может записывать в них данные. Другая группа регистров — это регистры флагов и регистры состояния и управления, которые изменяются автоматически при выполнении программы, за редким исключением программист не может непосредственно изменять их. Регистр флагов состоит из отдельных разрядов, которые или управляются непосредственно процессором при операциях, или отражают состояние процессора после выполнения операции. Отдельные флаги сообщают о переполнении, направлении перемещения, разрешении прерываний, режиме трассировки, знаке результата, нулевом результате, вспомогательном переносе, четности или переносе (рис. 2.0).
Рис. Error: Reference source not found.0. Основные регистры 16-разрядных процессоров
Регистры данных используются при арифметических операциях и при перемещении данных. Каждый регистр содержит 16-разрядное значение, но существует также возможность обратиться к каждому байту отдельно.
Каждый регистр данных имеет приоритетное назначение, которое неявно используется в ряде команд:
AX (аккумулятор). Используется при арифметических операциях. Другие операции также будут выполняться несколько быстрее при использовании регистра AX.
BX (базовый регистр). Регистр BX содержит адреса процедур или переменных. Для этих же целей используют регистры SI, DI и BP. Регистр BX также можно использовать при выполнении арифметических операций и перемещении данных.
CX (счетчик). Регистр CX выполняет функции счетчика для операций повторения и циклических команд. При выполнении этих команд увеличение значения происходит автоматически.
DX (регистр данных). Регистр данных DX выполняет особые функции при операциях умножения и деления. Например, при умножении в него помещается результат операции.
В процессоре имеется четыре регистра сегментов, используемых при указании адреса размещения данных и стека. При всех обращениях к памяти для расчета адреса используются регистры сегментов.
CS (сегмент кода). Содержит сегментную часть адреса расположения команд программы.
DS (сегмент данных). Содержит сегментную часть адреса расположения переменных.
SS (сегмент стека). Содержит сегментную часть адреса стека.
ES (дополнительный сегмент). Используется дополнительно для хранения сегментной части адреса переменных.
Регистры индексов содержат величину смещения, используемую при расчете адресов данных и команд. Термин “смещение” указывает расстояние переменной, метки или команды от начала базового сегмента.
BP (указатель базы). Включает смещение от начала сегмента SS для указателя стека.
SP (указатель стека). Включает смещение вершины стека. Используя регистры SP и SS, можно рассчитать полный адрес вершины стека.
SI (индекс отправителя). Используется при исполнении команд перемещения. Указывает смещение начала данных для перемещения.
DI (индекс получателя). Указывает смещение адреса, куда перемещаются данные.
