Já foi dito que o endereço de retorno era armazenado na stack pela instrução CALL e de lá retirado pela instrução RET.
Quando a instrução CALL é executada para efectuar um call do tipo near o SP é automaticamente decrementado dois valores e o conteúdo do registo IP é copiado para a nova posição apontada por SP. Quando o processador encontra a instrução RET no fim do procedimento, copia o conteúdo da posição de memória apontada por SP para o registo IP e incrementa o SP dois valores.
Por exemplo, assumindo que o valor do SS é 7000H e o valor de SP 0050H, então o endereço físico do topo da stack é 70050H. Depois de um call do tipo near o SP ficará com o valor 004EH e o endereço físico do topo da stack passaria a ser 7004EH. Quando a instrução RET for executada, o valor armazenado em stack (a palavra apontada por SP) voltava a ser colocado no registo IP e o registo SP depois de incrementado voltava ao valor 0050H.
Para usarmos a stack num programa a primeira coisa a fazer é declará-la. Como já foi dito o 8086 trata a stack como outro segmento qualquer. Então para declararmos uma stack poderíamos usar a seguinte sequência de instruções:
STACK_SEG SEGMENT
DW 40 DUP(0)
STACK_TOP LABEL WORD
STACK_SEG ENDS
Esta sequência de instruções declara uma stack com espaço para 40 words. Como as palavras são escritas na stack a partir do topo é conveniente ter um label que nos permita referenciá-lo.
Como todas as instruções que escrevem palavras na stack decrementam primeiro o SP dois valores e só depois é que escrevem a palavra, convém inicializarmos o SP com o primeiro endereço par depois das 40 palavras que constituem a stack.
É também necessário inicializar o registo SS para que este aponte para o inicio da stack. Para fazer-mos estas inicializações poderíamos usar as seguinte sequência de instruções:
CODE_SEG SEGMENT
ASSUME: CS:CODE_SEG, SS:STACK_SEG
MOV AX, STACK_SEG
MOV SS, AX
LEA SP, STACK_TOP
..........
CODE_SEG ENDS