Описание системы команд (1110646), страница 4
Текст из файла (страница 4)
Такая необходимость можетвозникнуть при разработке программ обработки прерываний.cli;if=0См. также: урок 15 и команды int, iret/iretd, stiCMC(CoMplement Carry flag)Инвертирование флага переносаcmcСхема команды:Назначение: изменение значения флага переноса cf на обратное.СинтаксисАлгоритм работы:инвертирование значения флага переноса cf.Состояние флагов после выполнения команды:00CFrПрименение:Данная команда используется для изменения значения флага cf на противоположное. Вчастности, этот флаг можно использовать для связи с процедурой и по его состояниюсудить о результате работы данной процедуры. После выхода из процедуры этот флагможно проанализировать командой условного перехода jc.proc1......proc1...proccmcendpcalljcпереход на m1...m1:...proc1m1;если cf=1, тоСм.
также: уроки 8, 9, 15 и команды clc, stc, jc, jncCMP(CoMPare operands)Сравнение операндовcmp операнд1,операнд2Схема команды:Назначение: сравнение двух операндов.СинтаксисАлгоритм работы:••выполнить вычитание (операнд1-операнд2);в зависимости от результата установить флаги, операнд1 и операнд2 не изменять(то есть результат не запоминать).Состояние флагов после выполнения команды:11 07 06 04 02 00OF SF ZF AF PF CFrrrrrrПрименение:Данная команда используется для сравнения двух операндов методом вычитания, приэтом операнды не изменяются. По результатам выполнения команды устанавливаютсяфлаги.
Команда cmp применяется с командами условного перехода и командой установкибайта по значению setcc.len...equcmpjne(ax)<>lenjmp(ax)=len10ax,lenm1;переход еслиm2;переход еслиСм. также: уроки 10, 11, 12 и команды cmps/cmpsb/cmpsw/cmpsd, cmpxchg, sub, jcc, setccCMPS/CMPSB/CMPSW/CMPSD(CoMPare String Byte/Word/Double word operands)Сравнение строк байтов/слов/двойных словcmps приемник,источникcmpsbСхема команды:cmpswcmpsdНазначение: сравнение двух последовательностей (цепочек) элементов в памяти.СинтаксисАлгоритм работы:••••выполнить вычитание элементов (источник - приемник), адреса элементовпредварительно должны быть загружены:o адрес источника — в пару регистров ds:esi/si;o адрес назначения — в пару регистров es:edi/di;в зависимости от состояния флага df изменить значение регистров esi/si и edi/di:o если df=0, то увеличить содержимое этих регистров на длину элементапоследовательности;o если df=1, то уменьшить содержимое этих регистров на длину элементапоследовательности;в зависимости от результата вычитания установить флаги:o если очередные элементы цепочек не равны, то cf=1, zf=0;o если очередные элементы цепочек или цепочки в целом равны, то cf=0, zf=1;при наличии префикса выполнить определяемые им действия (см.
командыrepe/repne).Состояние флагов после выполнения команды:11 07 06 04 02 00OF SF ZF AF PF CFrrrrrrПрименение:Команды без префиксов осуществляют простое сравнение двух элементов в памяти.Размеры сравниваемых элементов зависят от применяемой команды.
Команда cmps можетработать с элементами размером в байт, слово, двойное слово. В качестве операндов вкоманде указываются идентификаторы последовательностей этих элементов в памяти.Реально эти идентификаторы используются лишь для получения типов элементовпоследовательностей, а их адреса должны быть предварительно загружены в указанныевыше пары регистров.
Транслятор, обработав команду cmps и выяснив тип операндов,генерирует одну из машинных команд cmpsb, cmpsw или cmpsd. Машинного аналога длякоманды cmps нет. Для адресации назначения обязательно должен использоваться регистрes, а для адресации источника можно делать замену сегмента с использованиемсоответствующего префикса.Для того чтобы эти команды можно было использовать для сравнения последовательностиэлементов, имеющих размерность байт, слово, двойное слово, необходимо использоватьодин из префиксов repe или repne. Префикс repe заставляет циклически выполнятьсякоманды сравнения до тех пор, пока содержимое регистра ecx/cx не станет равным нулюили пока не совпадут очередные сравниваемые элементы цепочек (флаг zf=1).
Префиксrepne заставляет циклически производить сравнение до тех пор, пока не будет достигнутконец цепочки (ecx/cx=0) либо не встретятся различающиеся элементы цепочек (флагzf=0)..dataobl1obl1a_obl1a_obl2.code...dbdbdddd'Строка для сравнения''Строка для сравнения'obl1obl2cld;просмотрцепочки в направлении возрастанияадресовmovcx,20;длина цепочкиldssi,a_obl1;адресисточника в пару ds:silesdi,a_obl2;адресназначения в пару ds:sirepecmpsb;сравнивать,пока равныjnzm1;если не конеццепочки, то встретились разные элементы...;действия, еслицепочки совпали...m1:...;действия, еслицепочки не совпалиСм. также: уроки 10, 11 и команды ins, lods, movs, outs, scas, stos, repe, repz, repne, repnzCMPXCHG(CoMPare and eXCHanGe)Сравнение и обменcmpxchgприемник,источник(аккумулятор)Назначение: сравнение и обмен значений между источником и приемником.Схема команды:СинтаксисАлгоритм работы:•••выполнить сравнение элементов источник и приемник;если источник и приемник не равны, то:o установить zf=0;o переслать содержимое операнда приемник в источник (регистр al/ax/eax).если источник и приемник равны, то:o установить zf=1;o переслать содержимое операнда источник (регистр al/ax/eax) по местуоперанда приемник.Состояние флагов после выполнения команды:11 07 06 04 02 00OF SF ZF AF PF CFrrrrrrПрименение:Команды сравнивают два операнда.
Один из сравниваемых операндов находится ваккумуляторе (регистре al/ax/eax), другой может находиться в памяти или регистреобщего назначения. Если значения равны, то производится замена содержимого операндаприемник содержимым источника, находящимся в регистре-аккумуляторе. Если значенияне равны, то производится замена содержимого операнда источника находящимся врегистре-аккумуляторе содержимым операнда назначения. Определить тот факт, была липроизведена смена значения в аккумуляторе (то есть были ли не равны сравниваемыеоперанды), можно по значению флага zf..486movax,114ehmovbx,8e70hcmpxchg bx,axjzm1;переход, еслиzf=1, то есть операнды равны;и ax неизменился...;действия, еслиоперанды не равныm1:См. также: уроки 7, 10 и команды cmp, xchgCWD(Convert Word to Double word)Преобразование слова в двойное словоcwdСхема команды:Назначение: расширение слова со знаком до размера двойного слова со знаком.СинтаксисАлгоритм работы:копирование значения старшего бита регистра ax во все биты регистра dx.
Состояниефлагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команда cwd используется для расширения значения знакового бита в регистре ax на битырегистра dx. Данную операцию, в частности, можно использовать для подготовки коперации деления, для которой размер делимого должен быть в два раза больше размераделителя, либо для приведения операндов к одной размерности в командах умножения,сложения, вычитания....movax,25movcwddivbx,4bxСм.
также: урок 8 и команды cbw, cdq, cwde, div, idiv, mul, imul, add, adc, sub, sbbCDQ(Convert Double word to Quad word)Преобразование двойного слова в учетверенное словоcdqСхема команды:Назначение: расширение двойного слова со знаком до размера учетверенного слова (64бита) со знаком.СинтаксисАлгоритм работы:копирование значения старшего бита регистра eax на все биты регистра edx. Состояниефлагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команду cdq можно использовать для распространения значения знакового бита врегистре eax на все биты регистра edx. Данную операцию, в частности, можноиспользовать для подготовки к операции деления, для которой размер делимого долженбыть в два раза больше размера делителя..386delimoe dddelitel dd...movcdqidivостаток в edx......eax,delimoedelitel ;частное в eax,См.
также: урок 8 и команды cbw, cwd, cwde, div, idivDAA(Decimal Adjust for Addition)Десятичная коррекция после сложенияdaaСхема команды:Назначение: коррекция упакованного результата сложения двух BCD-чисел вупакованном формате.СинтаксисАлгоритм работы:команда работает только с регистром al и анализирует наличие следующих ситуаций:••Ситуация 1. В результате предыдущей команды сложения флаг af=1 или значениемладшей тетрады регистра al>9.
Напомним, что флаг af устанавливается в 1 вслучае переноса двоичной единицы из бита 3 младшей тетрады в старшую тетрадурегистра al (если значение превысило 0fh). Наличие одного из этих двух признаковговорит о том, что значение младшей тетрады превысило 9h.Ситуация 2.
В результате предыдущей команды сложения флаг сf=1 или значениерегистра al>9fh. Напомним, что флаг cf устанавливается в 1 в случае переносадвоичной единицы в старший бит операнда (если значение превысило 0ffh в случаерегистра al). Наличие одного из этих двух признаков говорит о том, что значение врегистре al превысило 9fh.Если имеет место одна из этих двух ситуаций, то регистр al корректируется следующимобразом:•••для ситуации 1 содержимое регистра al увеличивается на 6;для ситуации 2 содержимое регистра al увеличивается на 60h;если имеют место обе ситуации, то корректировка начинается с младшей тетрады.Состояние флагов после выполнения команды (в случае, если были переносы):11 07 06 04 02 00OF SF ZF AF PF CFrrr1r1Состояние флагов после выполнения команды (в случае, если переносов не было):11 07 06 04 02 00OF SF ZF AF PF CFrrr0r0Применение:Эту команду следует применять после сложения двух упакованных BCD-чисел с цельюкорректировки получающегося двоичного результата сложения в правильное двузначноедесятичное число.