
- •Трансляция программы
- •Компоновка программы
- •Система команд микропроцессора
- •32 Разрядные регистры:
- •Целочисленные арифметические команды
- •Особенности реализации микропроцессоров
- •Регистры: пользовательские и системные
- •Программа на языке ассемблера
- •Цепочечные команды
- •Осуществление переходов
- •Счётчик адреса команд
- •Безусловные переходы
- •Команда безусловного перехода jmp
- •Защищённый режим работы микропроцессора
- •Регистры управления
- •Регистры системных адресов
- •Сложные структуры данных
- •Доступ к элементам массива
- •Двумерные массивы
- •Структура
- •Сложные структуры данных 2
- •Методы работы со структурой
- •Объединение
- •Модульное программирование -1
- •Технологии программирования
- •Процедуры в языке ассемблера
- •Модульное программирование – 2 Передача аргумента через регистр
- •Передача аргументов через общую область памяти
- •Передача аргументов через стек
- •Связь ассемблера с языками высокого уровня
- •Макросредства языка ассемблера
- •Создание Windows приложений на ассемблере
- •Процесс производства микропроцессора
Цепочечные команды
Существуют элементарные (или базовые) типы данных.
Непосредственные данные, представляющие собой числовые или символьные значения и являющиеся частью команды
Данные описываемые с помощью ограниченного набора директив резервирования памяти и позволяющие выполнять самые элементарные операции о размещении и инициализации числовой и символьной информации.
Работа с ними поддерживается на уровне системы команд микропроцессора. Используя данные этих типов можно формализовать и запрограммировать практически любую задачу. С целью облегчения разработки программ в язык ассемблера была введена возможность использования нескольких сложных типов данных:
Сканирование цепочки.
Scas фдрес_приёмника.
ScasB
ScaSw
ScaSd
Загрузка элемента цепочки
Lods адресс_источника
LodSb
LodSw
LodSd
Сохранение элемента в цепочке
Stos адрес_приёмника
stoSb
stoSw
stoSd
Получение элементов цепочка из порта ввода/вывода
Ins адрес_приёмника, номер порта
InSb
InSw
InSd
Вывод элементов цепочки в порт ввода/вывода
Outs номер_порта, адрес_источника
OutSb
OutSw
Outsd
Они строятся на равнении байт, слов и двойных слов
Cmpsb
Cmpsw
Cmpsd
Приведённые команды сравнивают байт слово, двойное слово из памяти по адресу esi с байтом, словом и двойным словом по адресу edi и устанавливают флаги. При этом esi и edi продвигаются.
Логически к этим командам можно отнести и дэфиксы повторения:
Rep (repeat)
Rape или repz (repeat while equal or zero)
Repne или repnz (repeat while not equal or zero)
Они предназначены для использования цепочечными командами. Префиксы указываются перед нужной цепочечной командой в поле «метки». цепочечная команда без префикса выполняется один раз. Отличие префиксов в том на каком основании приманивается решение о циклическом выполнении команды:
Либо по состоянию регистра ecx/cx
Либо по флагу нуля zf
Rep используется с командами реализующие операцию примитива, пересылки и сохранения элементов в цепочке (movs, stos). Префикс заставляет данные команды выполнятся пока содержимое ecx/cx не станет равным 0. При этом цепочечная команда перед которой стоит префикс автоматически уменьшает ecx/cx на единицу. Та же команда без префикса этого не делает.
Rape или repz заставляет цепочечную команду выполнятся пока содержимое ecx/cx не равно 0 или флаг zf равен единице. Как только одно из условий нарушается, управление передаётся следующей команде. Благодаря возможности анализа состояния флага zf наиболее эффективно эти префиксы можно использовать с командами Cmps и scas для поиска отличающихся элементов цепочки.
Repne или repnz – эти префиксы являются абсолютными синонимами. Они заставляют цепочечную команду выполнятся циклически до тех пор, пока ecx/cx не равно 0 или флаг zf равен 0. При невыполнении одного из условий работа команды прекращается.
Данные команды можно так же использовать с командами cmps и scas для поиска совпадающих элементов цепочки.
Цепочка-источник адресуемая операндом адрес_источника может находится в текущем сегменте данных определяемая регистром ds.
Цепочка-приёмник адресуемая операндом адрес_приёмника должна быть в дополнительном сегменте данных, адресуемым сегментным регистрам es. Допускается замена только регистра ds. Регистр es подменять нельзя.
Вторые части адресов – это смещение цепочек. Так же находятся в строго определённых местах для цепочки источника esi/si. Т.е. индексные регистры источника. Для цепочки получателя – это регистр edi/di – индексный регистр приёмника.
На самом деле набор команд микропроцессора имеет соответствующие машинные команды только для цепочечных команд без операндов. Команды с операндами транслятор ассемблер использует только для определения типов операндов.
После того как выясним тип элементов цепочки по их описанию в памяти генерируются одна из 3 машинных команд для каждой из цепочечных операций. По этой причине все регистры содержащие адреса ячеек должны быть инициализированы заранее, в том числе и для команд, допускающие явное указание операндов. Правильная загрузка регистров указателя обязательно требуется до выдачи любой цепочечной команды.
Есть 2 возможности направления обработки цепочки
От начала цепочки к концу в направлении пребывании адресов
От конца к началу в направлении убывания адресов
Цепочечные команды сами выполняют модификацию регистров, адресующих операндам, обеспечивая тем самым автоматическое продвижение по цепочке. Количество байт на которые эта модификация осуществляется определяется кодом команд. Знак модификации определяется значением флага направления df.
Если df равен 0, то значение индексных регистров esi/si и edi/di будут автоматически увеличиваться цепочечными командами, т.е. обработка будет осуществляется в направлении возрастании адресов. Если df равен 1, то значения регистров будет уменьшатся, а обработка будет в направлении убывания адресов.
Состоянием флага df можно управлять с помощью 2 команд без операндов:
Cld (очитить флаг направления, df=0)
Std (установит флаг направления, df=1)