Na página da wikpedia sobre arquivos .COM https://en.wikipedia.org/wiki/COM_file , lê-se:
Os arquivos .COM no DOS definem todos os registros do segmento x86 com o mesmo valor e o SP (ponteiro da pilha) é registrado como 0xFFFE, portanto, a pilha começa no topo do segmento da memória e desce a partir daí.
Mas isso realmente define a pilha para começar uma palavra abaixo da parte superior do segmento. Ao pressionar um valor na pilha, a CPU decrementa SP para 0xFFFC e armazena o valor lá, desperdiçando assim a palavra principal do segmento. Qual é o motivo do DOS não definir SP como 0?
int 20h
instrução lá para que você possa sair do programa emitindo umaret
instrução.Respostas:
Isso é para compatibilidade com o CP / M.
No CP / M, você poderia simplesmente retornar do seu programa usando
ret
e seu programa sairia corretamente. Isso foi alcançado com um0x0000
no topo da pilha e umaint 20h
instrução no endereço0x0000
. Emboraint 20h
seja a maneira oficial do DOS de encerrar um programa, a opção de encerrar o programacall 0
foi mantida no CP / M, e o escopo mais externoret
funciona da mesma forma desde que retorna a0
.Para ter essa
0x0000
palavra no topo da pilha, é necessário iniciar a pilha utilizável 2 bytes mais abaixo, obviamente. É por isso queSP
está inicialmente em0xFFFE
, apontando para a0x0000
palavra que por sua vez aponta para aint 20h
instrução.fonte