셸에서 프로그래밍 실행
셸에서 프로그램 실행

셸에서 프로그램 실행하는 과정
사용자가
A>PROGRAM1.COM을 입력하고 엔터를 누르면:
COMMAND.COM이 입력을 받는다인터럽트 벡터를 참고해
MSDOS.SYS의 함수를 호출한다
MSDOS.SYS가 프로그램 1을 사용 가능한 RAM에 올린다실행 권한을 프로그램 1에게 넘긴다
메모리 구조상 위치
COMMAND.COM바로 위 사용 가능한 RAM 영역에 쌓인다. 프로그램이 종료되면 해당 영역은 다시 반환된다.프로그램 1은

셸에서 프로그램 종료하는 과정
프로그램 1이 종료될 때:
인터럽트 벡터를 참고해 (
MSDOS.SYS)의 종료 함수를 호출한다프로그램 1이 메모리에서 제거된다
COMMAND.COM으로 제어권이 돌아온다다시
A>_프롬프트가 표시된다스택 구조와 동일한 개념
COMMAND.COM위에 쌓이고(push), 종료되면 빠져나가는(pop) 구조다. 항상 가장 마지막에 올라간 프로그램이 먼저 종료된다.프로그램은

프로그램이 다른 프로그램을 실행하는 경우
프로그램도
COMMAND.COM처럼 다른 프로그램을 실행할 수 있다. 이 때도 항상MSDOS.SYS의 함수를 빌려서 실행한다.연쇄 실행 예시
COMMAND.COM → 프로그램 3 실행 → 프로그램 2 실행 → 프로그램 1 실행 (현재 실행 중)스택과 동일한 구조 위로 쌓이고(push), 종료되면 아래로 돌아온다(pop). 항상 가장 위에 있는 프로그램이 현재 실행 중인 프로그램이다.
실행할 때마다 메모리에
단, 프로그램을 띄우든 종료하든 항상
MSDOS.SYS를 경유한다.

"실행 중" ≠ CPU가 지금 실행하는 코드
메모리 다이어그램의 “실행 중” 표기는 단순히 메모리에 올라가 있다는 의미다. CPU가 해당 프로그램의 명령어를 지금 처리하고 있다는 뜻이 아니다.
프로그램 3 → 2 → 1 연쇄 실행 시
- 프로그램 3, 2가 메모리에 있어도
- CPU는 가장 위에 있는 프로그램 1의 코드만 실행한다
- 프로그램 1이 종료되면 → 프로그램 2의 코드가 실행되기 시작
- 프로그램 2가 종료되면 → 프로그램 3의 코드가 실행되기 시작
핵심 단일 태스킹 환경이다. 여러 프로그램이 메모리에 있어도 CPU는 한 번에 하나의 프로그램만 실행한다.
MS-DOS는

모든 프로그램 종료 — COMMAND.COM으로 복귀
프로그램 1 → 2 → 3 순서로 모두 종료되면 최종적으로
COMMAND.COM으로 제어권이 돌아온다. 다시A>_프롬프트가 표시되며 다음 명령을 기다린다.결국 COMMAND.COM은 항상 바닥에 있다
COMMAND.COM이 남는다.프로그램이 아무리 중첩 실행되어도, 스택이 모두 비워지면 항상
내 프로그램의 주소는 정해져 있지 않다.

내 프로그램의 주소가 정해져 있지 않다! 어떤 순서로 프로그램을 실행하느냐에 따라 동일한 프로그램이라도 메모리에 올라가는 주소가 달라진다.
MS-DOS에서는
프로그램 1만 실행 →
COMMAND.COM바로 위에 위치프로그램 3 → 2 → 1 순서로 실행 → 훨씬 위쪽 주소에 위치
6502와의 차이
6502 MS-DOS (8088) 프로그램 주소 컴파일 시 고정 실행 순서에 따라 유동 메모리 모델 단일 프로그램, 고정 맵 스택처럼 동적으로 쌓임 6502는 한 번 컴파일하면 실행 주소가 고정이지만, MS-DOS에서는 같은 바이너리라도 실행 시점마다 주소가 다를 수 있다.