- •1. Внутренние регистры
- •1.1. Регистры данных
- •1.2. Регистры сегментов
- •1.3. Регистры указателей и индексов
- •1.4. Регистр командного указателя
- •1.5. Флаговый регистр
- •2. Структура и процесс разработки программы на языке ассемблера
- •2.1. Команды
- •2.2. Псевдооператоры
- •2.2.1. Псевдооператор segment
- •2.2.2. Псевдооператор proc
- •2.2.3. Псевдооператор assume
- •2.2.4. Псевдооператор end
- •2.2.5. Псевдооператоры определения данных
- •2.3. Инициализация программы
- •3. Команды пересылки данных
- •3.1. Команда mov
- •3.2. Команды push и рор
- •4. Режимы адресации
- •4.1. Регистровая и непосредственная адресация
- •4.2. Исполнительный адрес
- •4.3. Прямая адресация
- •4.4. Косвенная регистровая адресация
- •4.5. Адресация по базе
- •4.6. Прямая адресация с индексированием
- •4.7. Адресация по базе с индексированием
- •5. Команды передачи управления
- •5.1. Команды call и ret
- •5.2. Команда безусловного перехода jmp
- •5.3. Команды условной передачи управления
- •5.4. Команды управления циклами
- •6. Команды обработки строк
- •6.1. Команды пересылки строк movs, movsb, movsw
- •6.2. Префиксы повторения
- •6.3. Команды сравнения строк. Команда cmps.
- •6.4. Команды сканирования строк
- •6.5. Команды загрузки и сохранения строки
- •7. Взаимодействие языков Си и Ассемблера
- •7.1. Внутренняя структура программы на языке Си для ibm pc
- •7.2. Использование функций на языке Ассемблера
- •7.2.1. Основы взаимодействия языков Си и Ассемблера
- •7.2.2. Передача управления в подпрограмму и обратно
- •7.2.3. Использование глобальных данных
- •7.2.4. Использование аргументов функции
- •7.2.5. Возвращение значения через имя подпрограммы
- •7.2.6. Использование аргументов
- •7.3. Вызов функций на языке Си из программ на языке Ассемблера
- •7.4. Использование локальных данных
- •8. Арифметические команды
- •8.1. Форматы хранения десятичных чисел
- •8.2. Команды сложения
- •8.3. Коррекция результата сложения для bcd-форматов
- •8.4. Команда приращения значения приемника на единицу
- •8.5. Команды вычитания
- •8.6. Коррекция результата вычитания для bcd-форматов
- •8.7. Команда уменьшения содержимого приемника на единицу
- •8.8. Команда обращения знака
- •8.9. Команды умножения
- •8.10. Коррекция результатов умножения
- •8.11. Команды деления
- •8.12. Коррекция результатов деления
- •8.13. Команды расширения знака
- •9. Команды манипулирования битами
- •9.1. Логические команды and, or и xor
- •9.2. Команда логического отрицания nот
- •9.3. Команда проверки test
- •9.4. Команды сдвига и циклического сдвига
- •9.4.1. Команды сдвига
- •9.4.2. Команды циклического сдвига
- •10. Команды работы с флагами
- •10.1. Команды управления флагами
- •10.2. Команды пересылки флагов
- •11. Псевдооператоры определения идентификаторов и операции
- •11.1. Псевдооператоры определения идентификаторов
- •11.2. Операции
- •11.2.1. Арифметические операции
- •11.2.2. Логические операции
- •11.2.3. Операции отношения
- •11.2.4. Операции, возвращающие значения
- •11.2.5. Операции присваивания атрибутов
- •12. Условные псевдооператоры
- •13. Макроопределения
- •13.1. Сравнение макроопределений и процедур
- •13.2. Состав макроопределений
- •13.3. Псевдооператоры макроассемблера
- •13.3.1. Псевдооператор local
- •13.3.2. Псевдооператоры повторения
- •13.3.3. Условные псевдооператоры
- •13.3.4. Псевдооператор eхiтм
- •13.4. Операции в макроопределениях
- •13.5. Задание макроопределений в исходных программах
- •13.5.1. Использование библиотеки макроопределений
- •13.5.2. Указания для задания макроопределений
- •13.5.3. Считывание библиотеки макроопределений в программу
- •13.5.4. Удаление макроопределений
2.2.5. Псевдооператоры определения данных
Для хранения переменных в программах используют ячейки памяти. Наиболее употребительными псевдооператорами, резервирующими память для переменных, являются псевдооператоры
DB (Define Byte – определить байт),
DW (Define Word – определить слово),
DD (Define Double Word – определить двойное слово).
Они различаются в основном по объему резервируемой памяти. Псевдооператор DB резервирует 8-битовые байты, DW – 2-байтовые слова, а DD – 4-байтовые двойные слова.
Псевдооператоры имеют следующий формат:
[имя] DB выражение [,...]
[имя] DU выражение [,...]
[имя] DD выражение [,...]
Операнд выражение может принимать одну из нескольких форм.
Выражение может быть константой.
VD DB 127D ; десятичный формат
VD1 DB 127 ; по умолчанию
VH DB 0FFFH ; шестнадцатиричный (должен начинаться с цифры)
VB DB 1100B ; двоичный
VO DB 253O ; восьмеричный
VO1 DB 253Q ; восьмеричный
Можно вводить и отрицательные числа. В случае десятичного числа перед ним достаточно поставить знак минус (например, –32). Если число двоичное или шестнадцатиричное, то его надо вводить в дополнительном коде.
Псевдооператоры можно использовать для создания в памяти таблиц, при этом элементы таблицы перечисляются через запятую. Следующие последовательности задают две таблицы по 4 элемента в каждой, одна из байтов, а другая из слов:
B_TABLE DB 0,0,0,8 ; Таблица байтов
W_TABLE DW 0,1000,500,0 ; Таблица слов
Обратите внимание на то, что первые три элемента таблицы B_TABLE имеют одинаковые значения. У Ассемблера есть операция DUP (duplicate – дублировать), которая позволяет повторять операнды, не набирая их каждый раз заново. С помощью операции DUP определение таблицы B_TABLE можно записать:
B_TABLE DB 3 DUP(0),8 ; Таблица байтов
При определении переменной без присваивания ей начального значения в поле выражение указывается вопросительный знак (?). Например, следующий оператор резервирует байт, но не заносят в него какое-либо значение:
TEMP DB ?
Можно зарезервировать ячейки памяти для целой таблицы. Например, оператор
TABLE DB 12 DUP(?) ; Таблица байтов
зарезервирует 12 байт памяти.
Псевдооператор DB может воспринимать в качестве выражения также строку символов. Это позволяет заносить в память сообщения об ошибках, заголовки таблиц и всякий другой текст. Для этого текст надо заключить в кавычки или апострофы. Приведем пример:
MSG DB 'Ошибка'
Переменные используются также для хранения адресов ячеек памяти, на которые могут ссылаться команды программы. Как мы уже знаем, каждый адрес имеет две компоненты: номер блока и смещение.
Если метка находится в том же сегменте, что и команда, которая на нее ссылается, то достаточно указать только смещение. Так как смещение имеет длину 16 битов, то для его хранения надо использовать оператор DW. Например, оператор
L_N DW L1
присвоит 16-битовому смещению метки L1 имя L_N. Содержащую смещение переменную называют указателем.
Если метка и команда, которая на нее ссылается, находятся в разных сегментах, то кроме смещения микропроцессору 8088 надо знать еще и номер блока метки. Оба этих компонента адреса можно получить с помощью оператора DD. Например, оператор
L_F DD L1
присвоит 16-битовое смещение и 16-битовый номер блока метки L1 32-битовой переменной L_F.
Переменную, содержащую оба компонента адреса, называют вектором.
