- •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. Удаление макроопределений
3.2. Команды push и рор
Стек необходим для временного сохранения данных (содержимого регистров и ячеек памяти) при работе программы.
Команда PUSH помещает содержимое регистра или ячейки памяти размером в 16-битовое слово на вершину стека. А команда POP снимает слово с вершины стека и помещает его в ячейку памяти или регистр. Команды PUSH и POP имеют следующие форматы:
PUSH источник
POP приемник
Под вершиной стека мы понимаем ячейку в сегменте стека, адрес которой содержится в указателе стека SP. Стек "растет" по направлению к младшим адресам памяти (к ячейке 0), поэтому первое помещаемое в стек слово запоминается в ячейке стека с наибольшим адресом, следующее – на два байта ниже и т.д.
Регистр SP всегда указывает на слово, помещенное в стек последним. Следовательно, команда PUSH вычитает 2 из значения указателя стека, а затем пересылает операнд-источник (слово) в стек. Действуя обратным образом, команда POP пересылает в операнд-приемник слово, адрес которого содержится в регистре SP, а затем добавляет 2 к содержимому этого регистра.
Команды PUSH и POP удобны для копирования содержимого одного регистра сегмента в другой. Например, с помощью команд
PUSH ES
POP DS
можно скопировать значение регистра ES в регистр DS.
Для этого метода не требуется использования регистра общего назначения для промежуточного копирования значения регистра сегмента. Однако, исполнение пары команд PUSH–POP требует в несколько раз больше времени, чем исполнение пары команд MOV.
4. Режимы адресации
4.1. Регистровая и непосредственная адресация
При регистровой адресации микропроцессор извлекает операнд из регистра или загружает его в регистр.
Например, команда
MOV АХ, СХ
копирует 16-битовое содержимое регистра счетчика СХ в аккумулятор АХ. Содержимое регистра СХ не изменяется. В данном примере микропроцессор использует регистровую адресацию для извлечения операнда-источника из регистра СХ и загрузки его в регистр-приемник АХ.
Непосредственная адресация позволяет указывать 8- или 16-битовое значение константы в качестве операнда-источника. Эта константа содержится в команде (куда она помещается Ассемблером), а не в регистре или в ячейке памяти.
Например, команда
MOV СХ, 5
загружает значение 5 в регистр СХ.
4.2. Исполнительный адрес
Смещение, которое вычисляется для доступа к находящемуся в памяти операнду, называется исполнительным адресом операнда. Исполнительный адрес показывает, на каком расстоянии (в байтах) располагается операнд от начала сегмента, в котором он находится.
4.3. Прямая адресация
При прямой адресации исполнительный адрес является составной частью команды (так же, как значения при непосредственной адресации). Микропроцессор добавляет этот исполнительный адрес к сдвинутому на 4 разряда содержимому регистра сегмента данных DS и получает 20-битовый физический адрес операнда.
Обычно прямая адресация применяется, если операндом служит метка. Например, команда
MOV AX, TABLE
загружает содержимое ячейки памяти TABLE в регистр АХ.
4.4. Косвенная регистровая адресация
При косвенной регистровой адресации исполнительный адрес операнда содержится в регистре ВХ (базовом регистре), регистре ВР (регистре указателя базы), регистрах SI или DI (индексных регистрах). Косвенные регистровые операнды надо заключать в квадратные скобки, чтобы отличить их от регистровых операндов. Например, команда
MOV АХ, [ ВХ ]
загружает в регистр АХ содержимое ячейки памяти, адресуемой значением регистра ВХ.
Как поместить смещение адреса в регистр ВХ? Один из методов состоит в применении операции OFFSET (смещение) к адресу ячейки памяти.
Операция OFFSET возвращает значение смещения адреса переменной или метки. Например, оператор
MOV ВХ, OFFSET TАBLE
загрузит смещение адреса переменной TABLE в регистр ВХ.
Таким образом, для загрузки слова из ячейки TABLE в регистр АХ можно воспользоваться последовательностью команд
MOV ВХ, OFFSET TABLE
MOV АХ, [ ВХ ]
Эти две команды выполняют те же действия, что и одна команда MOV АX, TABLE
с той разницей, что в первом случае предыдущее содержимое регистра ВХ уничтожается.
Если нужен доступ лишь к одной ячейке памяти (в данном случае TABLE), то разумнее воспользоваться одной командой. Однако для доступа к нескольким ячейкам, начиная с данного базового адреса, гораздо лучше иметь исполнительный адрес в регистре. Почему? Потому что содержимым регистра можно манипулировать, не извлекая каждый раз новый адрес.
