avangard-pressa.ru

Rep/repe/repz/repne/repnz - Программирование

Префикс повторить/повторить пока равно/повторить пока нуль/повторить пока не равно/повторить пока не нуль определяет условие повторения строковой команды.

Префикс REP используется в сочетании с командами MOVS (переслать строку) и STOS (сохранить строку). При этом он трактуется "Повторять, пока не кончилась строка" (СХ не нуль).

Префиксы REPE и REPZ совершенно идентичны. Они используются с командами CMPS (сравнить строку) и SCAS (просканировать строку) и действуют точно так же, как префикс REP, однако перед каждым следующим повторением проверяется состояние флага нуля (FZ). Если флаг взведен, команда повторяется, если флаг сброшен, повторения не будет.

Префиксы REPNE и REPNZ также идентичны. Они совпадают с префиксами REPE и REPZ, однако действие флага FZ на них прямо противоположно.

MOVS (строка назначения),(строка-источник)

Команда MOVS (переслать строку) пересылает байт или слово из операнда-источника (адресуемого регистром SI) в операнд назначения (адресуемый регистром DI) и изменяет содержимое этих регистров так, чтобы каждый указывал на следующий элемент строки. При использовании этой команды вместе с префиксом повторения осуществляется блочная пересылка память-память. Операнды, указанные в команде определяют только формат пересылаемой единицы данных (байт или слово).

MOVSB, MOVSW

Команды MOVSB (переслать строку байтов) и MOVSW (переслать строку слов) полностью соответствуют команде MOVS, но не имеют операндов, так как формат пересылаемых данных явно указан в мнемонике команды (MOVSB - байты, MOVSW - слова).

CMPS (строка назначения),(строка-источник)

Команда CMPS (сравнить строки) вычитает байт или слово источника (адресуемого регистром SI) из байта или слова назначения (адресуемого регистром DI). Сами операнды при этом не меняются. Команда CMPS воздействует на флаги AF, CF, OF, PF, SF и ZF, а также изменяет содержимое регистров SI и DI так, чтобы каждый из них указывал на следующий элемент соответствующей строки. Действие команды CMPS на флаги аналогично действию команды CMP. Если команде CMPS предшествует префикс REPE или REPZ, операция трактуется так: "производить сравнение пока не достигнут конец строки (СХ не равен нулю) и пока элементы строк равны". Если команде предшествует префикс REPNE или REPNZ - трактовка такова: "производить сравнение пока не достигнут конец строки и элементы строк различны".

SCAS (строка назначения)

Команда SCAS (сканировать строку) вычитает элемент строки назначения (байт или слово), адресуемый регистром DI, из содержимого регистра AL (если строка состоит из байтов) или АХ (если строка состоит из слов). Содержимое элемента строки назначения и аккумулятора при этом остается неизменным. Команда SCAS воздействует на флаги AF, CF, OF, PF, SF и ZF, а также изменяет содержимое регистра DI так, чтобы он указывал на следующий элемент строки. Если команде SCAS предшествует префикс REPE или REPZ, операция трактуется так: "производить сравнение пока не достигнут конец строки (СХ не равен нулю) и пока элементы строки равны содержимому аккумулятора". Если команде предшествует префикс REPNE или REPNZ трактовка такова: "производить сравнение пока не достигнут конец строки и элементы строки не равны содержимому аккумулятора".

LODS (строка-источник)

Команда LODS (загрузка строки) пересылает элемент строки (байт или слово), адресуемый регистром SI в регистр AL или AX, и изменяет содержимое регистра SI так, чтобы он указывал на следующий элемент строки.

STOS (строка назначения)

Команда STOS (сохранение строки) пересылает (байт или слово) из регистра AL или AX в элемент строки, адресуемый регистром DI, и изменяет содержимое регистра DI так, чтобы он указывал на следующий элемент строки. Эта команда удобна для инициализации некоторой области памяти какой-либо константой.

1.3.5. Команды передачи управления

Порядок выполнения команд в процессорах 80х86 и 80х88 определяется содержимым регистра сегмента кода (CS) и счетчика команд (IP). Регистр CS содержит базовый адрес текущего сегмента кода, т.е. 64-килобайтного фрагмента памяти, из которого в данный момент извлекаются коды команд. Содержимое счетчика команд IP используется как смещение относительно начала текущего сегмента кода. Содержимое CS и IP однозначно определяет то место в памяти, из которого будет извлечена следующая команда. Команда передачи управления (команды переходов) изменяют содержимое регистров CS и IP. Всего имеется четыре группы команд передачи управления, которые приведены в таблице.

Команды безусловного перехода CALL Вызов процедуры RET Возврат из процедуры JMP Переход Команды условного перехода JA/JNBE Переход если выше/если не ниже или равно JAE/JNB Переход если выше или равно/если не ниже JB/JNAE Переход если ниже/если не выше или равно JBE/JNA Переход если ниже или равно/если не выше JC Переход если перенос JE/JZ Переход если равно/если нуль JG/JNLE Переход если больше/если не меньше или равно JGE/JNL переход если больше или равно/если не меньше JL/JNGE Переход если меньше/если не больше или равно JLE/JNG Переход если меньше или равно/если не больше JNC Переход если нет переноса JNE/JNZ Переход если не равно/если не нуль JNO Переход если не переполнение JNP/JPO Переход если нечетно JNS Переход если не знак JO Переход если переполнение JP/JPE переход если четно JS Переход если знак Управление циклами LOOP Цикл LOOPE/ Цикл если равно/если нуль LOOPZ LOOPNE/ Цико если не равно/если не нуль LOOPNZ JCXZ Переход если содержимое регистра СХ равно нулю Прерывания INT Прерывание INTO Прерывание если переполнение IRET Возврат из прерывания

1.3.5.1. Команды безусловного перехода

Команда безусловного перехода передает управление указанной команде в том же сегменте (внутрисегментный переход) или за его пределы (межсегментный переход). Внутрисегментный переход обычно называется ближним (NEAR), а межсегментный - дальним (FAR).

CALL (имя процедуры)

Команда CALL передает управление внешней процедуре, предварительно сохранив в стеке информацию для последующего возврата в вызывающую процедуру при помощи команды RET. Команда CALL имеет различную форму записи в зависимости от типа вызываемой процедуры (дальняя или ближняя). Команда RET, которой завершается вызываемая процедура, должна иметь тот же тип (дальний или ближний), что и вызывающая процедуру команда CALL. Адрес вызываемой процедуры может быть задан непосредственно в команде CALL, в памяти или в регистре.

При внутрисегментной непосредственной команде CALL в стеке сохраняется текущее содержимое счетчика команд (IP), который указывает на первый байт следующей за CALL командой. Относительное смещение вызываемой процедуры содержится в самой команде (диапазон плюс - минус 32К).

При внутрисегментной косвенной команде CALL в стеке сохраняется текущее содержимое счетчика команд (IP), который указывает на первый байт следующей за CALL командой. Относительное смещение вызываемой процедуры может содержаться в слове памяти или в 16-разрядном регистре.

При межсегментной непосредственной команде CALL в стеке сохраняется текущее содержимое регистра CS, в регистр CS помещается значение сегмента из команды CALL, затем в стеке сохраняется текущее содержимое регистра IP, и в него записывается значение смещения из команды.

При межсегментной косвенной команде CALL происходит то же, что описано выше, но значения сегмента и смещения берутся из памяти или из регистров, причем первое слово содержит смещение, а второе - сегмент вызываемой процедуры.

RET (необязательное значение)

Команда RET возвращает управление из вызванной процедуры команде, следующей за командой CALL. Если возврат осуществляется из ближней процедуры, возврат является внутрисегментным (содержимое регистра CS остается неизменным). При возврате из дальней процедуры возврат является межсегментным (из стека восстанавливаются значения CS и IP). Если в команде задано необязательное значение, команда RET добавляет это значение к указателю стека SP. Это позволяет пропускать параметры, передаваемые через стек перед командой CALL.

JMP (цель)

Команда JMP осуществляет безусловную передачу управления на указанный адрес. В отличие от команды CALL команда JMP не сохраняет в стеке информацию об адресе возврата. Так же, как в команде CALL адрес целевого операнда может быть указан непосредственно в команде (непосредственная команда JMP), а также в памяти или в регистре (косвенная команда JMP).

При внутрисегментной непосредственной команде JMP к счетчику команд IP добавляется смещение, указанное в команде. Если компилятор обнаруживает, что целевой адрес находится на расстоянии меньшем, чем 127 байтов от команды, он автоматически генерирует двухбайтовый вариант команды, называемый коротким переходом (SHORT JMP), в противном случае генерируется ближний переход (NEAR JMP), в котором диапазон перехода составляет плюс-минус 32К.

При внутрисегментной косвенной команде JMP смещение, добавляемое к регистру IP, может быть указано в памяти или в 16-разрядном регистре. В последнем случае значение смещение берется из регистра, указанного в команде.

При межсегментной непосредственной команде JMP значения IP и CS заменяются значениями, указанными в команде.

При межсегментной косвенной команде JMP значения IP и CS могут быть заменены только значениями расположенными в памяти. При этом первое слово двойного слова содержит смещение, второе слово - сегмент.

1.3.5.2. Команды условного перехода

Мнемон. Проверяемое условие Переход, если ... JA/JNBE (CF or ZF) = 0 выше/не ниже или равно JAE/JNB CF = 0 выше или равно/не ниже JB/JNAE CF = 1 ниже/не выше или равно JBE/JNA (CF or ZF) = 1 ниже или равно/не выше JC CF = 1 перенос JE/JZ ZF = 1 равно/нуль JG/JNLE [(SF xor OF) or ZF] = 0 больше/не меньше или равно JGE/JNL (SF xor OF) = 0 больше или равно/не меньше JL/JNGE (SF xor OF) = 1 меньше/не больше или равно JLE/JNG [(SF xor OF) or ZF] = 1 меньше или равно/не больше JNC CF = 0 нет переноса JNE/JNZ ZF = 0 не равно/не нуль JNO OF = 0 не переполнение JNP/JPO PF = 0 нечетно JNS SF = 0 не знак JO OF = 1 переполнение JP/JPE PF = 1 четно JS SF = 1 знак

Команды условного перехода выполняют или не выполняют передачу управления на указанный адрес в зависимости от состояния флагов процессора не момент выполнения команды. Эти команды (см. таблицу ниже) проверяют различные комбинации флагов и условий. Если условие истинно, осуществляется передача управления на указанный адрес. Если условие неверно, управление передается команде, следующей за командой условного перехода. Все команды условного переходя являются короткими (SHORT), так что диапазон переходов в этих командах лежит в диапазоне от -128 до +127 байтов. При этом следует иметь в виду, что команде JMP 00h соответствует переход на следующую команду.

1.3.5.3. Команды прерывания

Команды прерывания позволяют вызывать процедуры обслуживания прерываний из программ так же как это сделало бы устройство. Программные прерывания имитируют действие аппаратных прерываний.

INT (тип прерывания)

Команда INT (прерывание) инициирует выполнение процедуры обработки прерывания, определенного в операнде "тип прерывания". Эта команда сохраняет в стеке регистр флагов, очищает флаги TF и IF для запрещения пошагового выполнения и маскируемых прерываний. Флаги сохраняются в том же формате, что и в команде PUSHF. Затем в стеке сохраняется текущее содержимое регистра сегмента кода CS, вычисляется адрес вектора прерывания путем умножения "типа прерывания" на четыре, и второе слово этого вектора помещается в регистр сегмента кода CS. Далее в стеке сохраняется текущее содержимое счетчика команд IP, и в этот регистр записывается первое слово вычисленного вектора прерывания.

INTO

Команда INTO (прерывание при переполнении) генерирует программное прерывание, если установлен флаг переполнения (OF), в противном случае управление передается следующей команде. Вектор прерывания INTO расположен по адресу 10h. Действие этой команды аналогично действию команды INT.

IRET

Команда IRET (возврат из прерывания) возвращает управление в точку, откуда прерывание было вызвано, заполняя из стека регистры IP, CS и регистр флагов. Команда IRET используется для выхода из процедур обработки как программных, так и аппаратных прерываний.

1.3.6. Прочие команды

К прочим командам относятся команды, приведенные ниже в таблице.

Прочие команды STC Установка флага переноса CLC Сброс флага переноса CMC Инверсия флага переноса STD Установка флага направления CLD Сброс флага направления STI Установка флага разрешения прерываний CLI Сброс флага разрешения прерываний HLT Останов процессора NOP Отсутствие операции

CLC

Команда CLC (очистка флага переноса) обнуляет флаг переноса CF и не воздействует нина какие другие флаги.

CMC

Команда СМС (инверсия флага переноса) изменяет значение флага переноса CF на противоположное и не воздействует ни на какие другие флаги.

STC

Команда STC (установка флага переноса) устанавливает флаг переноса CF в 1 и не воздействует нина какие другие флаги.

CLD

Команда CLD (сброс флага направления) сбрасывает флаг переноса DF в 0 и не воздействует нина какие другие флаги.

При сброшенном флаге направления выполнение строковых команд сопровождается автоинкрементом регистра SI и/или DI.

STD

Команда STD (установка флага направления) устанавливает флаг переноса DF в 1 и не воздействует нина какие другие флаги. При установленном флаге направления выполнение строковых команд сопровождается автодекрементом регистра SI и/или DI.

CLI

Команда CLI (сброс флага разрешения прерываний) сбрасывает флаг переноса IF в 0 и не воздействует нина какие другие флаги. При сброшенном флаге разрешения прерывания процессор не реагирует на внешние запросы прерывания, поступающие на вход INTR. Этот запрет не касается немаскируемого прерывания NMI и программных прерываний.

STI

Команда STI (установка флага разрешения прерываний) устанавливает флаг переноса IF в 1 и не воздействует нина какие другие флаги. При установленном флаге разрешения прерывания разрешены все прерывания.

HLT

Команда HLT (останов) переводит процессор в состояние останова, из которого он может быть выведен только сбросом или сигналом запроса прерывания. Команда HLT не воздействует ни на какие флаги.

NOP

Команда NOP (нет операции) не влияет ни на работу процессора ни на флаги.

ГЛАВА 2.

ПРИМЕРЫ ПРОГРАММ

2.1 ВВОД-ВЫВОД СИМВОЛЬНОЙ ИНФОРМАЦИИ

В этой главе рассмотрены различные аспекты ввода-вывода символьной информации с использованием функций DOS и BIOS, а также непосредственный вывод информации в область видеопамяти. Все приемы программирования представлены в виде примеров программ, решающих конкретные задачи.

Задача 2.1.1. Вывести на середину пустого экрана мигающее слово "ТЕКСТ" в текстовом режиме CGA 80 символов * 25 строк.

а) Используя функции DOS.

б) Используя функции BIOS.

в) Помещая символы непосредственно в экранную область.