Иллюстрированный самоучитель по Assembler

       

PUSH Занесение операнда в стек


Команда push уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину двухбайтовый операнд-источник (проталкивает в стек новое данное). Проталкивать в стек можно только целые слова (не байты). Программа должна строго следить за тем, чтобы каждой команде проталкивания в стек push отвечала обратная команда выталкивания из стека pop. Если стек используется для временного хранения некоторых данных, то извлекать эти данные из стека следует в порядке, обратном их сохранению.

В качестве операнда-источника может использоваться любой 16-разрядный регистр (включая сегментный) или ячейка памяти. Не допускается занесение в стек непосредственного значения, хотя некоторые трансляторы преобразуют команду вида

push 1234h

в неэффективную последовательность операций со стеком, результатом которой будет проталкивание указанного операнда в стек. Команда push не воздействует на флаги процессора.

Пара команд push - pop часто используется для пересылки данного из регистра в регистр (особенно, в сегментный) через стек.

Пример 1

push ES:mem ;Сохранение содержимого

push DS ;слова памяти mem из

push BP ;дополнительного сегмента

;а также регистров DS и ВР

… ;

pop PP ;Восстановление из стека

pop DS ;трех операндов



pop ES: mem ;в обратном порядке

Пример 2

push DS ;Пересылка DS через стек

pop ES ;Теперь ES=DS

Допустима засылка в стек 32-битовых операндов (регистров и ячеек памяти), а также занесение в стек 8-, 16- и 32-битовых непосредственных значений. Каждое 8-битовое значение занимает в стеке целое слово. Операнды любого допустимого размера могут заноситься з стек вперемежку', если это не вступает в противоречие с операциями по извлечению этих данных из стека.

Пример 1

push AX ; Сохранение в стеке регистра АХ

push 32h ;Сохранение в стеке

;константы 32h (она займет в

;стеке 1 слово)

push EAX ;Сохранение в стеке регистра

;ЕАХ (два слова стека)

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

mov AX, 7

rcl АХ,1 ' ;AX=000Eh=14, CF=0

Пример 2

stc ;Установим CF

mov DL,7

rcl DL,1 ;DL=0Fh=15, CF=0

Пример 3

clc ;Сбросим CF

mov BX,0FFFFh

rcl BX,1 ' ;BX=FFFEh, CF=1

Пример 4

clc ;Сбросим CF

mov DH,3

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

rcl DH,CL ;DH=30h=48, CF=0

Допустим сдвиг 32-битовых операндов. Допустимо указание числа битов сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит.

Пример

mov EAX,0С0000003h

clc ;Сбросим CF

rcl EAX,2 ;EAX=0000000Dh, CF=1


Содержание раздела