POP dst reads the word at SS:SP into the destination, then adds 2 to SP. It undoes the last PUSH: the stack is last in, first out, so values come back in the reverse order they went in. The destination is a 16-bit general register, a segment register other than CS, or a word in memory. The memory word is not erased; it simply lies below SP and will be overwritten by the next push or interrupt. No flags change.

Prints 321: last in, first out.
MOV AX, 1
PUSH AX
MOV AX, 2
PUSH AX
MOV AX, 3
PUSH AX
MOV CX, 3
NEXT1:
POP AX ; 3, then 2, then 1
ADD AL, '0' ; digit -> character
MOV DL, AL
MOV AH, 02h ; DOS: print DL
INT 21h
LOOP NEXT1

Restoring in order

Registers saved with PUSH AX / PUSH BX / PUSH CX are restored with POP CX / POP BX / POP AX. Getting the order wrong does not fail; it silently swaps the values, which is sometimes even done on purpose (PUSH AX / PUSH BX / POP AX / POP BX exchanges the two).

Segment registers

POP DS and POP ES are the usual way to restore or copy segments. POP CS is not accepted by MASM: changing CS alone would continue at the same IP in another segment; use a far jump or RETF instead. POP SS works but needs care: after any load of a segment register the 8086 lets the next instruction run before an interrupt can be taken, so load SS and then SP immediately, in that order. Some early 8088 chips did not hold off interrupts correctly, which is why careful code wraps a stack switch in CLI / STI.

CLI ; switch stacks with interrupts off
MOV SS, AX
MOV SP, 0FFFEh
STI

Pitfalls

Popping more than was pushed takes the return address or a caller's data. To throw away pushed words without loading them anywhere, add to SP: ADD SP, 4 discards two words, which is how a caller removes its arguments after a CALL.

Later CPUs

The 80186 adds POPA. The 80386 adds 32-bit pops and FS / GS. On the 80286 and later the opcode the 8086 used for POP CS (0Fh) starts the new two-byte instructions.