79 lines
3.2 KiB
HTML
79 lines
3.2 KiB
HTML
<html><!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
|
|
<html>
|
|
|
|
<head>
|
|
<title>80386 Programmer's Reference Manual -- Opcode PUSH</title>
|
|
</head>
|
|
|
|
<body>
|
|
<b>up:</b> <a href="C17.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/C17.HTM">Chapter 17 -- 80386 Instruction Set</a><br>
|
|
<b>prev:</b><a href="POPF.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/POPF.HTM"> POPF/POPFD Pop Stack into FLAGS or EFLAGS Register</a><br>
|
|
<b>next:</b><a href="PUSHA.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/PUSHA.HTM"> PUSHA/PUSHAD Push all General Registers</a>
|
|
<p>
|
|
<hr>
|
|
<p>
|
|
<h1>PUSH -- Push Operand onto the Stack</h1>
|
|
<pre>
|
|
|
|
|
|
|
|
Opcode Instruction Clocks Description
|
|
|
|
FF /6 PUSH m16 5 Push memory word
|
|
FF /6 PUSH m32 5 Push memory dword
|
|
50 + /r PUSH r16 2 Push register word
|
|
50 + /r PUSH r32 2 Push register dword
|
|
6A PUSH imm8 2 Push immediate byte
|
|
68 PUSH imm16 2 Push immediate word
|
|
68 PUSH imm32 2 Push immediate dword
|
|
0E PUSH CS 2 Push CS
|
|
16 PUSH SS 2 Push SS
|
|
1E PUSH DS 2 Push DS
|
|
06 PUSH ES 2 Push ES
|
|
0F A0 PUSH FS 2 Push FS
|
|
OF A8 PUSH GS 2 Push GS
|
|
</pre>
|
|
<h2>Operation</h2>
|
|
<pre>
|
|
|
|
|
|
|
|
IF StackAddrSize = 16
|
|
THEN
|
|
IF OperandSize = 16 THEN
|
|
SP := SP - 2;
|
|
(SS:SP) := (SOURCE); (* word assignment *)
|
|
ELSE
|
|
SP := SP - 4;
|
|
(SS:SP) := (SOURCE); (* dword assignment *)
|
|
FI;
|
|
ELSE (* StackAddrSize = 32 *)
|
|
IF OperandSize = 16
|
|
THEN
|
|
ESP := ESP - 2;
|
|
(SS:ESP) := (SOURCE); (* word assignment *)
|
|
ELSE
|
|
ESP := ESP - 4;
|
|
(SS:ESP) := (SOURCE); (* dword assignment *)
|
|
FI;
|
|
FI;
|
|
</pre>
|
|
<h2>Description</h2>
|
|
PUSH decrements the stack pointer by 2 if the operand-size attribute of the instruction is 16 bits; otherwise, it decrements the stack pointer by 4. PUSH then places the operand on the new top of stack, which is pointed to by the stack pointer.
|
|
<p>The 80386 PUSH eSP instruction pushes the value of eSP as it existed before the instruction. This differs from the 8086, where PUSH SP pushes the new value (decremented by 2).
|
|
<h2>Flags Affected</h2>
|
|
None
|
|
<h2>Protected Mode Exceptions</h2>
|
|
#SS(0) if the new value of SP or ESP is outside the stack segment limit; #GP(0) for an illegal memory operand effective address in the CS, DS, ES, FS, or GS segments; #SS(0) for an illegal address in the SS segment; #PF(fault-code) for a page fault
|
|
<h2>Real Address Mode Exceptions</h2>
|
|
None; if SP or ESP is 1, the 80386 shuts down due to a lack of stack space
|
|
<h2>Virtual 8086 Mode Exceptions</h2>
|
|
Same exceptions as in real-address mode; #PF(fault-code) for a page fault
|
|
<p>
|
|
<hr>
|
|
<p><b>up:</b> <a href="C17.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/C17.HTM">Chapter 17 -- 80386 Instruction Set</a><br>
|
|
<b>prev:</b><a href="POPF.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/POPF.HTM"> POPF/POPFD Pop Stack into FLAGS or EFLAGS Register</a><br>
|
|
<b>next:</b><a href="PUSHA.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/PUSHA.HTM"> PUSHA/PUSHAD Push all General Registers</a>
|
|
</body>
|
|
|