Описание системы команд (1110646), страница 12
Текст из файла (страница 12)
Какизвестно, прямой доступ к регистру флагов невозможен, поэтому данная команда являетсяодной из немногих команд, позволяющих получить доступ к регистру флагов как ксодержимому обычного регистра. Обратное действие, то есть восстановление —возможно измененного слова — в регистр флагов, осуществляется командой popf. Этакоманда может использоваться в программах обработки прерываний и в других случаях,когда необходимо сохранить локальный контекст процесса вычисления.;извлечь значение регистра flags иизменить;значение флага cf на обратноеpushfpopaxxorax,01hpushaxpopfСм.
также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popad, popfd, push, pusha,pushad, popf, pushfdPUSHFD(PUSH eFlags Double word register onto stack)Размещение расширенного регистра флагов в стекеpushfdСхема команды:Назначение: размещение в стеке содержимого регистра флагов eflags.СинтаксисАлгоритм работы:••уменьшить значение указателя стека esp на 4;записать в вершину стека двойное слово, представляющее собой содержимоерегистра eflags.Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команды pushfd и popfd используются аналогично командам pushf и popf. Команда pushfdприменяется для получения содержимого регистра флагов. Как известно, прямой доступ крегистру флагов невозможен, поэтому данная команда является одной из немногихкоманд, позволяющих получить доступ к регистру флагов как к содержимому обычногорегистра.
Обратное действие, то есть восстановление — возможно измененного слова — врегистр флагов, осуществляется командой popfd. Эта команда может использоваться впрограммах обработки прерываний или в других случаях, когда необходимо сохранитьлокальный контекст процесса вычисления..386;извлечь значение регистра eflags иизменить;значение флага cf на обратноеpushfdpopeaxxoreax,01hpusheaxpopfdСм. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popad, popf, popfd, push, pusha,pushad, pushfRCL(Rotate operand through Carry flag Left)Циклический сдвиг операнда влево через флаг переносаrcl операнд,количество_сдвиговСхема команды:Назначение: операция циклического сдвига операнда влево через флаг переноса cf.СинтаксисАлгоритм работы:•••сдвиг всех битов операнда влево на один разряд, при этом старший бит операндастановится значением флага переноса cf;одновременно старое значение флага переноса cf вдвигается в операнд справа истановится значением младшего бита операнда;указанные выше два действия повторяются количество раз, равное значениювторого операнда команды rcl.Состояние флагов после выполнения команды:11 00OF CF?r rЗдесь обозначение ?r означает то, что анализ состояния флага имеет смысл приопределенном сочетании операндов.
В случае команды rcl флаг of представляет интерес,если сдвиг осуществляется на один разряд (см. ниже описание применения команды rcl).Применение:Команда rcl используется для циклического сдвига разрядов операнда влево. Особенностьэтого сдвига в том, что он происходит с некоторой задержкой, так как очереднойсдвигаемый бит оказывается на некоторое время вне операнда. В это время можнопроизвести его извлечение и (или) подмену.
Другой важный момент заключается в том,что для счетчика сдвига микропроцессор использует только пять младших разрядовоперанда количество_разрядов. Таким образом, значение, большее 31, микропроцессоромне допускается (аппаратно это ограничение реализуется тем, что игнорируются значениявсех битов счетчика, кроме первых пяти). Обратите внимание на еще один интересныйэффект, связанный с поведением флага of. В операциях сдвига на один разряд поизменению этого флага можно судить о факте изменения знакового (старшего) разрядаоперанда:••of=1, если текущее значение флага cf и выдвигаемого бита операнда слеваразличны;of=0, если текущее значение флага cf и выдвигаемого бита операнда слевасовпадают.;сдвиг операнда, занимающего двадвойных слова;на четыре разряда влевоch_ldd...;младшая часть64-битного операндаch-2dd...;старшая часть64-битного операнда...movcx,4;счетчиксдвигов в cxmoveax,ch_lmovedx,ch_hm1:clc;очистка флагаcfrcleax,1;старший битeax в cfrcledx,1;cf в младшийбит edx, старший бит edx в cfloopm1См.
также: урок 9 и команды rcr, rol, ror, sal, sar, shl, shrRCR(Rotate operand through Carry flag Right)Циклический сдвиг операнда вправо через флаг переносаrcr операнд,количество_сдвиговСхема команды:Назначение: операция циклического сдвига операнда вправо через флаг переноса cf.СинтаксисАлгоритм работы:•••сдвиг всех битов операнда вправо на один разряд; при этом младший бит операндастановится значением флага переноса cf;одновременно старое значение флага переноса — в операнд слева и становитсязначением старшего бита операнда;указанные выше два действия повторяются количество раз, равное значениювторого операнда команды rcr.Состояние флагов после выполнения команды:11 00OF CF?r rЗдесь обозначение ?r означает то, что анализ состояния флага имеет смысл приопределенном сочетании операндов.
В случае команды rcr флаг of представляет интерес,если сдвиг осуществляется на один разряд (см. ниже описание применения команды rcr).Применение:Команда rcr используется для циклического сдвига разрядов операнда вправо.Особенность этого сдвига в том, что он происходит с некоторой задержкой, так какочередной сдвигаемый бит оказывается на некоторое время вне операнда. В это времяможно произвести его извлечение и (или) подмену. Другой важный момент заключается втом, что для счетчика сдвига микропроцессор использует только пять младших разрядовоперанда количество_разрядов. Таким образом, значение, большее 31, не допускается(аппаратно это ограничение реализуется тем, что игнорируются значения битов счетчикастарше пятого). Обратите внимание на еще один интересный эффект, связанный споведением флага of, — его значение имеет смысл только в операциях сдвига на одинразряд и обусловлено тем, что по изменению этого флага можно судить о факте изменениязнакового разряда операнда:••of=1, если текущие (то есть до операции сдвига) значения флага cf и старшего,левого бита операнда различны;of=0, если текущие (то есть до операции сдвига) значения флага cf и старшего,левого бита операнда слева совпадают.;подсчет числа единичных битов воперандеoperand dw......movcx,16;размероперандаxoral,al;счетчикединичных битовcycl:rcroperand,1jc$+4;переход, еслиочередной выдвинутый бит равен 1jmp$+4;переход, еслиочередной выдвинутый бит равен 0incal;увеличитьсчетчик единичных битовloopcyclСм.
также: урок 9 и команды rcl, rol, ror, sal, sar, shl, shrREP/REPE/REPZ/REPNE/REPNZ(REPeat string operation)Повторить цепочечную операциюrepreperepzСхема команды:repnerepnzНазначение: указание условного и безусловного повторения следующей за даннойкомандой цепочечной операции.СинтаксисАлгоритм работы:Алгоритм работы зависит от конкретного префикса.
Префиксы rep, repe и repz на самомделе имеют одинаковый код операции, их действия зависят от той цепочечной команды,которую они предваряют:••rep используется перед следующими цепочечными командами и их краткимиэквивалентами: movs, stos, ins, outs. Действия rep:1.
анализ содержимого cx: если cx<>0, то выполнить цепочечную команду, следующую заданным префиксом и перейти к шагу 2; если cx=0, то передать управление команде, следующей за даннойцепочечной командой (выйти из цикла по rep);2. уменьшить значение cx=cx–1 и вернуться к шагу 1;repe и repz используются перед следующими цепочечными командами и ихкраткими эквивалентами: cmps, scas. Действия repe и repz:1. анализ содержимого cx и флага zf: если cx<>0 или zf<>0, то выполнить цепочечную команду,следующую за данным префиксом, и перейти к шагу 2; если cx=0 или zf=0, то передать управление команде, следующей заданной цепочечной командой (выйти из цикла по rep);2. уменьшить значение cx=cx-1 и вернуться к шагу 1;•repne и repnz также имеют один код операции и имеют смысл при использованииперед следующими цепочечными командами и их краткими эквивалентами: cmps,scas.
Действия repne и repnz:1. анализ содержимого cx и флага zf: если cx<>0 или zf=0, то выполнить цепочечную команду,следующую за данным префиксом и перейти к шагу 2; если cx=0 или zf<>0, то передать управление команде, следующей заданной цепочечной командой (выйти из цикла по rep);2. уменьшить значение cx=cx–1 и вернуться к шагу 1.Состояние флагов после выполнения команды:06ZFrПрименение:Команды rep, repe, repz, repne и repnz в силу специфики своей работы называютсяпрефиксами.
Они имеют смысл только при использовании цепочечных операций,заставляя их циклически выполняться и тем самым без организации внешнего циклаобрабатывать последовательности элементов фиксированной длины. Большинствоприменяемых префиксов являются условными, то есть они прекращают работуцепочечной команды при выполнении определенных условий.См. также: урок 11 и команды cmps/cmpsb/cmpsw/cmpsd, ins/insb/insw/insd, outs,movs/movsb/movsw/movsd, scas/scasb/scasw/scasd, stos/stosb/stosw/stosdRET/RETF(RETurn/RETurn Far from procedure)Возврат ближний (дальний) из процедурыretret числоНазначение: возврат управления из процедуры вызывающей программе.Схема команды:СинтаксисАлгоритм работы:Работа команды зависит от типа процедуры:•••для процедур ближнего типа — восстановить из стека содержимое eip/ip;для процедур дальнего типа — последовательно восстановить из стека содержимоеeip/ip и сегментного регистра cs.если команда ret имеет операнд, то увеличить содержимое esp/sp на величинуоперанда число; при этом учитывается атрибут режима адресации — use16 илиuse32:o если use16, то sp=(sp+число), то есть указатель стека сдвигается на числобайт, равное значению число;o если use32, то sp=(sp+2*число), то есть указатель стека сдвигается на числослов, равное значению число.Состояние флагов после выполнения команды:выполнение команды не влияет на флагиПрименение:Команду ret необходимо применять для возврата управления вызывающей программе изпроцедуры, управление которой было передано по команде call.