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?
int 20h
instrukcji, dzięki czemu możesz wyjść z programu, wydającret
instrukcję.Odpowiedzi:
Ma to na celu zapewnienie zgodności z CP / M.
W CP / M możesz po prostu powrócić ze swojego programu,
ret
a program zakończy się czysto. Osiągnięto to poprzez umieszczenie0x0000
na górze stosu i posiadanieint 20h
instrukcji pod adresem0x0000
. Chociażint 20h
jest to oficjalny sposób na zamknięcie programu przez DOS, opcja wyjścia z programucall 0
została zachowana z CP / M, a zakres zewnętrznyret
działa tak samo, ponieważ powraca do0
.Aby mieć to
0x0000
słowo na górze stosu, musisz oczywiście rozpocząć użyteczny stos o 2 bajty niżej. Właśnie dlategoSP
początkowo0xFFFE
wskazuje na to0x0000
słowo, które z kolei wskazujeint 20h
instrukcję.źródło