
- •Команды и директивы
- •Общая структура программы на ассемблере
- •Основные элементы языка ассемблер:
- •Прямая адресация
- •Базовые команды передачи управления
- •Косвенный ближний (внутрисегментный) переход
- •Переходы по условию
- •Команды перехода по условию
- •Цикл со счетчиком
- •Процедуры
- •Доступ к параметрам
- •Средства обработки чисел с плавающей запятой
- •Архитектура сопроцессора
- •Форматы команд
Переходы по условию
Это логические структуры высокого уровня в системе команд Intel, которые можно реализовать с помощью команд сравнения и переходов. Логическая структура – это несколько условных утверждений, работающих совместно. Данная структура выполняется в 2 шага: 1 – выполняется арифметическая команда или команда сравнения для установки одного или более флагов; на шаге 2 команда условного перехода заставляет процессор перейти к выполнению с нового адреса. Команды условного перехода делятся на 2 группы: арифметические команды и команды сравнения, по результату которых, процессор устанавливает определенные флаги; команды условного перехода, при которых процессор принимает решение на основе состояния флагов. Команды из разных групп работают совместно. Нельзя сравнивать 2 участка памяти в команде cmp. В качестве параметра для команды cmp нельзя использовать сегментный регистр.
Команды перехода по условию
Для процессора Intel все команды условного перехода реализуют короткий переход, то есть смещение в пределах. Команды перехода по условию передают управление по указанному адресу, когда признак условия установлен. При каждом условном переходе проверяется один или несколько флагов, возвращая результат. Процессор делает переход на основании анализа флага-нуля, флага-переноса, флага-паритета или регистра (Cx или ECx). Базовых команд перехода всего 17, но так как они используют различную мнемонику, их 31. Первая группа команд реагирует на то или иное значение флага нуля и на флаг паритета, поэтому в мнемокоде данной команды всегда указывается первая буква проверяемого флага. Данная группа команд не требует обязательного наличия команд сравнения перед своим выполнением. Им достаточно любой команды, которая выбрасывает нужный флаг. Вторая группа команд проверяет не состояние флагов, а содержимое регистра Cx или Ecx. Третяя группа команд реагирует на флаг четности.
Переходы, основанные на общем сравнении
Команды управления циклами
Цикл – это блок кода, завершающийся условным переходом. Циклы в языке ассемблер служат для работы с массивами, для проверки портов ввода вывода, для очистки блоков памяти, для чтения строк с клавиатуры, для вывода их на экран и так далее. Команды этого вида организуют циклические вычисления, используя регистр-счетчик Cx по его прямому назначению. При этом в регистр Cx предварительно должно быть занесено количество повторений цикла. Цикл выполняется, при этом анализируя не только содержимое регистра Cx, но и состояние флага-нуля. Нужно помнить, что флаг нуля устанавливается в значении 1, если результат последней арифметической операции был нулевым или 2 операнда в последней операции сравнения не совпали.
Цикл со счетчиком
Во всех случаях число шагов в цикле определяется содержимым регистра Cx, поэтому максимальное число шагов 65536. Команда Loop выполняет декремент регистра Cx и, если содержимое не равно 0, осуществляет переход на указанную метку вперед или назад. Циклы, превышающие 128 байт, требуют использование условных переходов с помощью безусловных. Обычно, метка при реализации цикла помещается перед первым предложением тела цикла, а команда Loop является последней командой цикла. Команда Loop не влияет на флаги.
Так как условие выхода из цикла проверяется в конце, то при значении регистра Cx=0 цикл все равно выполняется, поэтому, до начала цикла обязательно проверяют содержимое регистра Cx на ноль. Выписать все логические команды языка ассемблер, для чего каждая команда используется, каждой мнемокод.