[assembly] DOS가 .COM 파일을로드 한 후 SP 레지스터를 0xFFFE로 설정하는 이유는 무엇입니까?

.COM 파일 https://en.wikipedia.org/wiki/COM_file 에 대한 Wikpedia 페이지에서 다음을 읽습니다.

DOS의 .COM 파일은 모든 x86 세그먼트 레지스터를 동일한 값으로 설정하고 SP (스택 포인터) 레지스터를 0xFFFE로 설정하므로 스택은 메모리 세그먼트의 맨 위에서 시작하여 거기서부터 내려옵니다.

그러나 이것은 실제로 스택을 세그먼트 상단의 한 단어 아래에서 시작하도록 설정합니다. 스택에서 값을 푸시하면 CPU가 SP를 0xFFFC로 줄이고 거기에 값을 저장하여 세그먼트의 최상위 단어를 낭비합니다. DOS가 대신 SP를 0으로 설정하지 않은 이유는 무엇입니까?



답변

CP / M과의 호환성을위한 것입니다.

CP / M에서는 단순히를 사용하여 프로그램에서 돌아 오면 ret프로그램이 깨끗하게 종료됩니다. 이것은 0x0000스택의 최상위에 있고 int 20haddress에 명령어를 가짐으로써 달성되었습니다 0x0000. int 20h프로그램을 종료하는 DOS의 공식적인 방법 이지만 , 프로그램을 종료하는 옵션 call 0은 CP / M에서 유지되었으며 가장 바깥 쪽 범위 ret는로 돌아 가기 때문에 동일하게 작동합니다 0.

해당 0x0000단어를 스택 맨 위에 두려면 사용 가능한 스택을 2 바이트 더 시작해야합니다. 그렇기 때문에 SP처음에이 단어를 0xFFFE가리키며 그 0x0000단어를 차례로 가리킨다 int 20h.


답변