
- •Команды и директивы
- •Общая структура программы на ассемблере
- •Основные элементы языка ассемблер:
- •Прямая адресация
- •Базовые команды передачи управления
- •Косвенный ближний (внутрисегментный) переход
- •Переходы по условию
- •Команды перехода по условию
- •Цикл со счетчиком
- •Процедуры
- •Доступ к параметрам
- •Средства обработки чисел с плавающей запятой
- •Архитектура сопроцессора
- •Форматы команд
Прямая адресация
В прямой адресации предполагается, что входной операнд находится в памяти непосредственно за кодом команды. Операнд обычно представляет собой константу, которую нужно куда-то переслать, к чему-то прибавить и так далее. Память с точки зрения процессора представляет собой последовательность байтов, каждому из которых присвоен уникальный адрес. Если у операнда, располагающегося в памяти известен адрес, то его можно использовать: 1 – адрес памяти указывается в команде, обычно в символической форме и поступает в ход команды; 2 – операндом является содержимое ячейки памяти, этот способ полезен при обращении к статическим данным. При прямой адресации исполнительный адрес является составной часть команды, также как и значение при непосредственной адресации. Прямая адресация, на первый взгляд, кажется простой и наглядной. На самом деле адрес ячейки состоит из 2х компонентов: 1 – сегментный адрес – хранится в сегментном регистре; 2 – смещение – расстояние от начала сегмента данных до места размещения данных. Сегментация механизма адресации – механизм адресации, обеспечивающий существование нескольких независимых адресный пространств, как в пределах одной задачи, так и в системе в целом для защиты задач от взаимного влияния. В основе сегментации лежит понятие сегмента. Сегмент – независимый поддерживаемый на аппаратном уровне блок памяти, то есть вся память системы представляется не в виде непрерывного пространства, а в виде нескольких кусков – сегментов заданного размера (по умолчанию – 64кб), положение которых в пространстве памяти можно изменять программным путем. Операционные системы, кроме Dos, могут размещать сегменты, с которыми работает программа, в разных местах памяти и даже временно могут записывать их на диск, если времени не хватает. Так как сегменты могут оказаться где угодно, программа обращается к ним, используя вместо настоящего адреса начало сегмента 16-битное число, называемое селектором. Сегментный адрес, или селектор, хранится в сегментном регистре. Сегментные регистры – это регистры, каждый из которых определяет положение одного из рабочих сегментов или регистры, указывающие на сегменты. При всех обращениях к памяти, для расчета адреса, использую сегментный регистр. Это четыре базовых регистра. Первый сегментный регистр CS содержится начальный адрес сегмента кода. Он соответствует сегменты команд, используемых в данный момент. Этот адрес плюс величина смещения в командном указателе (регистр IP) определяют адрес команды, которая должна быть выбрана для выполнения. (!) Для обычных программ нет необходимости делать ссылки на регистр CS. Регистр DS (сегмент данных) содержит начальный адрес сегмента данных, Этот адрес плюс величина смещения, определенная в команде, указывают на конкретную ячейку в сегменте данных. Некоторые операции над строками используют дополнительный сегментный регистр ES для управления адресацией памяти. В этом случае регистр ES связывают с индексным регистром DI и эту связь обозначают парой <ES:DI>. Сегментный регистр SS (стек) – содержит начальный адрес в сегменте стека. Данная структура не является обязательной. Все эти сегменты могут и перекрываться для оптимального использования пространства в памяти.
Исполнительный адрес
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду, называется исполнительным адресом операнда. Он показывает, на каком расстоянии (в байтах) располагается операнд от начала сегмента, в котором он находится. Исполнительный адрес – 16-битовое число без знака, которое позволяет получить доступ к операндам, находящимся выше начала сегмента, на расстоянии до 65535 байтов.
Оператор смещения
Важным применением непосредственной адресации является пересылка относительных адресов. Чтобы указать, что речь идет об относительном адресе данной ячейки, а не об её содержимом, используется описатель offset, или смещение. Этот оператор возвращает 16-разрядное значение переменной от начала сегмента, а, следовательно, целевой операнд должен быть 16-разрядным. Ассемблер определяет смещение каждой переменной во время трансляции программы. Если регистр содержит адрес, то его называют указателем.
Операнды со смещением
Особенно удобно использовать операторы сложения и вычитания для доступа к списку переменных. Оператор «+» Добавляет значение к смещению переменной.
Косвенная адресация (косвенно-регистровая)
Косвенная адресация предполагает, что во внутреннем регистре процессора находится не сам операнд, а его адрес в памяти. Косвенный операнд – регистр, который содержит смещение данных в памяти. Когда смещение переменной помещено в регистр, он становится указателем метки. Синтаксически в команде этот режим адресации выражается заключением имени регистра в квадратные скобки.
Регистры состояния и управления
К ним относятся регистр флагов и регистр указателя команд. Регистр флагов – это регистр процессора, отражающий текущее состояние процессора и результат выполнения последних инструкций. В процессорах Intel регистр флагов содержит информацию о текущем состоянии процессора или о том, как выполняется та или иная арифметическая или логическая команда. Из 16 разрядов регистры флагов используют только 10 и состояние регистра флага имеет отношение к управлению в защищенном режиме. В регистре флагов каждый бит устанавливается в единицу при определенных условиях, либо установка в единицу изменяет поведение процессора. Флаг считается установленным, если соответствующий бит равен 1, или сброшенным, если бит равен 0. Все задействованные виды имеют соответствующие имена. В данном регистре каждый бит важен по отдельности. Флаги действуют независимо друг от друга и просто для удобства объединены в один регистр. Отдельные флаги могут проверяться или устанавливаться посредством специальных команд, а вся группа флагов может считываться или устанавливаться посредством пары команд, которые считывают или устанавливают весь регистр флагов. Нет необходимости запоминать положение соответствующего вида для каждого флага, так как существуют специальные команды для их управления. Однако, у программиста есть возможность изменять принудительно состояние некоторых флагов для управления процессором. Флаг направления используется командами обработки строк и влияет на передачу блока данных. Значение флага определяет направление поэлементной обработки этих операций. 0 – осуществляет счет вперед от начала строки до конца (от меньшего адреса к большему), 1 – осуществляет счет назад от конца строки к её началу (CLD=0,STD=1). Применения этих команд позволяет привести флаг в соответствии с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчика при выполнении операций со строками. Флаг прерывания (IF) предназначен для разрешения или запрещения аппаратного прерывания, то есть прерывания, вызванного различными устройствами. 1 – аппаратное прерывания разрешено (STI=1), 0 – аппаратное прерывания запрещено на момент выполнения критической процедуры (CLI=0). Флаг трассировки (TF) предназначен для организации пошаговой работы микропроцессора, задерживая процессор после выполнения каждой команды. Его состояние генерируется прерыванием int 3. Флаги состояния – флаги отображающие результаты выполнения арифметический и логический операций и заново переустанавливающийся после выполнения очередной команды. Флаг переноса устанавливается, когда результат выполнения арифметических операций с операндами без знака слишком большой для того, чтобы поместиться в выходном регистре. Регистр индицирует перенос или заем при выполнении арифметический операций. Переносом называется ситуация, когда в результате выполняется выполнение правильной команды, когда результат не помещается в регистр или ячейку памяти. Любая ошибка, возникшая по ходу выполнения программы, не приводит ни к каким последствиям, кроме установки соответствующего флага. Процессор, установив флаг, считает свою миссию выполненной и переходит к выполнению следующей команды. Если состояние флага является принципиальным при выполнении программы, то программист должен анализировать его состояние и перейти к фрагментам обработки данной ситуации. Флаг переполнения (O) – фиксирует переполнение, то есть выход результата за пределы допустимого диапазона значений (для чисел со знаком). Флаг знака (S) – устанавливается, когда в результате арифметической или логической операции получается отрицательное число. Флаг нуля (Z) – если в результате арифметической или логической операции получился ноль, то устанавливается, если число, то 1. Флаг дополнительного переноса (AF) – возникает, перенос из 3 в 4 бит. Флаг четности (P) – учитывает количество единиц в исходном результате операции. Используется при передаче информации.
Команды передачи управления
Регистр указателя команд
Следует помнить, что присущий процессору алгоритм выполнения программы заставляет его выполнять команды программы друг за другом в том порядке, как они написаны в исходном тексте программы и содержатся в выполняемом модуле. Если необходимо нарушить заданный порядок, обойти некоторый участок программы, перейти на выполнение другой ветви, передать управление подпрограмме, используются команды передачи управления. Какая команда выполняется следующей, знает только регистр IP. Это регистр указателя команд, который следит за ходом выполнения программ и указывает в каждый момент времени относительный адрес команды. Этот регистр программно недоступен, наращение адресов, наращения адресов в нем выполняет микропроцессор, учитывая при этом длины выполняемой команды. Команды переходов изменяют содержимое IP Регистра, осуществляя тем самым переход в требуемые точки программы. Иначе говоря, данный регистр, совместно с регистром CS содержит адрес следующей команды.