next up previous contents
Next: Gravar o conteúdo dos Up: A stack do 8086 Previous: A stack do 8086

Guardar o endereço de retorno

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


next up previous contents
Next: Gravar o conteúdo dos Up: A stack do 8086 Previous: A stack do 8086
Maria Joao Nicolau
1/28/1999