| <!DOCTYPE html> |
| |
| <html> |
| <head> |
| <meta charset="UTF-8"> |
| <link href="style.css" type="text/css" rel="stylesheet"> |
| <title>POPA/POPAD—Pop All General-Purpose Registers </title></head> |
| <body> |
| <h1>POPA/POPAD—Pop All General-Purpose Registers</h1> |
| <table> |
| <tr> |
| <th>Opcode</th> |
| <th>Instruction</th> |
| <th>Op/En</th> |
| <th>64-Bit Mode</th> |
| <th>Compat/Leg Mode</th> |
| <th>Description</th></tr> |
| <tr> |
| <td>61</td> |
| <td>POPA</td> |
| <td>NP</td> |
| <td>Invalid</td> |
| <td>Valid</td> |
| <td>Pop DI, SI, BP, BX, DX, CX, and AX.</td></tr> |
| <tr> |
| <td>61</td> |
| <td>POPAD</td> |
| <td>NP</td> |
| <td>Invalid</td> |
| <td>Valid</td> |
| <td>Pop EDI, ESI, EBP, EBX, EDX, ECX, and EAX.</td></tr></table> |
| <h3>Instruction Operand Encoding</h3> |
| <table> |
| <tr> |
| <td>Op/En</td> |
| <td>Operand 1</td> |
| <td>Operand 2</td> |
| <td>Operand 3</td> |
| <td>Operand 4</td></tr> |
| <tr> |
| <td>NP</td> |
| <td>NA</td> |
| <td>NA</td> |
| <td>NA</td> |
| <td>NA</td></tr></table> |
| <h2>Description</h2> |
| <p>Pops doublewords (POPAD) or words (POPA) from the stack into the general-purpose registers. The registers are loaded in the following order: EDI, ESI, EBP, EBX, EDX, ECX, and EAX (if the operand-size attribute is 32) and DI, SI, BP, BX, DX, CX, and AX (if the operand-size attribute is 16). (These instructions reverse the operation of the PUSHA/PUSHAD instructions.) The value on the stack for the ESP or SP register is ignored. Instead, the ESP or SP register is incremented after each register is loaded.</p> |
| <p>The POPA (pop all) and POPAD (pop all double) mnemonics reference the same opcode. The POPA instruction is intended for use when the operand-size attribute is 16 and the POPAD instruction for when the operand-size attri-bute is 32. Some assemblers may force the operand size to 16 when POPA is used and to 32 when POPAD is used (using the operand-size override prefix [66H] if necessary). Others may treat these mnemonics as synonyms (POPA/POPAD) and use the current setting of the operand-size attribute to determine the size of values to be popped from the stack, regardless of the mnemonic used. (The D flag in the current code segment’s segment descriptor determines the operand-size attribute.)</p> |
| <p>This instruction executes as described in non-64-bit modes. It is not valid in 64-bit mode.</p> |
| <h2>Operation</h2> |
| <pre>IF 64-Bit Mode |
| THEN |
| #UD; |
| ELSE |
| IF OperandSize = 32 (* Instruction = POPAD *) |
| THEN |
| EDI ← Pop(); |
| ESI ← Pop(); |
| EBP ← Pop(); |
| Increment ESP by 4; (* Skip next 4 bytes of stack *) |
| EBX ← Pop(); |
| EDX ← Pop(); |
| ECX ← Pop(); |
| EAX ← Pop(); |
| ELSE (* OperandSize = 16, instruction = POPA *) |
| DI ← Pop(); |
| SI ← Pop(); |
| BP ← Pop(); |
| Increment ESP by 2; (* Skip next 2 bytes of stack *) |
| BX ← Pop(); |
| DX ← Pop(); |
| CX ← Pop(); |
| AX ← Pop(); |
| FI; |
| FI;</pre> |
| <h2>Flags Affected</h2> |
| <p>None.</p> |
| <h2>Protected Mode Exceptions</h2> |
| <table class="exception-table"> |
| <tr> |
| <td>#SS(0)</td> |
| <td>If the starting or ending stack address is not within the stack segment.</td></tr> |
| <tr> |
| <td>#PF(fault-code)</td> |
| <td>If a page fault occurs.</td></tr> |
| <tr> |
| <td>#AC(0)</td> |
| <td>If an unaligned memory reference is made while the current privilege level is 3 and alignment checking is enabled.</td></tr> |
| <tr> |
| <td>#UD</td> |
| <td>If the LOCK prefix is used.</td></tr></table> |
| <h2>Real-Address Mode Exceptions</h2> |
| <table class="exception-table"> |
| <tr> |
| <td>#SS</td> |
| <td>If the starting or ending stack address is not within the stack segment.</td></tr> |
| <tr> |
| <td>#UD</td> |
| <td>If the LOCK prefix is used.</td></tr></table> |
| <h2>Virtual-8086 Mode Exceptions</h2> |
| <table class="exception-table"> |
| <tr> |
| <td>#SS(0)</td> |
| <td>If the starting or ending stack address is not within the stack segment.</td></tr> |
| <tr> |
| <td>#PF(fault-code)</td> |
| <td>If a page fault occurs.</td></tr> |
| <tr> |
| <td>#AC(0)</td> |
| <td>If an unaligned memory reference is made while alignment checking is enabled.</td></tr> |
| <tr> |
| <td>#UD</td> |
| <td>If the LOCK prefix is used.</td></tr></table> |
| <h2>Compatibility Mode Exceptions</h2> |
| <p>Same as for protected mode exceptions.</p> |
| <h2>64-Bit Mode Exceptions</h2> |
| <table class="exception-table"> |
| <tr> |
| <td>#UD</td> |
| <td>If in 64-bit mode.</td></tr></table></body></html> |