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