CWD Преобразование слова в двойное слово

(convert word to double word)

Команда CWD заполняет регистр DX знаковым битом содержимого регистра АХ, преобразуя тем самым 16-разрядное число со знаком в 32-разрядное. Команду удобно использовать для преобразования двухбайтового делимого в четырехбайтовое (двойное слово) при делении на 16-разрядный операнд.

CWDE Преобразование слова в двойное слово
Команда CWDE заполняет старшие два байта регистра EAX знаковым битом содержимого регистра АХ, преобразуя тем самым 16-разрядное число со знаком в 32-разрядное.

CDQ Преобразование двойного слова в четвертное слово

(convert double to quadric)
Команда CDQ заполняет регистр EDX знаковым битом содержимого регистра EАХ, преобразуя тем самым 32-разрядное число со знаком в 64-разрядное. Команду удобно использовать для преобразования четырехбайтового делимого в восьмибайтовое (четвертное слово) при делении на 32-разрядный операнд.

 

23Команды сравнения:

Логическое сравнение

TEST приемник, источник
Команда используется для логического умножения двух операндов (вычисляет результат действия побитового «логического И») над приемником и источником, не сохраняя результата.
TEST ECX,EDX

Устанавливает флаги SE ZF и PF в соответствии с полученным показателем, флаги OF и CF обнуляются, значение AF не определено.
TEST, так же как и CMP используется в основном в сочетании с командами условного перехода и условной пересылки данных.

Команда TEST устанавливает только флаги, а операнд не изменяется.

Команды сравнения

CMP приемник, источник
Сравнивает приемник и источник и устанавливает флаги. Сравнение - путем вычитания источника из приемника, причем результат вычитания никуда не записывается.
Единственным следствием работы этой команды оказывается изменение флагов CF, OF, SF, ZF, AF и PF. Обычно команду СМР используют вместе с командами условного перехода и условной пересылки данных .

если ( АХ ) < ( BX ) , то значение бита SF=1.
если ( АХ ) > ( BX ) , то значение бита SF=0
если ( АХ ) = ( BX ) , то значение бита ZF=1.

 

24 Команды управления:

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

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

JMP ADDRESS

Команды условных переходов
Команды условного перехода имеют следующий общий вид :
КОП Адрес
КОП определяет условие перехода.
Адресопределяет, куда нужно перейти, если условие, закодированное в коде операции, соответствует текущему значению регистра флажков.

Различают команды условного перехода для знаковых и беззнаковых чисел.
Слова «выше -A» и «ниже - B» в таблице относятся к сравнению чисел без знака; слова «больше - G» и «меньше - L» учитывают знак.
!!Команды условных переходов не поддерживают дальних переходов (>128)

Для чисел без знака
JB/JNAE

Переход если ниже; переход если не выше или равноCF = 1


JAE/JNB

Переход если выше или равно; переход если не ниже CF = 0


JBE/JNA

Переход если ниже или равно; переход если не выше CF=1 или ZF = 1

 

JA/JNBE

Переход если выше; переход если не ниже или равно CF=0 и ZF=0

Для чисел со знаком
JL/JNGE

Переход если меньше; переход если не больше или равноS<>0


JGE/JNL

Переход если больше или равно; переход если не меньшеC = 0


JLE/JNG

Переход если меньше или равно; переход если не большеZ=1 или

Z<>0


JG/JNLE

Переход если больше; переход если не меньше илиравноZ=0 или S=0

 

Для прочих данных
JE/JZ
Переход если равно ZF = 1


JNE/JNZ Переход если не равноZF = 0


JPПереход при успешной проверке четности JPE;

переход при четностиPF = 1


JNP Переход при неуспешной проверке четности
JPOПереход при нечетности PF = 0
JS Переход если есть знакSF = 1

JNSПереход если нет знака SF = 0
JC Переход если есть перенос СF = 1
JNC Переход если нет переноса CF = 0
JO Переход если есть переполнение OF = 1
JNO Переход если нет переполнения

Команда перехода с учетом состояния регистра CX (ЕСХ)
JCXZ метка

Выполняет ближний переход на указанную метку, еслиСХ=0
JECXZ метка

Выполняет ближний переход на указанную метку, еслиЕСХ=0

 

25 Команды организации циклов:

для предотвращения выполнения цикла при нулевом ecx или cx нужна команда jecxz/jcxz. Если этого не сделать, то при изначально нулевом ecx/cx цикл повторится 4 294 967 295 или 65 536 раз;

Команда организации цикла со счетчиком.
LOOP метка

1. От содержимого регистра CX (ЕСХ) отнимается 1 и результат снова помещается в регистр CX(ЕСХ)
2. Если содержимое регистра CX(ЕСХ) оказывается равным 0, то больше ничего не делается, а точнее, выполняется следующая за командой LOOP команда.
3.Если же содержимое регистра CX(ЕСХ) не равно 0, то передается управление на команду, которая помечена меткой, указанной в команде LOOP

Эта команда используется для организации циклов, в которых регистр ECX (CX) играет роль счетчика.

 

Команда организации цикла с учетом флага ZF.
Имеются разновидности команды LOOP:
LOOPE метка цикл, пока равно
LOOPZметка цикл, пока ноль
LOOPNE метка цикл, пока не равно
LOOPNZ метка цикл, пока не ноль

Проанализировать регистр ZF:
1.От содержимого регистра CX (ЕСХ) отнимается 1 и результат снова помещается в регистр CX
2.Если содержимое регистра CX(ЕСХ) =0, выполняется следующая за командой LOOP команда.
3.Если содержимое регистра CX(ЕСХ) не равно 0, то передается управление на команду, которая помечена меткой, указанной в команде LOOP .

4. Если регистр ZF=0, то для команд LOOPE и LOOPZ это означает выход из цикла, а для команд LOOPNE и LOOPNZ – переход к началу цикла.
5. Если регистр ZF=1, то для команд LOOPE и LOOPZ это означает переход к началу цикла, а для команд LOOPNE и LOOPNZ – выход из цикла.
При этом надо учитывать, что сами команды флаг ZF не меняют, поэтому флаг должен быть установлен предыдущей командой

 

26 Команды пересылки:

Команда пересылки данных.
MOV приемник, источник
Команда MOV действует аналогично операторам присваивания из языков высокого уровня, то естьmov ах, bх ~ ах = bх

 

Условная пересылка данных.
Условная пересылка данных

(команды появились в процессорах PentiumPro и Pentium II).
CMOVcc приемник,источник
Это набор команд, которые копируют содержимое источника в приемник, в зависимости от значения тех или иных флагов из регистра FLAGS
Источник - регистр общего назначения или переменная, а приемником - только регистр.

 

Команда пересылки с расширением знака
MOVSX приемник, источник

Копирует содержимое источника (регистр или переменная размером в байт или слово) в приемник (16- или 32-битный регистр) и расширяет знак аналогично командам CBW/CWDE

Команда пересылки с расширением нулями
MOVZX приемник, источник

Пересылка с расширением нулями. Копирует содержимое источника (регистр или переменная размером в байт или слово) в приемник (16- или 32-битный регистр) и расширяет нулями.

 

 

 

27 Логические команды:

логическое И - and, логическое ИЛИ - or,

Исключающее ИЛИ - xor;
NOT инвертирует бит источника.
логические, арифметические и циклические сдвиги;
проверка битов и операндов;
установка и очистка битов (флагов) регистра состояния процессора

( PSW).

циклические

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

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

 

 

Арифметические

Для сдвига влево

если of=1, то текущее значение флагаcf и выдвигаемого слева бита операнда различны;
если of=0, то текущее значение флага cf и выдвигаемого слева бита операнда совпадают

 

Логические

для сдвигов вправо

Флаг of всегда сбрасывается в ноль в операциях сдвига на один разряд

Циклические

Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда.

Отличие этого сдвига от rcl(rcr) в том, что очередной сдвигаемый бит одновременно вдвигается в операнд справа(слева) и становится значением флага cf.

 

Проверка битов и флагов

Команды установки и очистки битов регистра состояния процессора (то есть флагов) позволяют установить или очистить любой флаг, что бывает очень удобно. Каждому флагу обычно соответствуют две команды, одна из которых устанавливает его в единицу, а другая сбрасывает в нуль.
Флагу переноса C (от Carry) будут соответствовать команды CLC(очистка) и SEC или STC (установка).

SAHF Запись содержимого регистра АН в регистр флагов

LAHFЗагрузка в АН содержимого регистра флагов

Команда sahfкопирует разряды 7, 6, 4, 2 и 0 регистра АН в регистр флагов процессора, устанавливая тем самым значения флагов SF, ZF, AF, PF и CF соответственно. Команда не имеет операндов.
Команда sahf (совместно с командой lahf) дает возможность читать и изменять значения флагов процессора, в том числе флагов SF, ZF, AF и PF, которые нельзя изменить непосредственно. Однако следует иметь в виду, что команда sahf заполняет только младший байт регистра флагов, поэтому нельзя изменить с ее помощью состояние флага OF

Команды обработки строк

/*Команды обработки строк (цепочечные команды) позволяют производить действия над блоками байтов или слов памяти. Эти блоки (или строки) могут иметь длину до 64 Кбайт и состоять из числовых или алфавитно-цифровых значений (типа символов в кодах ASCII) и быть следующего размера: 8 бит — байт; 16 бит — слово; 32 бита — двойное слово. Всего в системе команд микропроцессора имеется семь операций-примитивов обработки цепочек. Каждая из них реализуется в микропроцессоре тремя командами, в свою очередь, каждая из этих команд работает с соответствующим размером элемента — байтом, словом или двойным словом. Особенность всех цепочечных команд в том, что они, кроме обработки текущего элемента цепочки, осуществляют еще и автоматическое продвижение к следующему. Предполагается, что строка-приемник находится в дополнительном сегменте ES, а строка-источник – в сегменте данных DS. Процессор адресует строку-приемник через регистр EDI/DI, а строку-источник – через регистр ESI/SI. Перед выполнением команд нyжно обеспечить, чтобы эти регистры содержали смещение первых обрабат. элементов обеих строк относительно начала соответствующего сегмента. => LEA регистр, память

Если обе строки находятся в сегменте данных, то необходимо в регистр ES поместить адрес начала сегмента данных, т.е. значение, находящееся в регистре DS.

Если флаг DF равен 0, то значения регистров ESI/EI и EDI/DI увеличиваются после исполнения каждой команды. Если флаг DF равен 1, то они уменьшаются. Состоянием флага DF можно управлять с помощью двух команд: CLD – сбросить флаг направления, которая полагает его равным нулю, STD – установить флаг направления, которая присваивает ему значение 1.*/

 

1. Префиксы повторения

Нужны , чтобы одна команда обработки строк обработала группу последовательных элементов памяти. Для этого перед ней надо указать префикс повторения REP.Он представляет собой не команду, а однобайтовый модификатор, который заставляет микропро­цессор 8088 выполнить аппаратные повторения команды обработки строк. Это значительно сокращает время на обработку длинных строк по сравнению с прог­раммно-организованными циклами. Число повторений извлекается из регистра СХ. После очередного выполнения команды значение в регистре СХ уменьшается на единицу. Отличия префиксов в том, на каком основании принимается решение о циклическом выполнении цепочечной команды: по состоянию регистра ecx/cx или по флагу нуля zf.

Префикс повторения rep (REPeat).
Этот префикс используется с командами, реализующими операции-примитивы пересылки и сохранения элементов цепочек — соответственно, movs и stos, (ins и outs). Префикс repзаставляет данные команды выполняться, пока содержимое в ecx/cx не станет равным 0. При этом цепочечная команда, перед которой стоит префикс, автоматически уменьшаетсодержимое ecx/cx на единицу.

Действия rep:
1. анализ содержимого cx:
если cx<>0, то выполнить цепочечную команду, следующую за данным префиксом и перейти к шагу 2;
если cx=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2.уменьшить значение cx=cx–1 и вернуться к шагу 1;

Префиксы повторения repe или repz

(REPeat while Equal or Zero)

Они заставляют цепочечную команду выполняться до тех пор, пока содержимое ecx/cx не равно нулю или флаг ZF равен 1. Наиболее эффективно эти префиксы можно использовать с командами cmps и scas для поиска отличающихся элементов цепочек.

Действия repe и repz:
1. анализ содержимого cx и флага zf:
если cx<>0 или zf<>0, то выполнить цепочечную команду, следующую за данным префиксом, и перейти к шагу 2;
если cx=0 или zf=0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2. уменьшить значение cx=cx-1 и вернуться к шагу 1;

Префиксы повторения repne или repnz

(REPeat while Not Equal or Zero)

Префиксы repne/repnz заставляют цепочечную команду циклически выполняться до тех пор, пока содержимое ecx/cx не равно нулю или флаг zf равен нулю.

Данные префиксы также можно использовать с командами cmps и scas, но для поиска совпадающих элементов цепочек.

Действия repne и repnz:
1. анализ содержимого cx и флага zf:
если cx<>0 или zf=0, то выполнить цепочечную команду, следующую за данным префиксом и перейти к шагу 2;
если cx=0 или zf<>0, то передать управление команде, следующей за данной цепочечной командой (выйти из цикла по rep);
2. уменьшить значение cx=cx–1 и вернуться к шагу 1.

 

Команды пересылки

Команда MOVS копирует байт или слово из одной части памяти в другую. Она имеет формат MOVS строка_приемник, строка_источник
Строка­_источник – строка в сегменте данных, а строка_приемник – строка в дополнительном сегменте.

После пересылки элемента команда MOVS изменяет указатели строки-источника SI и строки-приемника DI. Если флаг DF равен 0, то микропроцессор увеличивает значения регистров SI и DI после пересылки и тем самым адресуется к следующим элементам памяти. Если флаг DF равен 1, то микропроцессор уменьшает значения регистров SI и DI после пересылки и тем самым адресуется к предыдущему элементу памяти.

MOVSBэлементы длиной в байт
MOVSWэлементы длиной в словоне требуют операндов

MOVSDэлементы длиной в двойное слово

Полные физические адреса для операндов цепочечных команд следующие:
адрес_источника — пара ds:esi/si;
адрес_приемника — пара es:edi/di.

 

Команды сравнения строк



rr;