Конспект лекций Системное программирование (семестр 2) Возле названия каждой лекции написано число пар, в течение которых она будет читаться (+ ср обозначает

Вид материалаКонспект
Схема команды
Состояние флагов после выполнения команды
См. также
Схема команды
Состояние флагов после выполнения команды
См. также
Подобный материал:
1   ...   29   30   31   32   33   34   35   36   ...   57

PUSHFD


(PUSH eFlags Double word register onto stack)

Размещение расширенного регистра флагов в стеке

 

Схема команды: 

pushfd 

Назначение: размещение в стеке содержимого регистра флагов eflags.

Синтаксис

Алгоритм работы:
  • уменьшить значение указателя стека esp на 4;
  • записать в вершину стека двойное слово, представляющее собой содержимое регистра eflags.

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Команды pushfd и popfd используются аналогично командам pushf и popf. Команда pushfd применяется для получения содержимого регистра флагов. Как известно, прямой доступ к регистру флагов невозможен, поэтому данная команда является одной из немногих команд, позволяющих получить доступ к регистру флагов как к содержимому обычного регистра. Обратное действие, то есть восстановление — возможно измененного слова — в регистр флагов, осуществляется командой popfd. Эта команда может использоваться в программах обработки прерываний или в других случаях, когда необходимо сохранить локальный контекст процесса вычисления.

.386

;извлечь значение регистра eflags и изменить

;значение флага cf на обратное

        pushfd

        pop     eax

        xor     eax,01h

        push    eax

        popfd

        

См. также: уроки 7, 10, 14, 15, 16, 17 и команды pop, popa, popad, popf, popfd, push, pusha, pushad, pushf

RCL


(Rotate operand through Carry flag Left)

Циклический сдвиг операнда влево через флаг переноса

 

Схема команды: 

rcl операнд,количество_сдвигов 

Назначение: операция циклического сдвига операнда влево через флаг переноса cf.

Синтаксис

Алгоритм работы:
  • сдвиг всех битов операнда влево на один разряд, при этом старший бит операнда становится значением флага переноса cf;
  • одновременно старое значение флага переноса cf вдвигается в операнд справа и становится значением младшего бита операнда;
  • указанные выше два действия повторяются количество раз, равное значению второго операнда команды rcl.

Состояние флагов после выполнения команды:

11

00

OF

CF

?r



Здесь обозначение ?r означает то, что анализ состояния флага имеет смысл при определенном сочетании операндов. В случае команды rcl флаг of представляет интерес, если сдвиг осуществляется на один разряд (см. ниже описание применения команды rcl).

Применение:

Команда rcl используется для циклического сдвига разрядов операнда влево. Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда. В это время можно произвести его извлечение и (или) подмену. Другой важный момент заключается в том, что для счетчика сдвига микропроцессор использует только пять младших разрядов операнда количество_разрядов. Таким образом, значение, большее 31, микропроцессором не допускается (аппаратно это ограничение реализуется тем, что игнорируются значения всех битов счетчика, кроме первых пяти). Обратите внимание на еще один интересный эффект, связанный с поведением флага of. В операциях сдвига на один разряд по изменению этого флага можно судить о факте изменения знакового (старшего) разряда операнда:
  • of=1, если текущее значение флага cf и выдвигаемого бита операнда слева различны;
  • of=0, если текущее значение флага cf и выдвигаемого бита операнда слева совпадают.

 

;сдвиг операнда, занимающего два двойных слова

;на четыре разряда влево

ch_l    dd      ...     ;младшая часть 64-битного операнда

ch-2    dd      ...     ;старшая часть 64-битного операнда

...

        mov     cx,4    ;счетчик сдвигов в cx

        mov     eax,ch_l

        mov     edx,ch_h

m1:     clc             ;очистка флага cf

        rcl     eax,1   ;старший бит eax в cf

        rcl     edx,1   ;cf в младший бит edx, старший бит edx в cf

        loop    m1

        

См. также: урок 9 и команды rcr, rol, ror, sal, sar, shl, shr