PUSH Занесение операнда в стек
Команда push уменьшает на 2 содержимое указателя стека SP и заносит на эту новую
вершину двухбайтовый операнд-источник (проталкивает в стек новое данное). Проталкивать
в стек можно только целые слова (не байты). Программа должна строго следить
за тем, чтобы каждой команде проталкивания в стек push отвечала обратная команда
выталкивания из стека pop. Если стек используется для временного хранения некоторых
данных, то извлекать эти данные из стека следует в порядке, обратном их сохранению.
В качестве операнда-источника может использоваться любой 16-разрядный регистр
(включая сегментный) или ячейка памяти. Не допускается занесение в стек непосредственного
значения, хотя некоторые трансляторы преобразуют команду вида
push 1234h
в неэффективную последовательность
операций со стеком, результатом которой будет проталкивание указанного операнда
в стек. Команда push не воздействует на флаги процессора.
Пара команд push - pop часто используется для пересылки данного из регистра
в регистр (особенно, в сегментный) через стек.
Пример 1
push ES:mem ;Сохранение содержимого
Пример 2
push DS ;Пересылка DS через стек
Допустима засылка в стек 32-битовых операндов (регистров и ячеек памяти), а также занесение в стек 8-, 16- и 32-битовых непосредственных значений. Каждое 8-битовое значение занимает в стеке целое слово. Операнды любого допустимого размера могут заноситься з стек вперемежку', если это не вступает в противоречие с операциями по извлечению этих данных из стека.
Пример 1
push AX ; Сохранение в стеке регистра АХ
386+ PUSHA Сохранение в стеке всех регистров
Команда pusha сохраняет в стеке содержимое всех регистров в следующем порядке:
АХ, СХ, DX, ВХ, значение указателя стека SP перед выполнением данной команды,
дачее ВР, SI и DI. Команда не имеет параметров и не воздействует на флаги процессора.
Пример
pusha
386+ PUSHAD Сохранение в стеке всех регистров в 32-разрядном режиме
Команда pushad сохраняет в стеке содержимое всех регистров в следующем порядке:
EAX, ECX, EDX, ЕВХ, значение указателя стека ESP перед выполнением данной команды,
далее EBP, ESI и EDI. Команда не имеет параметров и не воздействует на флаги
процессора.
Пример
pushad
386+ PUSHFD Занесение в стек содержимого расширенного регистра флагов
Команда pushfd уменьшает на 4 содержимое указателя стека ESP и заносит на эту
новую вершину содержимое расширенного регистра флагов EFALGS. При этом сохраняются
все флаги процессора. Команда pushfd не имеет параметров и не воздействует на
флаги процессора.
Пример
pushfd ;Содержимое регистра флагов
RCL Циклический сдвиг влево через бит переноса
Команда гсl осуществляет сдвиг влево всех битов операнда. Если команда записана
в формате
rcl операнд,1
сдвиг осуществляется на 1 бит. В младший бит операнда заносится значение флага CF; старший бит операнда загружается в CF. Если команда записана в формате
rcl операнд,CL
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда поступают сначала в CF, а оттуда - в младшие биты операнда (рис. П4).
Рис. П4. Действие команды rcl.
В качестве операнда команды rcl можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF.
Пример 1
clc ;Сбросим CF
Пример 2
stc ;Установим CF
Пример 3
clc ;Сбросим CF
Пример 4
clc ;Сбросим CF
Допустим сдвиг 32-битовых операндов. Допустимо указание числа битов сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит.
Пример
mov EAX,0С0000003h