- •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.1. Команды
Команда языка ассемблера в исходной программе имеет следующий вид:
[Метка:] Мнемокод [Операнд(ы)]
Метка, команда и операнд разделяются по крайней мере одним пробелом или символом табуляции. Максимальная длина строки – 132 символа. Пример:
M: MOV АХ, 0 ; Метка, команда, два операнда
Метка в языке Ассемблер может содержать латинские буквы, цифры и некоторые специальные символы. Первым символом в метке должна быть буква или специальный символ.
Мнемокод.
Мнемоническая команда указывает ассемблеру, какое действие должен выполнить данный оператор. В сегменте данных команда определяет поле, рабочую область или константу. В сегменте кода команда определяет действие. Например, MOV – имя команды пересылки данных.
Операнд
Если команда специфицирует выполняемое действие, то операнд определяет начальное значение данных или элементы, над которыми выполняется действие по команде. Команда может иметь один или, два операнда, или вообще быть без операндов.
В командах с двумя операндами первый из них представляет собой приемник, а второй – источник. Операнд-источник определяет значение, которое берется микропроцессором для сложения, вычитания, сравнения со значением операнда-приемника или просто для загрузки в операнд-приемник. Поэтому при исполнении команды операнд-источник никогда не изменяется, в то время как операнд-приемник изменяется почти всегда
В нашем случае у команды MOV операнд-приемник – регистр АХ, а операнд источник – константа 0.
Комментарии
Комментарий начинается на любой строке исходного модуля с символа «точка с запятой» (;). Ассемблер полагает в этом случае, что все символы, находящиеся справа от ";", являются комментарием.
Комментарий может занимать всю строку или следовать за командой на той же строке.
Комментарии не приводят к генерации машинных кодов, поэтому включение комментариев не влияет на эффективность выполнения программы.
2.2. Псевдооператоры
Ассемблер имеет ряд псевдооператоров (или директив), которые позволяют управлять процессом ассемблирования и формирования листинга. Они действуют только в процессе ассемблирования программы и не генерируют машинных кодов.
Рассмотрим наиболее важные псевдооператоры.
2.2.1. Псевдооператор segment
Любые ассемблерные программы содержат по крайней мере один сегмент – сегмент кода.
Псевдооператор SEGMENT служит для описания сегмента и имеет следующий формат:
имя SEGMENT [параметры]
. . . . . . .
имя ENDS
Имя сегмента должно обязательно присутствовать и быть уникальным. Псевдооператор ENDS означает конец сегмента. Оба псевдооператора SEGMENT и ENDS должны иметь одинаковые имена. Псевдооператор SEGMENT может содержать несколько типов параметров.
1. Выравнивание. Данный параметр определяет границу начала сегмента. Обычным значением является PARA, по которому сегмент устанавливается на границу параграфа. Оно же в случае отсутствия принимается по умолчанию.
2. Объединение. Этот элемент определяет, объединяется ли данный сегмент с другими сегментами в процессе компоновки после ассемблирования.
Сегмент стека определяется с использованием описания STACK:
имя SEGMENT PARA STACK
Если отдельно ассемблированные программы должны объединяться компоновщиком, то можно использовать типы объединений: PUBLIC, COMMON и MEMORY. В случае, если программа не должна объединяться с другими программами, то указание этих типов должно быть опущено.
3. Класс. Данный элемент, заключенный в апострофы, используется для группирования относительных сегментов при компоновке.
имя SEGMENT PARA STACK 'Stack'
