.COM 파일 https://en.wikipedia.org/wiki/COM_file 에 대한 Wikpedia 페이지에서 다음을 읽습니다.
DOS의 .COM 파일은 모든 x86 세그먼트 레지스터를 동일한 값으로 설정하고 SP (스택 포인터) 레지스터를 0xFFFE로 설정하므로 스택은 메모리 세그먼트의 맨 위에서 시작하여 거기서부터 내려옵니다.
그러나 이것은 실제로 스택을 세그먼트 상단의 한 단어 아래에서 시작하도록 설정합니다. 스택에서 값을 푸시하면 CPU가 SP를 0xFFFC로 줄이고 거기에 값을 저장하여 세그먼트의 최상위 단어를 낭비합니다. DOS가 대신 SP를 0으로 설정하지 않은 이유는 무엇입니까?
답변
CP / M에서는 단순히를 사용하여 프로그램에서 돌아 오면 ret
프로그램이 깨끗하게 종료됩니다. 이것은 0x0000
스택의 최상위에 있고 int 20h
address에 명령어를 가짐으로써 달성되었습니다 0x0000
. int 20h
프로그램을 종료하는 DOS의 공식적인 방법 이지만 , 프로그램을 종료하는 옵션 call 0
은 CP / M에서 유지되었으며 가장 바깥 쪽 범위 ret
는로 돌아 가기 때문에 동일하게 작동합니다 0
.
해당 0x0000
단어를 스택 맨 위에 두려면 사용 가능한 스택을 2 바이트 더 시작해야합니다. 그렇기 때문에 SP
처음에이 단어를 0xFFFE
가리키며 그 0x0000
단어를 차례로 가리킨다 int 20h
.