- •1.1.1. Кодирование символов
- •2. Системный отладчик Debug
- •2.1. Адресация памяти
- •2.2. Работа в отладчике
- •Лабораторная работа № 1
- •3. Основы программирования
- •3.1. Процесс программирования
- •3.1.1. Этапы создания программы
- •3.1.2. Компиляция программы. Опции командной строки
- •3.2. Cинтаксис ассемблерной программы
- •3.3. Простейшая программа
- •3.4. Скелет (каркас) программы
- •3.4.1. Модуль EXE
- •3.4.2. Модуль COM
- •3.5. Образ программы в памяти
- •3.5.1. Модуль EXE
- •3.5.2. Модуль COM
- •3.6. Работа с отладчиком Turbo Debugger (TD)
- •Лабораторная работа №1
- •4. Операторы и директивы
- •4.1. "Препроцессорные" директивы INCLUDE и EQU
- •4.2. Директивы описания и инициализации переменных DB, DW и DD
- •4.2.1. Директива DB (Define Byte - определить байт)
- •4.2.2. Директивы DW и DD (Define Word и Define Double Word)
- •4.3. Операторы Assembler
- •4.3.1. Операторы обработки данных
- •4.3.2. Операторы передачи управления
- •4.4. Вспомогательные псевдооператоры
- •4.5. Работа с макрооператорами
- •Лабораторная работа № 2
- •4.6. Приложение к лабораторной работе № 2. Адресация
- •4.6.1. Форматы машинных команд и их кодирование
- •4.6.2. 16-битный режим адресации операндов в памяти
- •5. Сервисные функции DOS
- •5.1.1. Ввод с клавиатуры символьной информации
- •5.1.2. Системные функции DOS ввода данных с клавиатуры
- •5.1.3. Команды работы со строками
- •5.1.4. Системные функции DOS вывода данных
- •Лабораторная работа №3
- •Лабораторная работа №4
- •6. Функции BIOS для работы с экраном и клавиатурой
- •6.1. Прямое программирование видеобуфера в текстовом режиме
- •6.2. Прерывание 10h. Видеофункции BIOS
- •6.3. Прерывания 16h, 1Ah, 15h
- •6.3.1. Прерывание 16h
- •6.3.2. Прерывание 1Ah
- •6.3.3. Прерывание 15h
- •Лабораторная работа №5
- •Заключение
- •Рекомендуемая литература
- •Использованная литература
Проверяет наличие символа в буфере клавиатуры. Допустимо перенаправление ввода. Если ввод не перенаправлен, выполняет отработку <Ctrl+C>. Это даёт возможность организовать с её помощью аварийное завершение программы (нажатием комбинации <Ctrl+C>) с циклом, состоящим из чисто процессорных команд, включив предварительно в цикл вызов функции 0Bh.
Вход: AH = 0Bh.
Возврат: Если символа нет, то AL = 0, если символ ждет, то AL = FFH.
Функция 0Ch. Вызов служебной функции DOS для ввода данных с предварительной очисткой буфера клавиатуры. Допускает переопределение ввода.
Вызов: AH = 0Ch, Int 21h,
AL = номер функции ввода: 01, 07, 08, 0Ah (если AL = 0, то только очистка), DS:DX = адрес буфера, если AL = 0Ah.
Выход: AL = байт входных данных (если при вызове Al = 0Ah, данные помещаются в буфер).
Функция 3Fh. Ввод данных из файла или устройства.
Универсальная функция ввода данных в буфер с указателем DS:DX из источника, определённого дескриптором в регистре BX. Допускает переопределение ввода. В регистре CX указывается число байтов, которое необходимо ввести. Пример использования.
Команда Int 21h ожидает окончания ввода символов, которое фиксируется нажатием клавиши Enter. После ввода текста и нажатия клавиши Enter в буфер In_Area автоматически вводятся два управляющих символа: CR (код 0Dh) и LF (код 0Ah). Вследствие данной особенности максимальное число символов и размер буфера ввода должны содержать место для двух дополнительных символов. При успешном завершении операции флаг CF = 0, а в регистре AX устанавливается число байтов, введённых с клавиатуры (плюс два дополнительных символа). Если CF = 1, то в регистре AX содержится возвратный код ошибки. Это либо 5 (отказ в доступе), либо 6 (неверный дескриптор).
К особенностям использования данной функции следует отнести автоматический переход на новую строку по окончании ввода данных.
5.1.3. Команды работы со строками
Строкой или литералом в языке ассемблера называется последовательность букв, цифр и других символов, заключённых в кавычки или апострофы (двойные кавычки). Следует отметить, что иногда понятие строки трактуется в расширительном смысле, а именно, как последовательность байтов, которые могут либо представлять, либо не представлять ASCII-символы.
Строковые команды, несмотря на синонимичное название со строковыми переменными, предназначены для обработки не только ASCII-строк, но и вообще блоков байтов, одинарных или двойных слов, каждое из которых хранится в памяти в двоичном коде.
Строковые команды представлены в табл. 3.1 и по своему назначению делятся на две группы:
∙команды перемещения данных (LODS, STOS, MOVS);
76
·команды для поиска и сравнения данных (SCAS, CMPS).
Любая строковая команда может оперировать как байтами, так и словами, что
отражается в мнемокоде команды (например: MOVSB, MOVSW, MOVSD). Все строковые команды, в отличие от других команд процессора Intel x86, используют для выполнения своих функций одни и те же регистры:
·DS:SI(ESI) – регистры строки-источника;
·ES:DI(EDI) –регистры строки-приёмника.
Т а б л и ц а 3 . 2 .
Команды обработки строк
Название команды и её мнемокод |
Действие |
Префикс |
Влияние на флаги |
|
|
|
|
LODS source – Загрузка из строки |
al ¬ src |
- |
Нет |
source=byte DS:SI LODSB |
ax ¬ src |
|
|
source=word DS:SI LODSW |
eax ¬ src |
|
|
source=dword DS:SI LODSD |
|
|
|
STOS dest – Сохранение Acc в строке |
al ® dst |
Rep |
Нет |
dest=byte ES:DI Stosb |
ax ® dst |
|
|
dest=word ES:DI Stosw |
eax |
|
|
dest=dword ES:DI Stosd |
|
|
|
MOVS dest,source – Пересылка элемента строки |
dst ¬ src |
Rep |
Нет |
dest=byte ES:DI, source=byte DS:SI Movsb |
|
|
|
dest=word ES:DI, source=word DS:SI Movsw |
|
|
|
dest=dword ES:DI, source=dword DS:SI Movsd |
|
|
|
SCAS dest – Поиск элемента в строке |
al-dst |
Repe |
Все флаги |
dest=byte ES:DI Scasb |
ax-dst |
(Repz) |
операции |
dest=word ES:DI Scasw |
eax-dst |
Repne |
сравнения |
dest=dword ES:DI Scasd |
|
(Repnz) |
|
CMPS dest, source – Сравнение элементов строк |
src-dst |
Repe |
Все флаги |
source=byte DS:SI, dest=byte ES:DI Cmpsb |
|
(Repz) |
операции |
source=word DS:SI, dest=word ES:DI Cmpsw |
|
Repne |
сравнения |
source=dword DS:SI, dest=dword ES:DI Cmpsd |
|
(Repnz) |
|
При этом индексные регистры SI(ESI) и DI(EDI) определяют смещения элементов строк в сегментах данных, определяемых регистрами ds и es соответственно. Установите es = ds, если это не противоречит другим условиям реализации программы, что позволит вам не беспокоиться о корректной адресации сегментов памяти. Необходимо помнить, что в строковых инструкциях приёмник – строка ES:DI(EDI) не допускает переопределение, а источник – строка DS:SI(ESI), допускает переопределение на ES:SI(ESI).
Префикс повторения, помещённый непосредственно перед строковой командой, заставляет её циклически выполняться определённое число раз до реализации заданного условия. Существуют три командных префикса:
·Rep (repeat) – повторять, пока CX¹0;
·Repe/Repz (repean while zero) – повторять, пока (CX¹0)&(ZF=1);
·Repne/Repnz (repean while not zero) – повторять, пока (CX¹0)&(ZF=0).
Префиксы используют регистр CX как счётчик числа циклов (беззнаковое число),
которое должно быть записано в CX до начала выполнения строковой команды. Счётчик CX декрементируется (уменьшается) на 1 после выполнения строковой команды, но проверяется
77
перед её выполнением. Если CX = 0, то строковая команда не выполняется ни разу. Префиксы Repe и Repne дополнительно выставляют флаг нуля ZF после выполнения строковой операции.
5.1.4. Системные функции DOS вывода данных
DOS предоставляет следующие способы вывода данных на экран:
∙использование функций Int 21h (02h, 06h, 09h), обеспечивающих посимвольный ввод
склавиатуры в разных режимах;
∙обращение к экрану, как к файлу, с помощью функции 40h.
Функция 02h. Вывод одиночного символа.
Выводит символ, находящийся в регистре DL, на экран, после чего курсор сдвигается на одну позицию вправо. Для вывода строки функцию следует использовать в цикле. Допустимо перенаправление вывода. Выполняет обработку <Ctrl/C> при вводе этой комбинации с клавиатуры перед выводом каждого 64-го символа. Эта функция выводит и управляющие ASCII-символы с кодами 07h, 08h, 09h, 0Ah, 0Dh. Символ с кодом 07h (bell, звонок) вызывает звуковой сигнал, с кодом 08h (backspace, забой) – возвращает курсор на одну позицию влево, с кодом 09h (tab, табуляция) – смещает курсор на одну позицию вправо, кратную 8. Действия управляющих клавиш с кодами 0Ah и 0Dh рассматривались ранее.
Вызов: AH = 02h, Int 21h.
Выход: DL = ASCII – код символа
AL = код последнего записанного символа (кроме случая, когда DL= 09, тогда возвращается значение 20h).
Использование данной функции рассмотрим на примере процедуры перехода на новую строку.
PROC NewLine
mov ah,2 ;Запрос функции 02h mov dl,13 ;Возврат каретки int 21h ;Вызов DOS
mov dl,10 ;перевод строки int 21h ;Второй вызов DOS ret
ENDP NewLine
Функция 09h. Вывод строки.
Выводит строку символов на устройство стандартного вывода (используется в системных программах для вывода на экран информационных сообщений). Строка должна заканчиваться символом $ (код 24h), который служит признаком конца строки, и сам не выводится. Допустимо перенаправление вывода. В сообщение могут быть включены и управляющие коды (07h, 08h, 09h, 0Ah, 0Dh), которые вызывают соответствующие им действия (см. функцию 02h). Допустимо использование Exc-последовательностей. Функция выполняет обработку <Ctrl/C> при вводе этой комбинации с клавиатуры перед выводом каждого 64-го символа.
Пример использования.
78
.....................
Promt DB ‘Name? $’
.....................
lea dx,[Promt] ;Адрес строки Promt: DS:DX mov ah,09h ;Запрос функции 09h
int 21h ;Вызов DOS
.....................
Вместо оператора LEA можно использовать оператор mov, указав в качестве пересылаемого значения не [Promt], а offset Promt.
Функция 40h. Вывод данных в файл или в устройство.
Универсальная функция вывода данных из буфера пользователя в сегменте данных в файл или на устройство, дескриптор которого указывается в регистре BX. Дескриптор 1, закреплённый за стандартным устройством вывода, обеспечивает перенаправление вывода. Значение регистра CX определяет число байтов, которые должны быть выведены, а пара регистров DS:DX указывает адрес выводимых данных. Управляющие коды 08h, 0Ah, 0Dh и некоторые другие приводят к выполнению соответствующих им действий. После завершения вывода при CF = 0 регистр AX содержит число действительно выведенных байтов, а при CF =1 – возвратный код ошибки. Как и при использовании функции 3Fh, это коды ошибок 5 или 6. Пример использования.
.......................
Out_Area DB 20 DUP(?)
.......................
mov ah,40h ;Запрос функции 40h mov bx,01 ;Дескриптор дисплея
mov cx,20 ;Число пересылаемых байт
lea dx,[Out_Area] ;Адрес буфера для выводимого сообщения int 21h ;Вызов DOS
........................
Таблица кодирования символов ASCII
В данном разделе приведена полная таблица отображаемых символов ASCII, состоящая из двух равных частей по 128 символов. Номера строк соответствуют первой цифре 16-теричного кода символа, номера столбцов – второй, так что, например, код прописной латинской буквы А = 41h. Первая половина таблицы символов с кодами 00h – 7Fh является Американским стандартным кодом для обмена информации (английская аббревиатура ASCII) и имеет международный стандарт, вторая – соответствует одному из широко распространённых в России вариантов кодирования символов для IBM-совместимых компьютеров.
Первая половина таблицы ASCII содержит символы двух типов: управляющие (коды 00h – 1Fh, 7F) и алфавитно-цифровые (20h-7E), вторая – символы кириллицы и псевдографики.
79