(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.
Команды сравнения строк