logo

Система команд x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

PUSH

Поместить операнд в стек

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

 

 

 

 

 

 

 

 

 

 

Код

Команда

Описание

Проц.

Пример

FF /6

PUSH r/m16

Сохранить в стеке слово из r/m16

8086

push word ptr [si]

FF /6

PUSH r/m32

Сохранить в стеке двойное слово из r/m32

Intel386

push dword ptr [12]

50+rw

PUSH r16

Сохранить в стеке слово из r16

8086

push di

50+rd

PUSH r32

Сохранить в стеке двойное слово из r32

Intel386

push esi

6A

PUSH imm8

Сохранить в стеке байт imm8

Intel286

push 0Ah

68

PUSH imm16

Сохранить в стеке слово imm16

Intel286

push 023Dh

68

PUSH imm32

Сохранить в стеке слово imm32

Intel386

push 012345FFh

0E

PUSH CS

Сохранить в стеке CS

8086

push cs

16

PUSH SS

Сохранить в стеке SS

8086

push ss

1E

PUSH DS

Сохранить в стеке DS

8086

push ds

06

PUSH ES

Сохранить в стеке ES

8086

push es

0F A0

PUSH FS

Сохранить в стеке FS

Intel386

push fs

0F A8

PUSH GS

Сохранить в стеке GS

Intel386

push gs

Операция:

IF StackAddrSize = 16

THEN

  IF OperandSize = 16

  THEN

     SP = SP - 2;

     (SS:SP) = (SOURCE); (* Пересылает слово *)

  ELSE (* OperandSize = 32 *)

     SP = SP - 4;

     (SS:SP) = (SOURCE); (* Пересылает двойное слово *)

  FI;

ELSE (* StackAddrSize = 32 *)

  IF OperandSize = 16

  THEN

     ESP = ESP - 2;

     (SS:ESP) = (SOURCE); (* Пересылает слово *)

  ELSE (* OperandSize = 32 *)

     ESP = ESP - 4;

     (SS:ESP) = (SOURCE); (* Пересылает двойное слово *)

  FI;

FI;

Описание:

Команда PUSH уменьшает указатель стека (E)SP на 2 для 16-битного размера операнда или на 4 для 32-битного размера операнда. Затем команда помещает операнд-источник в новую вершину стека, адресуемую через SS:SP, если атрибут размера адреса для стекового сегмента равен 16 бит (управляется битом B дескриптора стекового сегмента), или через SS:ESP, если атрибут размера для стекового сегмента адреса равен 32 бита. Атрибуты размера адреса и операнда для кода управляют, соответственно, размерностью адреса при доступе к операнду-источнику в памяти и размерностью самого пересылаемого операнда. При записи в стек однобайтного непосредственного значения указатель eSP уменьшается на 2, т.е. происходит запись слова (значения старших 8 бит этого слова не документировано для процессоров Intel).

Команда PUSH-из-памяти, которая использует указатель стека (E)SP в качестве базового регистра, обращается к памяти перед занесением данных в стек. Используемое при вычислении эффективного адреса значение является значением (E)SP перед выполнением команды.

В процессорах, начиная с Intel286, команда PUSH (E)SP помещает в стек значение регистра (E)SP такое, каким оно было до поступления команды. В 8086/8088 команда PUSH SP помещает в стек измененное значение SP (уменьшенное на 2).

В реальном режиме, если значение eSP равно 1 перед исполнением команды PUSH, процессор сбрасывается из-за отсутствия места в стеке. Такое поведение процессора документируется для процессоров Intel и вероятно возможно и при значении eSP равном 3 (если сохраняется двойное слово), однако, некоторые модели процессоров (в первую очередь это касается клонов производства других фирм) могут вести себя совершенно непредсказуемо в данной ситуации.

Особые ситуации защищенного режима:

#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.

Особые ситуации режима реальной адресации:

#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS или новое значение указателя стека eSP нарушает пределы стекового сегмента.

Особые ситуации режима V86:

#GP(0), если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память.


Входит в группу команд: Базовая система команд CPU



Все права защищены © 1997-2011 Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Яндекс.Метрика               Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники