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?
int 20h
instrucción allí para que pueda salir de su programa emitiendo unaret
instrucción.Respuestas:
Esto es por compatibilidad con CP / M.
En CP / M, simplemente podría regresar de su programa usando
ret
y su programa saldría limpiamente. Esto se logró al tener un0x0000
en la parte superior de la pila y tener unaint 20h
instrucción en la dirección0x0000
. Aunqueint 20h
es la forma oficial de DOS de salir de un programa, la opción de salir del programa usandocall 0
se mantuvo desde CP / M, y el alcance más externoret
funciona igual desde que regresa0
.Para tener esa
0x0000
palabra en la parte superior de la pila, debe iniciar la pila utilizable 2 bytes más abajo, obviamente. Es por esoSP
que inicialmente está en0xFFFE
, apuntando a esa0x0000
palabra que a su vez apunta a laint 20h
instrucción.fuente