Цепочечные команды Под цепочкой понимается последовательность байт, слов или двойных слов в памяти, а цепочечной операцией называется операция, которая выполняется над каждым элементом цепочки. Эти команды не выполняют функций, которые невозможно реализовать другими командами, но значительно сокращают время обработки цепочек благодаря мощному набору примитивных команд, которые имеют длину 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 SCAS op2 SCASB SCASW SCASD Название Переслать цепочку Переслать байт Переслать слово Переслать двойное слово (op1) – (op2) FLAGS ( [DS:SI] }- ( [ ES:DI ] ) FLAGS Сравнить цепочки SI, DI изменяются как в MOVS Сравнить байты Сравнить слова Сравнить DWORD { 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 STOS op2 { AL, AX, EAX } STOSB STOSW STOSD DI = DI + 1 ( 2, 4 ) если DF = 0 DI = DI - 1 ( 2, 4 ) если DF = 1 INS op2, DX Входной порт (DX) INSB INSW INSD DI = DI + 1 ( 2, 4 ) если DF = 0 DI = DI - 1 ( 2, 4 ) если DF = 1 OUTS DX, op1 (op1) Выходной порт ( [DS:SI] ) (DX) OUTSB OUTSW OUTSD SI = SI + 1 (2, 4) если DF = 0 SI = SI - 1 (2, 4) если DF = 1 (op2) ( [ES:DI] } (op2) ( [ ES:DI ] ) Название Загрузить цепочку Загрузить байт Загрузить слово Загрузить DWORD Запомнить цепочку Запомнить байт Запомнить слово Запомнить DWORD Ввести строку из порта, заданного в DX Ввести байт Ввести слово Ввести DWORD Вывести строку в порт Вывести байт Вывести слово Вывести DWORD Префикс повторения REP Предназначен для упрощения реализации циклов с цепочечными примитивами. Машинный код: 1111001z, бит z помогает управлять циклами с примитивами CMPS и SCAS. Мнемоника Описание 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 Во всех случаях при каждом повторении ( СX ) = ( CX ) – 1; Условие окончания повторения Команды CMPS и SCAS – модифицируют все флажки условий ( арифметические флажки), а остальные не модифицируют никаких флажков в регистре FLAGS. Пример: Заполнить экран заданным символом. MOV AX, 0B800h ; Адрес начала видеопамяти MOV ES, AX XOR DI, DI MOV AX, xxxxh ; Атрибут и код символа MOV CX, 2000 ; Текстовый режим 80 * 25 M1: STOSW LOOP M1 ; либо REP STOSW Пример 2: фрагмент поиска в таблице TAB, состоящей из 30 байтных строк, строку с кодом, соответствующим значению параметра NAME DB 10 DUP (?), в первых десяти байтах. MOV BX, TAB_SIZE ; Количество строк в таблице LES DI, TAB MOV DX, DI LDS SI, NAME CLD M1: MOV CZ, 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 младший байт FLAGS Загрузить AH из флажков SAHF Запомнить AH во флажки Логические команды Преобразовывают операнды ( байт, слово, двойное слово) поразрядно. Это означает, что команда NOT инвертирует каждый бит операнда, а в остальных командах логическая операция выполняется над каждой парой соответствующих битов операндов. Мнемоника Описание Название 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 не воздействует на флажки, остальные команды сбрасывают CF и неопределённым и устанавливают SF, ZF и PF по обычным правилам. OF, оставляют AF