Знакомство с порядком описания команд и принятыми обозначениями 8 страница



  • загрузить в приемник содержимое вершины стека (адресуется парой ss:esp/sp);
  • увеличить содержимое esp/sp на 4 (2 байта) для use32 (соответственно для use16).

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

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

Применение:

Команда применяется для восстановления содержимого вершины стека в регистр, ячейку памяти или сегментный регистр. Заметим, что недопустимо восстановление значения в сегментный регистр cs.

my_proc proc near push ax push bx;тело процедуры, в которой изменяется содержимое;регистров ax и bx... pop bx pop ax ret endp

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

POPA

(POP All general registers from the stack)

Извлечение всех регистров общего назначения из стека

 

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

Назначение: извлечение из стека регистров общего назначения di, si, bp, sp, bx, dx, cx, ax.

Синтаксис

Алгоритм работы:

  • извлечь из стека последовательно значения и загрузить ими регистры общего назначения di, si, bp, sp, bx, dx, cx, ax. Содержимое di восстанавливается первым. Содержимое sp извлекается, но не восстанавливается;
  • увеличить значение указателя стека esp/sp на 16.

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

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

Применение:

Команда popa по принципу работы является обратной команде pusha и используется для восстановления содержимого всех регистров общего назначения значениями из стека. Эту команду можно использовать в процедурах и программах обработки прерываний для восстановления регистров общего назначения прерванной программы.

.386my_proc proc near pusha;тело процедуры, в которой изменяется;содержимое регистров общего назначения... popa ret endp

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

POPAD

(POP All general Double word registers from the stack)

Извлечение всех 32-разрядных регистров общего назначения из стека

 

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

Назначение: извлечение из стека регистров общего назначения edi, esi, ebp, esp, ebx, edx, ecx, eax.

Синтаксис

Алгоритм работы:

  • извлечь из стека последовательно значения и загрузить ими 32-разрядные регистры общего назначения edi, esi, ebp, esp, ebx, edx, ecx, eax. Содержимое edi восстанавливается первым. Содержимое esp извлекается но не восстанавливается;
  • увеличить значение указателя стека esp на 32.

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

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

Применение:

Команда popad по принципу работы является обратной команде pushad и используется для восстановления всех 32-разрядных регистров общего назначения. Эту команду можно использовать в процедурах и программах обработки прерываний для восстановления регистров общего назначения прерванной программы.

.386my_proc proc near pushad;тело процедуры, в которой изменяется;содержимое регистров общего назначения... popad ret endp

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

POPF

(POP Flags register from the stack)

Извлечение регистра флагов из стека

 

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

Назначение: извлечение из стека слова и восстановление его в регистр флагов flags.

Синтаксис

Алгоритм работы:

  • извлечь из вершины стека слово и поместить его в регистр flags;
  • увеличить значение указателя стека esp на 2.

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

14 1312 11 10 09 08 07 06 04 02 00
NT IOPL OF DF IF TF SF ZF AF PF CF
r r r r r r r r r r r

Применение:

Команда popf по принципу работы является обратной команде pushf и используется для восстановления из стека содержимого регистра флагов eflags. Возможным вариантом использования этой команды являются программы обработки прерываний или другие случаи, в которых необходимо сохранять некоторый локальный контекст процесса вычисления. Из-за того, что регистр eflags/flags непосредственно недоступен, команда popf является одной из немногих возможностей влияния на его содержимое.

;установить значение регистра flags в 03h mov ax,3h push ax popf

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

POPFD

(POP eFlags Double word register from the stack)

Извлечение расширенного регистра флагов из стека

 

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

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

Синтаксис

Алгоритм работы:

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

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

17 16 14 1312 11 10 09 08 07 06 04 02 00
VM RF NT IOPL OF DF IF TF SF ZF AF PF CF
0 r r r r r r r r r r r r

Применение:

Команда popfd по принципу работы является обратной командой команде pushfd и используется для восстановления из стека содержимого регистра флагов eflags. Необходимо отметить, что команда popfd не влияет на состояние флагов vm и rf.

.386;установить значение регистра eflags в 03h mov eax,3h push eax popfd eax ;установить новое значение eflags

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

PUSH

(PUSH operand onto stack)

Размещение операнда в стеке

 

Схема команды: push источник

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

Синтаксис

Алгоритм работы:

  • уменьшить значение указателя стека esp/sp на 4/2 (в зависимости от значения атрибута размера адреса — use16 или use32);
  • записать источник в вершину стека (адресуемую парой ss:esp/sp).

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

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

Применение:

Команда push используется совместно с командой pop для записи значений в стек и извлечения их из стека. Размер записываемых значений — слово или двойное слово. Также в стек можно записывать непосредственные значения. Заметьте, что в отличие от команды pop в стек можно включать значение сегментного регистра cs. Другой интересный момент связан с регистром sp. Команда push esp/sp записывает в стек значение esp/sp по состоянию до выдачи этой команды. В микропроцессоре i8086 по этой команде записывалось скорректированное значение sp. При записи в стек 8-битных значений для них все равно выделяется слово или двойное слово (в зависимости от use16 или use32).

my_proc proc near push ax push bx;тело процедуры, в которой изменяется содержимое;регистров ax и bx... pop bx pop ax ret endp

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

PUSHA

(PUSH All general registers onto stack)

Размещение всех регистров общего назначения в стеке

 

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

Назначение: размещение в стеке регистров общего назначения в следующей последовательности: ax, cx, dx, bx, sp, bp, si, di.

Синтаксис

Алгоритм работы:

  • уменьшить значение указателя стека esp/sp на 32/16 (в зависимости от значения атрибута размера адреса — use16 или use32);
  • включить в стек последовательно значения регистров общего назначения ax, cx, dx, bx, sp, bp, si, di.

Содержимое di при этом будет на вершине стека. В стек помещается содержимое sp по состоянию до выполнения команды.

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

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

Применение:

Команда pusha используется совместно с командой popa для сохранения и восстановления всех регистров общего назначения. Эти команды удобно использовать при работе с процедурами, программами обработки прерываний, а также в других случаях для сохранения и восстановления регистров общего назначения как части контекста некоторого вычислительного процесса.

my_proc proc near pusha;тело процедуры, в которой изменяется;содержимое регистров общего назначения... popa ret endp

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

PUSHAD

(PUSH All general Double word registers onto stack)

Размещение всех регистров общего назначения в стеке

 

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

Назначение: размещение в стеке регистров общего назначения в следующей последовательности: eax, ecx, edx, ebx, esp, ebp, esi, edi.

Синтаксис

Алгоритм работы:

  • уменьшить значение указателя стека esp на 32;
  • включить в стек последовательно значения регистров общего назначения eax, ecx, edx, ebx, esp, ebp, esi, edi. Содержимое edi при этом будет на вершине стека. Содержимое esp включается по состоянию на момент, предшествовавший выполнению данной команды.

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

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

Применение:

Команда pushad используется совместно с командой popad для сохранения и восстановления всех регистров общего назначения. Эти команды используются аналогично командам popa и pusha.

.386my_proc proc near pushad;тело процедуры, в которой изменяется;содержимое регистров общего назначения... popad ret endp

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

PUSHF

(PUSH Flags register onto stack)

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

 

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

Назначение: размещение в вершине стека (ss:sp) содержимого регистра флагов flags.

Синтаксис

Алгоритм работы:

  • уменьшить значение указателя стека sp на 2;
  • поместить в вершину стека содержимое регистра flags.

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

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

Применение:

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

;извлечь значение регистра flags и изменить;значение флага cf на обратное pushf pop ax xor ax,01h push ax popf

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

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

Здесь обозначение ?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_hm1: clc ;очистка флага cf rcl eax,1 ;старший бит eax в cf rcl edx,1 ;cf в младший бит edx, старший бит edx в cf loop m1

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

RCR

(Rotate operand through Carry flag Right)

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

 

Схема команды: rcr операнд,количество_сдвигов

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

Синтаксис


Дата добавления: 2019-09-13; просмотров: 1480; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!