- •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. Удаление макроопределений
11.2.4. Операции, возвращающие значения
Операции этой группы предоставляют информацию о переменных или метках программы.
Операция, обозначенная знаком доллара ($), возвращает смещение адреса текущего оператора (текущее значение счетчика адреса).
Эта операция полезна, если мы хотим заставить Ассемблер вычислить длины строк символов.
Пример. При трансляции операторов
MESSAGE DB "Ошибка"
MESSAGEL EQU $ – MESSAGE
Ассемблер определит число символов в строке MESSAGE и присвоит его константе MESSAGEL. При выдаче сообщения на экран мы можем использовать значение константы MESSAGEL для задания числа выдаваемых символов.
Операции SEG и OFFSET возвращают значения номера блока и смещения адреса переменной или метки. Последнюю операцию мы уже встречали, когда рассматривали режимы адресации. Формат
SEG переменная или SEG метка
OFFSET переменная или OFFSET метка
Пример. Операторы
MOV АХ, SEG TABLE
MOV ВХ, OFFSET TABLE
загрузят номер блока и смещение адреса переменной TABLE в регистры АХ и ВХ соответственно.
Операция TYPE возвращает числовое значение, идентифицирующее тип атрибута переменной или тип атрибута дистанции метки. Формат
TYPE переменная или TYPE метка
Для переменной операция TYPE возвращает
1, если переменная имеет тип BYTE,
2, если она имеет тип WORD.
Для метки операция TYPE возвращает
–1, если она имеет атрибут NEAR,
–2, если она имеет атрибут FAR.
Операции LENGTH (длина) и SIZE (размер) полезны только для переменных, при определении которых была использована операция дублирования DUP. Формат операций
LENGTH переменная
SIZE переменная
Операция LENGTH возвращает число единиц определения (байтов или слов) в зарезервированной для переменной памяти.
Пример. Операторы
TABLE DW 100 DUP(1)
MОV CX, LENGTH TABLE ; Загрузить в CX число слов в
;таблице TABLE
загрузят 100 в регистр СХ.
Если операция LENGTH используется для переменной, в определении которой операция DUP не участвовала, то она возвратит 1.
Операция SIZE возвращает число байтов, зарезервированных для переменной. Иначе говоря, произведение операций LENGTH и TYPE.
Для определенной выше переменной TABLE оператор
MOV СХ, SIZE TABLE ; Загрузить в СХ число байтов
; в таблице TABLE
загрузит 200 в регистр СХ.
11.2.5. Операции присваивания атрибутов
Операция указателя PTR нами уже рассматривалась. Она позволяет изменить у операнда атрибут типа (BYTE или WORD) или атрибут дистанции (NEAR или FAR).
Пример. Этой операцией можно воспользоваться для доступа к байтам в таблице слов. Если таблица определена следующим образом:
WORD_TABLE DW 100 DUP (?)
то оператор
FIRST_BYTE EQU BYTE PTR WORD_TABLE
присвоит имя первому байту таблицы WORD_TABLE.
Пример. Изменение атрибута дистанции метки. Если программа содержит оператор
START: МOV СХ, 100
то метка START имеет атрибут NEAR. Это позволяет ссылаться на нее команде перехода JMP, находящейся в том же сегменте. Чтобы на эту метку могли ссылаться команды JMP, которые находятся в других сегментах, надо дать указанному оператору альтернативную метку, имеющую атрибут FAR. Это можно сделать оператором
FAR_START ЕQU FAR PTR START
Операции замены сегмента (DS:, ES:, SS: или CS:) и операция SHORT нами также уже рассматривались.
Операция THIS
– во-первых, создает адресный операнд с заданным атрибутом типа BYTE или WORD либо дистанции NEAR или FAR,
– во-вторых определяет для него те же атрибуты сегмента и смещения, которые должны быть у адреса следующей доступной ячейки памяти.
Формат операции
THIS атрибут или THIS дистанции
Пример.
Последовательность операторов
FIRST_BYTE EQU THIS BYTE
WORD_TABLE DW 100 DUP(?)
создает адресную константу FIRST_BYTE со значением, равным адресу переменной WORD_TABLE, и приписывает ей атрибут BYTE. Она выполняет ту же функцию, что и ранее рассмотренный оператор
FIRST_BYTE EQU BYTE PTR WORD_TABLE
С помощью операции THIS можно приписать ячейке с командой атрибут FAR. Модифицируем один из предыдущих примеров: при трансляции операторов
START EQU THIS FAR
МOV СX, 100
команда MOV получит атрибут FAR. Это позволит находящимся в других сегментах командам JMP обеспечить прямой переход к метке START.
Операции HIGH и LOW возвращают соответственно старший и младший байты 16-битового выражения. Формат
HIGH выражение или HIGH значение
LOW выражение или LOW значение
Пример. Если константа определена оператором
CONST EQU 0ABCDH
то оператор
MOV АН, НIGН CONST
загрузит в регистр АН значение 0АВН.
