Dlaczego DOS ustawia rejestr SP na 0xFFFE po załadowaniu pliku .COM?

10

Na stronie Wikipedii o plikach .COM https://en.wikipedia.org/wiki/COM_file czytamy:

Pliki .COM w DOS ustawiają wszystkie rejestry segmentów x86 na tę samą wartość, a rejestr SP (wskaźnik stosu) na 0xFFFE, a zatem stos zaczyna się na samej górze segmentu pamięci i od tego momentu zaczyna działać.

Ale tak naprawdę ustawia stos, aby zaczął jedno słowo poniżej górnej części segmentu. Podczas wypychania wartości na stosie CPU obniży SP do 0xFFFC i zapisze tam wartość, marnując w ten sposób górne słowo segmentu. Jaki jest powód, dla którego DOS zamiast tego nie ustawia SP na 0?

nadder
źródło
6
DOS przechowuje tam wskaźnik do int 20hinstrukcji, dzięki czemu możesz wyjść z programu, wydając retinstrukcję.
fuz

Odpowiedzi:

16

Ma to na celu zapewnienie zgodności z CP / M.

W CP / M możesz po prostu powrócić ze swojego programu, reta program zakończy się czysto. Osiągnięto to poprzez umieszczenie 0x0000na górze stosu i posiadanie int 20hinstrukcji pod adresem 0x0000. Chociaż int 20hjest to oficjalny sposób na zamknięcie programu przez DOS, opcja wyjścia z programu call 0została zachowana z CP / M, a zakres zewnętrzny retdziała tak samo, ponieważ powraca do 0.

Aby mieć to 0x0000słowo na górze stosu, musisz oczywiście rozpocząć użyteczny stos o 2 bajty niżej. Właśnie dlatego SPpoczątkowo 0xFFFEwskazuje na to 0x0000słowo, które z kolei wskazuje int 20hinstrukcję.

CherryDT
źródło