Описание системы команд (1110646), страница 14
Текст из файла (страница 14)
Замена сегмента es не допускается;по результату вычитания установить флаги;•изменить значение регистра edi/di на величину, равную длине элемента цепочки.Знак этой величины зависит от состояния флага df:o df=0 — величина положительная, то есть просмотр от начала цепочки к ееконцу;o df=1 — величина отрицательная, то есть просмотр от конца цепочки к ееначалу.Состояние флагов после выполнения команды:11 07 06 04 02 00OF SF ZF AF PF CFrrrrrrПрименение:Команды сканирования сравнивают значение в регистре eax/ax/al с ячейкой памяти,локализуемой парой регистров es:edi/di. Размер сравниваемого элемента зависит отприменяемой команды. Команда scas может работать с элементами размером в байт, словоили двойное слово.
В качестве операнда в команде указывается идентификаторпоследовательности элементов в памяти. Реально этот идентификатор используется лишьдля получения типа элементов последовательности, а ее адрес должен бытьпредварительно загружен в указанную выше пару регистров.
Транслятор, обработавкоманду scas и выяснив тип операндов, генерирует одну из машинных команд:: scasb,scasw или scasd. Машинного аналога для команды scas нет. Для адресации операндаисточник обязательно должен использоваться регистр es.Для того чтобы эту команду можно было использовать для поиска значения впоследовательности элементов, имеющих размерность байт, слово или двойное слово,необходимо использовать один из префиксов repe или repne.
Эти префиксы не толькозаставляют циклически выполняться команду поиска, пока ecx/cx<>0, но и отслеживаютсостояние флага zf (см. команды rep/repe/repne).;сосчитать число пробелов в строке str.datastrdb'...'len_str=$-str.codemovax,@datamovds,axmoves,axleadi,strmovcx,len_str;длинустроки — в cxmoval,' 'movbx,0;счетчик дляподсчета пробелов в строкеcldcycl:repescasbjcxzexit;переход наexit, если цепочка просмотренаполностьюincbxjmpcyclexit:...См.
также: урок 11 и команды cmps/cmpsb/cmpsw/cmpsd, ins/insb/insw/insd,lods/lodsb/lodsw/lodsd, movs/movsb/movsw/movsd, outs, stos/stosb/stosw/stosd, rep/repe/repz/repne/repnzSETcc(byte SET on condition)Установка байта по условиюsetcc операндСхема команды:Назначение: установка операнда логическим значением в зависимости от истинностиусловия, заданного модификатором кода операции cc.СинтаксисАлгоритм работы:Команда проверяет истинность условия, заданного в коде операции, то есть, фактически,состояние определенных флагов.Команды установки байтовКомандаПроверяемые флагиЛогическое условиеSETA/SETNBECF = 0 и ZF = 0(выше)/(не ниже или равно)SETAE/SETNBCF = 0(выше или равно)/(не ниже)SETB/SETNAECF = 1(ниже)/(не выше или равно)SETBE/SETNA CF = 1 или ZF = 1(ниже или равно)/(не выше)SETCCF = 1переносSETE/SETZZF = 1нольSETG/SETNLE ZF = 0 или SF = OF(больше)/(не меньше или равно)SETGE/SETNLSF = OF(больше или равно)/(не меньше)SETL/SETNGESF <> OFесли SF <> OFSETLE/SETNG ZF=1 или SF <> OF(меньше или равно)/(не больше)SETNCCF = 0нет переносаSETNE/SETNZZF = 0не равно нулюSETNOOF=0нет переполненияSETNP/SETPOPF = 0(неравенство)/(нет контроля четности)SETNSSF = 0нет знака, число положительноеSETOOF = 1переполнениеSETP/SETPEPF = 1контроль четности/равенствоSETSSF = 1если знак минус, число отрицательноеЕсли проверяемое условие (или содержимое соответствующих флагов на момент выдачикоманды setcc) истинно, то установить значение операнда в 01h, если условие ложно — тов 00h.Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Эти команды можно использовать после любой команды, изменяющей флаги, принеобходимости анализа результата изменений.
Если проанализировать условия длякоманд условного перехода, то обнаружится их полное соответствие с условиями,обрабатываемыми командой setcc, за исключением, конечно, команд jcxz и jecxz.;подсчитать число единичных битов врегистре axmovcx,16m1:rolax,1setcbladdbh,blclcloopm1См. также: урок 10 и команду jccSGDT(Store Global Descriptor Table)Сохранение регистра глобальной дескрипторной таблицыsgdt источникСхема команды:Назначение: извлечение содержимого системного регистра gdtr, содержащего значениябазового адреса и размера глобальной дескрипторной таблицы GDT.СинтаксисАлгоритм работы:Команда выполняет чтение содержимого системного регистра gdtr в область памятиразмером 48 бит. Структурно эти 48 бит представляют 16 бит размера и 32 бита значениябазового адреса начала таблицы GDT в памяти.Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команду sgdt применяют при работе системных программ с уровнем привилегий 0, вчастности, при написании различных драйверов..286;структура для описанияпсевдодескриптора gdtrpointSTRUClimdw0adrdd0ENDS.datapoint_gdtpoint.code...;читаем содержимое gdtrsgdtpoint_gdt...См.
также: уроки 16, 17 и команду lgdtSIDT(Store Interrupt Descriptor Table)Сохранение регистра глобальной дескрипторной таблицы прерыванийsidt источникСхема команды:Назначение: извлечение содержимого системного регистра idtr, содержащего значениябазового адреса и размера дескрипторной таблицы прерываний IDT.СинтаксисАлгоритм работы:команда sidt выполняет чтение содержимого системного регистра idtr в область памятиразмером 48 бит.
Структурно эти 48 бит представляют 16 бит размера и 32 бита значениябазового адреса начала таблицы IDT в памяти.Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команду sidt применяют при работе системных программ с уровнем привилегий 0, вчастности, при написании различных драйверов. В качестве операнда в командеуказывается адрес области в формате 16+32. Младшее слово области — размер IDT,двойное слово по старшему адресу — значение базового адреса начала этой таблицы..286;структура для описанияпсевдодескрипторов gdtr и idtrpointSTRUClimdw0adrdd0ENDS.datapoint_idtpoint.code...;читаем содержимое idtrsidtpoint_idt...См.
также: урок 17 и команду lidtSHL(SHift logical Left)Сдвиг логический операнда влевоshl операнд,количество_сдвиговСхема команды:Назначение: логический сдвиг операнда влево.СинтаксисАлгоритм работы:•••сдвиг всех битов операнда влево на один разряд, при этом выдвигаемый слева битстановится значением флага переноса cf;одновременно слева в операнд вдвигается нулевой бит;указанные выше два действия повторяются количество раз, равное значениювторого операнда.Состояние флагов после выполнения команды:11 00OF CF?r rПрименение:Команда shl используется для сдвига разрядов операнда влево.
Ее машинный кодидентичен коду sal, поэтому вся информация, приведенная для sal, относится и к командеshl. Команда shl используется для сдвига разрядов операнда влево. Так же, как и длядругих сдвигов, значение второго операнда (счетчикк сдвига) ограничено диапазоном0...31. Это объясняется тем, что микропроцессор использует только пять младшихразрядов операнда количество_разрядов. Аналогично другим командам сдвигасохраняется эффект, связанный с поведением флага of, значение которого имеет смыслтолько в операциях сдвига на один разряд:••если of=1, то текущее значение флага cf и выдвигаемого слева бита операндаразличны;если of=0, то текущее значение флага cf и выдвигаемого слева бита операндасовпадают.Этот эффект, как вы помните, обусловлен тем, что флаг of устанавливается в единицувсякий раз при изменении знакового разряда операнда.Команду shl удобно использовать для умножения целочисленных операндов без знака настепени 2.
Кстати сказать, это самый быстрый способ умножения; умножить содержимоеax на 16 (2 в степени 4).movshlax,17ax,4См. также: урок 9 и команды rcr, rcl, ror, rol, sar, sal, shrSHLD(SHift Left Double word)Сдвиг двойного слова влевоshldприемник,источник,количество_сдвиговНазначение: логический сдвиг двойного слова влево.Схема команды:СинтаксисАлгоритм работы:•сдвинуть операнд приемник влево на количество битов, определяемое операндомколичество_сдвигов;••одновременно сдвинуть операнд источник влево на количество битов,определяемое операндом количество_сдвигов. Важно заметить, что операндисточник только обеспечивает вдвигаемые в операнд приемник биты, сам он приэтом не изменяется;выдвигаемые во время сдвига влево из операнда источник биты вдвигаются воперанд приемник с его правого края.Состояние флагов после выполнения команды:11 07 06 04 02 00OF SF ZF AF PF CF?rr?rrПрименение:Команда shld используется для манипуляции битовыми строками длиной до 64 бит.
Этукоманду удобно использовать для быстрой вставки (или извлечения) битной строки вбольшую битную строку; при этом, что очень важно, не разрушается контекст (битноеокружение) этих подстрок..386;извлечь старшую половину eax в bx безразрушения eaxmovcl,16shldebx,eax,clpushbxshlebx,clshldeax,ebx,cl;восстановим eax pop bxСм. также: урок 9 и команды rcr, rcl, ror, rol, sar, sal, shr, shrdSHRСдвиг логический операнда вправоASCII-коррекция после сложенияshr операнд,кол-во_сдвиговСхема команды:Назначение: логический сдвиг операнда вправо.СинтаксисАлгоритм работы:•••сдвиг всех битов операнда вправо на один разряд; при этом выдвигаемый справабит становится значением флага переноса cf;одновременно слева в операнд вдвигается нулевой бит;указанные выше два действия повторяются количество раз, равное значениювторого операнда.Состояние флагов после выполнения команды:11 07 06 04 02 00OF SF ZF AF PF CF?r rr?rrПрименение:Команда shr используется для логического сдвига разрядов операнда вправо.