¿Por qué DOS establece el registro SP en 0xFFFE después de cargar un archivo .COM?

10

En la página de wikpedia sobre archivos .COM https://en.wikipedia.org/wiki/COM_file se lee:

Los archivos .COM en DOS establecen todos los registros de segmentos x86 en el mismo valor y el SP (puntero de pila) se registra en 0xFFFE, por lo tanto, la pila comienza en la parte superior del segmento de memoria y funciona desde allí.

Pero esto realmente establece que la pila comience una palabra debajo de la parte superior del segmento. Al empujar un valor en la pila, la CPU disminuirá SP a 0xFFFC y almacenará el valor allí, desperdiciando así la palabra superior del segmento. ¿Cuál es la razón por la que DOS no establece SP en 0 en su lugar?

nadder
fuente
66
DOS almacena un puntero a una int 20hinstrucción allí para que pueda salir de su programa emitiendo una retinstrucción.
fuz

Respuestas:

16

Esto es por compatibilidad con CP / M.

En CP / M, simplemente podría regresar de su programa usando rety su programa saldría limpiamente. Esto se logró al tener un 0x0000en la parte superior de la pila y tener una int 20hinstrucción en la dirección 0x0000. Aunque int 20hes la forma oficial de DOS de salir de un programa, la opción de salir del programa usando call 0se mantuvo desde CP / M, y el alcance más externo retfunciona igual desde que regresa 0.

Para tener esa 0x0000palabra en la parte superior de la pila, debe iniciar la pila utilizable 2 bytes más abajo, obviamente. Es por eso SPque inicialmente está en 0xFFFE, apuntando a esa 0x0000palabra que a su vez apunta a la int 20hinstrucción.

CherryDT
fuente