E N D
Цепочечные команды Под цепочкой понимается последовательность байт, слов или двойных слов в памяти, а цепочечной операцией называется операция, которая выполняется над каждым элементом цепочки. Эти команды не выполняют функций, которые невозможно реализовать другими командами, но значительно сокращают время обработки цепочек благодаря мощному набору примитивных команд, которые имеют длину 1 байт. Любой из базовых примитивов допускает один из 4 форматов: МнемКоп операнд(ы), МнемКопВ, МнемКопW, МнемКопD В первом формате обработка байт, слов или двойных слов определяется неявно типом операнда или операндов. Следующие три формата явно указывают операцию над байтами, словами или двойными словами. Независимо от формата примитива адреса операндов определяются содержимым регистров SI, DI, DS иES. Адрес операнда-источника определяется полным указателем DS:SI , если только в первом формате явно не указан префикс замены сегмента ( GS:[si] ). Адрес операнда-приемника определяется полным указателем ES:DI. Такая косвенная регистровая адресация означает, что смещение источника и приемника необходимо загрузить в регистры SI и DI до выполнения примитива. Если данные находятся в одном сегменте, то DS и ES должны содержать один и тот же сегментный адрес.Основной причиной указания операндов в первом формате является то, что имена (идентификаторы) источника и приемника делают программу более читаемой и позволяют транслятору проконтролировать адресацию операндов.
Мнемоника Описание Название MOVS op2, op1 MOVSB MOVSW MOVSD ( op2) (op1) ( [ ES:DI ] ) ( [DS:SI] } SI = SI + 1 (2, 4) если DF = 0 DI = DI + 1 ( 2, 4 ) SI = SI - 1 (2, 4) если DF = 1 DI = DI - 1 ( 2, 4 ) Переслать цепочку Переслать байт Переслать слово Переслать двойное слово CMPS op1, op2 CMPSB CMPSW CMPD (op1) – (op2) FLAGS ( [DS:SI] }- ( [ ES:DI ] ) FLAGS SI, DI изменяются как в MOVS Сравнить цепочки Сравнить байты Сравнить слова Сравнить DWORD SCANS op2 SCANSB SCANSW SCANSD { AL, AX, EAX } - (op2) FLAGS ( [ ES:DI ] ) DI = DI + 1 ( 2, 4 ) если DF = 0 DI = DI - 1 ( 2, 4 ) если DF = 1 Сканировать цепочку Сканировать байт Сканировать слово Сканировать DWORD Цепочечные примитивы
Мнемоника Описание Название LODS op1 LODSB LODSW LODSD (op1) { AL, AX, EAX } ( [DS:SI] ) SI = SI + 1 (2, 4) если DF = 0 SI = SI - 1 (2, 4) если DF = 1 Загрузить цепочку Загрузить байт Загрузить слово Загрузить DWORD STOS op2 STOSB STOSW STOSD { AL, AX, EAX } (op2) ( [ES:DI] } DI = DI + 1 ( 2, 4 ) если DF = 0 DI = DI - 1 ( 2, 4 ) если DF = 1 Запомнить цепочку Запомнить байт Запомнить слово Запомнить DWORD INS op2, DX INSB INSW INSD Входной порт (op2) (DX) ( [ ES:DI ] ) DI = DI + 1 ( 2, 4 ) если DF = 0 DI = DI - 1 ( 2, 4 ) если DF = 1 Ввести строку из порта, заданного в DX Ввести байт Ввести слово Ввести DWORD OUTS DX, op1 OUTSB OUTSW OUTSD (op1) Выходной порт ( [DS:SI] ) (DX) SI = SI + 1 (2, 4) если DF = 0 SI = SI - 1 (2, 4) если DF = 1 Вывести строку в порт Вывести байт Вывести слово Вывести DWORD
Мнемоника Описание Условие окончания повторения REP Повторять цепочечный примитив, пока CX (ECX) не равен 0 ( CX ) = = 0 REPE, REPZ Повторять цепочечный примитив, пока CX (ECX) не равен 0 и ZF = 1 ( CX ) = = 0 или ZF = = 0 REPNE, REPNZ Повторять цепочечный примитив, пока CX (ECX) не равен 0 и ZF = 0 ( CX ) = = 0 или ZF = = 1 Префикс повторения REP Предназначен для упрощения реализации циклов с цепочечными примитивами. Машинный код: 1111001z, бит z помогает управлять циклами с примитивами CMPS и SCAS. Во всех случаях при каждом повторении ( СX ) = ( CX ) – 1;
Команды CMPS и SCAS – модифицируют все флажки условий ( арифметические флажки), а остальные не модифицируют никаких флажков в регистре FLAGS. Пример: Заполнить экран заданным символом. MOVAX, 0B800h ; Адрес начала видеопамяти XOR DI, DI MOV ES, AX MOV AX, xxxxh ; Атрибут и код символа MOVCX, 2000 ; Текстовый режим 80 * 25 M1: STOSW ; либо REP STOSW LOOP M1
Пример 2: фрагмент поиска в таблице TAB, состоящей из 30 байтных строк, строку с кодом, соответствующим значению параметра NAME DB 10 DUP (?), в первых десяти байтах. MOV BX, TAB_SIZE ; Количество строк в таблице LES DI, TAB MOV DX, DI LDS SI, NAME CLD M1: MOV CX, 10 REP CMPSB JE R1 ADD DX, 20 MOV DI, DX MOV SI, OFFSET NAME DEC BX JNE M1 ………. ; Не найдено R1: …….. ; Найдена
Мнемоника Описание Название CLC СF 0 Сбросить перенос CMC CF инверсия CF Инвертировать CF STC CF 1 Установить перенос CLD DF 0 Сбросить направление (для цепочечных команд) STD DF 1 Установить направление CLI IF 0 Сбросить прерывание STI IF 1 Установить прерывание LAHF AH младший байт FLAGS Загрузить AH из флажков SAHF AH младший байт FLAGS Запомнить AH во флажки Команды манипуляции флажками Как уже говорилось, многие команды устанавливают или сбрасывают флажки в соответствии с полученным результатом. Однако, иногда необходимо прямо управлять флажками. Для этого имеются следующие команды:
Мнемоника Описание Название NOT op1 op1 = инверсия op1 Инвертировать операнд OR op1, op2 op1 = op1 v op2 ИЛИ AND op1, op2 op1 = op1 & op2 И XOR op1, op2 op1 = op1 +mod2 op2 Исключающее ИЛИ TEST op1, op2 op1 & op2 FLAGS Проверить Логические команды Преобразовывают операнды ( байт, слово, двойное слово) поразрядно. Это означает, что команда NOT инвертирует каждый бит операнда, а в остальных командах логическая операция выполняется над каждой парой соответствующих битов операндов. Команда NOT не воздействует на флажки, остальные команды сбрасывают CF и OF, оставляют AF неопределённым и устанавливают SF, ZF и AF по обычным правилам.