Презентация51

advertisement
Цепочечные команды
Под цепочкой понимается последовательность байт, слов или двойных слов в памяти, а цепочечной операцией
называется операция, которая выполняется над каждым элементом цепочки. Эти команды не выполняют функций,
которые невозможно реализовать другими командами, но значительно сокращают время обработки цепочек
благодаря мощному набору примитивных команд, которые имеют длину 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
Download