Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
PUSH
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
|
|
|
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 |
Описание:
Команда 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 (если сохраняется двойное слово), однако, некоторые модели процессоров (в первую очередь это касается клонов производства других фирм) могут вести себя совершенно непредсказуемо в данной ситуации.
Операция:
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;
Особые ситуации защищенного режима:
#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) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru