Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
PUSHAD
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
|
|
|
60 |
PUSHA |
Сохранить в стеке регистры AX, CX, DX, BX, исходный SP, BP, SI и DI |
Intel286 |
pusha |
60 |
PUSHAD |
Сохранить в стеке регистры EAX, ECX, EDX, EBX, исходный ESP, EBP, ESI и EDI |
Intel386 |
pushad |
Описание:
Команда PUSHA/PUSHAD сохраняет в стеке содержимое восьми 16-битных (PUSHA) или 32-битных (PUSHAD) регистров общего назначения. Команда PUSHA уменьшает указатель стека на 16. Команда PUSHAD уменьшает указатель стека на 32. Последний помещаемый в стек регистр — регистр (E)DI.
Мнемоники PUSHA и PUSHAD имеют один код операции. Конкретная выполняемая команда определяется атрибутом размера операнда. Некоторые ассемблеры могут вставлять соответствующий префикс размера операнда перед кодом операции при преобразовании мнемоник PUSHA и PUSHAD, другие же ассемблеры воспринимают эти мнемоники одинаково и программируют только код операции, работа команды в этом случае определяется текущей установкой размера операнда для кодового сегмента (бит D дескриптора). Размерность адреса при обращении к стеку (используется либо SS:SP при 16-битной адресации, либо SS:ESP при 32-битной адресации) определяется текущей разрядностью стекового сегмента (бит B соответствующего дескриптора) и не может быть переопределена префиксом размера адреса перед кодом операции.
В реальном режиме, если значение eSP равно 1, 3 или 5 перед исполнением команды PUSHA/PUSHAD, процессор сбрасывается из-за отсутствия места в стеке. Такое поведение процессора документируется для процессоров Intel и вероятно возможно и при некоторых других значениях в eSP, однако, некоторые модели процессоров (впервую очередь это касается клонов производства других фирм) могут вести себя совершенно непредсказуемо в данной ситуации.
Операция:
IF OperandSize = 16 (* Команда PUSHA *)
THEN
Temp = SP;
Push(AX);
Push(CX);
Push(DX);
Push(BX);
Push(Temp);
Push(BP);
Push(SI);
Push(DI);
ELSE (* OperandSize = 32, команда PUSHAD *)
Temp = ESP;
Push(EAX);
Push(ECX);
Push(EDX);
Push(EBX);
Push(Temp);
Push(EBP);
Push(ESI);
Push(EDI);
FI;
Особые ситуации защищенного режима:
#SS(0), если в процессе исполнения команды вершина стека выходит из пределов стекового сегмента.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#GP, если регистр (E)SP равен 7, 9 ... 15.
Особые ситуации режима V86:
#GP, если регистр (E)SP равен 7, 9 ... 15.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru