Por que o DOS define o registro SP como 0xFFFE após carregar um arquivo .COM?

10

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?

nadder
fonte
6
O DOS armazena um ponteiro para uma int 20hinstrução lá para que você possa sair do programa emitindo uma retinstrução.
fuz 22/03

Respostas:

16

Isso é para compatibilidade com o CP / M.

No CP / M, você poderia simplesmente retornar do seu programa usando rete seu programa sairia corretamente. Isso foi alcançado com um 0x0000no topo da pilha e uma int 20hinstrução no endereço 0x0000. Embora int 20hseja a maneira oficial do DOS de encerrar um programa, a opção de encerrar o programa call 0foi mantida no CP / M, e o escopo mais externo retfunciona da mesma forma desde que retorna a 0.

Para ter essa 0x0000palavra no topo da pilha, é necessário iniciar a pilha utilizável 2 bytes mais abaixo, obviamente. É por isso que SPestá inicialmente em 0xFFFE, apontando para a 0x0000palavra que por sua vez aponta para a int 20hinstrução.

CherryDT
fonte