1 / 8

Цепочечные команды

Цепочечные команды

patch
Download Presentation

Цепочечные команды

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Цепочечные команды Под цепочкой понимается последовательность байт, слов или двойных слов в памяти, а цепочечной операцией называется операция, которая выполняется над каждым элементом цепочки. Эти команды не выполняют функций, которые невозможно реализовать другими командами, но значительно сокращают время обработки цепочек благодаря мощному набору примитивных команд, которые имеют длину 1 байт. Любой из базовых примитивов допускает один из 4 форматов: МнемКоп операнд(ы), МнемКопВ, МнемКопW, МнемКопD В первом формате обработка байт, слов или двойных слов определяется неявно типом операнда или операндов. Следующие три формата явно указывают операцию над байтами, словами или двойными словами. Независимо от формата примитива адреса операндов определяются содержимым регистров SI, DI, DS иES. Адрес операнда-источника определяется полным указателем DS:SI , если только в первом формате явно не указан префикс замены сегмента ( GS:[si] ). Адрес операнда-приемника определяется полным указателем ES:DI. Такая косвенная регистровая адресация означает, что смещение источника и приемника необходимо загрузить в регистры SI и DI до выполнения примитива. Если данные находятся в одном сегменте, то DS и ES должны содержать один и тот же сегментный адрес.Основной причиной указания операндов в первом формате является то, что имена (идентификаторы) источника и приемника делают программу более читаемой и позволяют транслятору проконтролировать адресацию операндов.

  2. Мнемоника Описание Название 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 Цепочечные примитивы

  3. Мнемоника Описание Название 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

  4. Мнемоника Описание Условие окончания повторения 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;

  5. Команды CMPS и SCAS – модифицируют все флажки условий ( арифметические флажки), а остальные не модифицируют никаких флажков в регистре FLAGS. Пример: Заполнить экран заданным символом. MOVAX, 0B800h ; Адрес начала видеопамяти XOR DI, DI MOV ES, AX MOV AX, xxxxh ; Атрибут и код символа MOVCX, 2000 ; Текстовый режим 80 * 25 M1: STOSW ; либо REP STOSW LOOP M1

  6. Пример 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: …….. ; Найдена

  7. Мнемоника Описание Название 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 во флажки Команды манипуляции флажками Как уже говорилось, многие команды устанавливают или сбрасывают флажки в соответствии с полученным результатом. Однако, иногда необходимо прямо управлять флажками. Для этого имеются следующие команды:

  8. Мнемоника Описание Название 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 по обычным правилам.

More Related