{{위키데이터 속성 추적}}
'''도스 API'''(DOS API)는 [[86-DOS]]를 기원으로 하고 [[MS-DOS]]/[[PC-DOS]] 및 기타 [[도스]] 호환 운영 체제에 쓰이는 [[API]]이다. 도스 API의 대부분의 호출은 [[인터럽트|소프트웨어 인터럽트]] 21h (INT 21h)를 이용하여 불러낸다. AH [[프로세서 레지스터]]의 하부 함수 번호, 다른 레지스터의 다른 변수와 더불어 INT 21h를 호출함으로써 다양한 도스 서비스를 불러낸다. 도스 서비스에는 키보드 입력, 비디오 출력, 디스크 파일 접근, 프로그램 실행, 메모리 할당 등이 있다. 1980년대 말에 [[DPMI]] 등의 [[도스 확장자]]를 통해 프로그램들이 16비트나 32비트 보호 모드에서 실행할 수 있게 되었으며 여전히 도스 API로의 접근을 소유하고 있다.

== 역사 ==
86-DOS, MS-DOS 1.0에 있던 본래의 DOS API는 [[CP/M]]과의 기능 호환을 위해 설계되었다. 파일은 [[파일 제어 블록]](FCBs)을 이용하여 접근된다. 도스 API는 MS-DOS 2.0에서 [[파일 서술자|파일 처리]], [[디렉터리|계층 디렉터리]], 장치 입출력 제어를 이용한 파일 접근과 같은 몇 가지 유닉스 개념과 더불어 더 많이 확장되었다. 도스 3.1에서 네트워크 리다이렉터 지원이 추가되었다. MS-DOS 3.31에서 INT 25h/26h 함수가 강화되어 32 MB 이상의 하드 디스크를 지원한다. MS-DOS 5에는 [[상위 메모리 영역]](UMBs) 이용 지원이 추가되었다. MS-DOS 5 이후로 DOS API에는 변경 사항이 없다.

== DOS API와 윈도 ==
[[윈도우 9x]]에서 도스는 일반적으로 [[보호 모드]] 운영 체제와 그래픽 셸을 불러들이는 부트로더로 사용되었다. 도스는 일반적으로 [[가상 도스 머신]](VDM)으로부터 접근되었으나 윈도를 로드하지 않고 리얼 모드 MS-DOS 7.0로 직접 시동할 수도 있었다. 도스 API는 강화된 국제화 지원 및 [[긴 파일 이름]] 지원으로 강화되었는데, 여기서 긴 파일 이름 지원은 VDM을 통해서만 이용할 수 있었다. [[윈도우 95]] OSR2에서는 도스가 7.1로 업데이트되면서 [[FAT32]] 지원이 추가되었으며 DOS API가 이를 지원하는 기능이 추가되었다. [[윈도우 98]], [[윈도우 미]] 또한 MS-DOS 8.0을 표방하면서 MS-DOS 7.1 API가 추가되어 있다.

[[윈도우 NT]] 계열 운영 체제([[윈도우 XP]], [[윈도우 비스타]], [[윈도우 7]], [[윈도우 8]] 등)는 MS-DOS 기반은 아니지만 [[가상 머신]] [[가상 도스 머신|NTVDM]]을 사용하여 도스 API를 처리한다. NTVDM은 [[가상 8086 모드]]([[80386]] 이상의 프로세서에서 이용할 수 있는 [[보호 모드]] 안의 [[리얼 모드]]의 에뮬레이션)에서 도스 프로그램을 실행함으로써 동작한다. NTVDM은 도스 5.0 API를 지원한다. [[리눅스]]용 [[DOSEMU]]는 비슷한 접근 방식을 사용한다.

== 도스에 쓰이는 인터럽트 벡터 ==
{| class="wikitable" border="1"
|-
! 인터럽트 벡터
! 설명
! 버전
! 비고
|-
|<code>20h</code>
| 프로그램 끝내기
| 1.0 이상
| 도스 커널에 추가됨
|-
|<code>21h</code>
| 주요 도스 API
| 1.0 이상
| 도스 커널에 추가됨
|-
|<code>22h</code>
| 프로그램 끝내기 주소
| 1.0 이상
| 프로그램 호출시 주소 반환
|-
|<code>23h</code>
| Control-C 핸들러 주소
| 1.0 이상
| 기본 핸들러는 도스 셸에 있음 (일반적으로 COMMAND.COM)
|-
|<code>24h</code>
| 심각한 오류 핸들러 주소
| 1.0 이상
| 기본 핸들러는 도스 셸에 있음 (일반적으로 COMMAND.COM)
|-
|<code>25h</code>
| 절대 디스크 읽기
| 1.0 이상
| 도스 커널에 추가됨, 도스 3.31에서 강화되어 최대 2 GB 파티션 지원
|-
|<code>26h</code>
| 절대 디스크 쓰기
| 1.0 이상
| 도스 커널에 추가됨, 도스 3.31에서 강화되어 최대 2 GB 파티션 지원
|-
|<code>27h</code>
| [[종료 후 상주 프로그램|종료 후 상주]]
| 1.0 이상
| 도스 1.0 및 도스 2.0 이상의 도스 커널에서 COMMAND.COM에 추가됨
|-
|<code>28h</code>
| 유휴 호출
| 2.0 이상
| 입력을 기다릴 때 도스 커널이 호출함
|-
|<code>29h</code>
| 고속 콘솔 출력
| 2.0 이상
| 내장 콘솔 장치 드라이버나, ANSI.SYS와 같은 대안 드라이버에 의해 추가됨
|-
|<code>2Ah</code>
| 네트워크 및 중요 섹션
|3.0 이상
| 네트워크 소프트웨어와의 상호 작용을 목적으로 도스 커널이 호출함
|-
|<code>2Bh</code>
| 사용 안 함
|
|
|-
|<code>2Ch</code>
| 사용 안 함
|
|
|-
|<code>2Dh</code>
| 사용 안 함
|
|
|-
|<code>2Eh</code>
| 임시 항목 다시 불러오기(Reload transient)
| 2.0 이상
| COMMAND.COM에 추가됨
|-
|<code>2Fh</code>
| 다중 송신
|3.0 이상
| 하부 함수 번호에 따라 도스 커널 및<br />다양한 프로그램(PRINT, MSCDEX, DOSKEY, APPEND 등)에 추가됨
|}

== DOS INT 21h 서비스 ==
{| class="wikitable" border="1" style="margin-left:1em"
|-
!<code>AH</code>
! 설명
! 버전
|-
|<code>00h</code>
| 프로그램 끝내기
| 1.0 이상
|-
|<code>01h</code>
| 문자 입력
| 1.0 이상
|-
|<code>02h</code>
| 문자 출력
| 1.0 이상
|-
|<code>03h</code>
| 보조 입력
| 1.0 이상
|-
|<code>04h</code>
| 보조 출력
| 1.0 이상
|-
|<code>05h</code>
| 프린터 출력
| 1.0 이상
|-
|<code>06h</code>
| 직접 콘솔 입출력
| 1.0 이상
|-
|<code>07h</code>
| echo 없이 직접 콘솔 입력
| 1.0 이상
|-
|<code>08h</code>
| echo 없이 콘솔 입력
| 1.0 이상
|-
|<code>09h</code>
| 문자열 표시
| 1.0 이상
|-
|<code>0Ah</code>
| 버퍼 처리된 키보드 입력
| 1.0 이상
|-
|<code>0Bh</code>
| 입력 상태 가져오기
| 1.0 이상
|-
|<code>0Ch</code>
| 입력 버퍼 및 입력 플러시(flush) 처리
| 1.0 이상
|-
|<code>0Dh</code>
| 디스크 초기화
| 1.0 이상
|-
|<code>0Eh</code>
| 기본 드라이브 설정
| 1.0 이상
|-
|<code>0Fh</code>
| 파일 열기
| 1.0 이상
|-
|<code>10h</code>
| 파일 닫기
| 1.0 이상
|-
|<code>11h</code>
| 첫 번째 파일 찾기
| 1.0 이상
|-
|<code>12h</code>
| 다음 파일 찾기
| 1.0 이상
|-
|<code>13h</code>
| 파일 삭제
| 1.0 이상
|-
|<code>14h</code>
| 연속 읽기
| 1.0 이상
|-
|<code>15h</code>
| 연속 쓰기
| 1.0 이상
|-
|<code>16h</code>
| 파일 만들기/끊기
| 1.0 이상
|-
|<code>17h</code>
| 파일 이름 변경
| 1.0 이상
|-
|<code>18h</code>
| 예비
| 1.0 이상
|-
|<code>19h</code>
| 기본 드라이브 가져오기
| 1.0 이상
|-
|<code>1Ah</code>
| 디스크 전송 주소 설정
| 1.0 이상
|-
|<code>1Bh</code>
| 기본 드라이브에 대한 할당 정보 가져오기
| 1.0 이상
|-
|<code>1Ch</code>
| 지정된 드라이브에 대한 할당 정보 가져오기
| 1.0 이상
|-
|<code>1Dh</code>
| 예비
| 1.0 이상
|-
|<code>1Eh</code>
| 예비
| 1.0 이상
|-
|<code>1Fh</code>
| 기본 드라이브에 대한 디스크 변수 블록 가져오기
| 1.0 이상
|-
|<code>20h</code>
| 예비
| 1.0 이상
|-
|<code>21h</code>
| 랜덤 읽기
| 1.0 이상
|-
|<code>22h</code>
| 랜덤 쓰기
| 1.0 이상
|-
|<code>23h</code>
| 레코드의 파일 크기 가져오기
| 1.0 이상
|-
|<code>24h</code>
| 랜덤 레코드 번호 설정
| 1.0 이상
|-
|<code>25h</code>
| 인터럽트 벡터 설정
| 1.0 이상
|-
|<code>26h</code>
| PSP 만들기
| 1.0 이상
|-
|<code>27h</code>
| 랜덤 블록 읽기
| 1.0 이상
|-
|<code>28h</code>
| 랜덤 블록 쓰기
| 1.0 이상
|-
|<code>29h</code>
| 파일 이름 분석(Parse)
| 1.0 이상
|-
|<code>2Ah</code>
| 날짜 가져오기
| 1.0 이상
|-
|<code>2Bh</code>
| 날짜 설정
| 1.0 이상
|-
|<code>2Ch</code>
| 시간 가져오기
| 1.0 이상
|-
|<code>2Dh</code>
| 시간 설정
| 1.0 이상
|-
|<code>2Eh</code>
| 유효 플래그 설정
| 1.0 이상
|-
|<code>2Fh</code>
| 디스크 전송 주소 가져오기
| 2.0 이상
|-
|<code>30h</code>
| 도스 버전 가져오기
| 2.0 이상
|-
|<code>31h</code>
| 종료 후 상주
| 2.0 이상
|-
|<code>32h</code>
| 지정된 드라이브에 대한 디스크 변수 블록 가져오기
| 2.0 이상
|-
|<code>33h</code>
| Ctrl-Break 가져오기 또는 설정
| 2.0 이상
|-
|<code>34h</code>
| InDOS 플래그 포인터 가져오기
| 2.0 이상
|-
|<code>35h</code>
| 인터럽트 벡터 가져오기
| 2.0 이상
|-
|<code>36h</code>
| 디스크 남은 공간 가져오기
| 2.0 이상
|-
|<code>37h</code>
| 스위치 문자 가져오기 또는 설정
| 2.0 이상
|-
|<code>38h</code>
| 국가 정보 가져오기 또는 설정
| 2.0 이상
|-
|<code>39h</code>
| 하위 디렉터리 만들기
| 2.0 이상
|-
|<code>3Ah</code>
| 하위 디렉터리 제거
| 2.0 이상
|-
|<code>3Bh</code>
| 현재 디렉터리 변경
| 2.0 이상
|-
|<code>3Ch</code>
| 파일 만들기 또는 끊기
| 2.0 이상
|-
|<code>3Dh</code>
| 파일 열기
| 2.0 이상
|-
|<code>3Eh</code>
| 파일 닫기
| 2.0 이상
|-
|<code>3Fh</code>
| 파일 또는 장치 읽기
| 2.0 이상
|-
|<code>40h</code>
| 파일 또는 장치 쓰기
| 2.0 이상
|-
|<code>41h</code>
| 파일 삭제
| 2.0 이상
|-
|<code>42h</code>
| 파일 포인터 이동
| 2.0 이상
|-
|<code>43h</code>
| 파일 특성 가져오기 또는 설정
| 2.0 이상
|-
|<code>44h</code>
| 장치에 대한 입출력 제어
| 2.0 이상
|-
|<code>45h</code>
| 핸들 복제
| 2.0 이상
|-
|<code>46h</code>
| 핸들 우회
| 2.0 이상
|-
|<code>47h</code>
| 현재 디렉터리 가져오기
| 2.0 이상
|-
|<code>48h</code>
| 메모리 할당
| 2.0 이상
|-
|<code>49h</code>
| 메모리 해제
| 2.0 이상
|-
|<code>4Ah</code>
| 메모리 다시 할당
| 2.0 이상
|-
|<code>4Bh</code>
| 프로그램 실행
| 2.0 이상
|-
|<code>4Ch</code>
| 반환 코드로 끝내기
| 2.0 이상
|-
|<code>4Dh</code>
| 프로그램 반환 코드 가져오기
| 2.0 이상
|-
|<code>4Eh</code>
| 첫 번째 파일 찾기
| 2.0 이상
|-
|<code>4Fh</code>
| 다음 파일 찾기
| 2.0 이상
|-
|<code>50h</code>
| 현재의 PSP 설정
| 2.0 이상
|-
|<code>51h</code>
| 현재의 PSP 가져오기
| 2.0 이상
|-
|<code>52h</code>
| 도스 내부 포인터 가져오기 (SYSVARS)
| 2.0 이상
|-
|<code>53h</code>
| 디스크 변수 블록 만들기
| 2.0 이상
|-
|<code>54h</code>
| 유효 플래그 가져오기
| 2.0 이상
|-
|<code>55h</code>
| 프로그램 PSP 만들기
| 2.0 이상
|-
|<code>56h</code>
| 파일 이름 변경
| 2.0 이상
|-
|<code>57h</code>
| 파일 날짜 및 시간 가져오기 또는 설정
| 2.0 이상
|-
|<code>58h</code>
| 할당 전략 가져오기 또는 설정
|2.11 이상
|-
|<code>59h</code>
| 확장 오류 정보 가져오기
|3.0 이상
|-
|<code>5Ah</code>
| 고유 파일 만들기
|3.0 이상
|-
|<code>5Bh</code>
| 파일 새로 만들기
|3.0 이상
|-
|<code>5Ch</code>
| 파일 잠금 / 잠금 해제
|3.0 이상
|-
|<code>5Dh</code>
| 파일 공유 기능
|3.0 이상
|-
|<code>5Eh</code>
| 네트워크 기능
|3.0 이상
|-
|<code>5Fh</code>
| 네트워크 우회 기능
|3.0 이상
|-
|<code>60h</code>
| 파일 이름 제한
|3.0 이상
|-
|<code>61h</code>
| 예비
|3.0 이상
|-
|<code>62h</code>
| 현재의 PSP 가져오기
|3.0 이상
|-
|<code>63h</code>
| DBCS 리드 바이트 테이블 포인터(lead byte table pointer) 가져오기
|3.0 이상
|-
|<code>64h</code>
|외부 이벤트 플래그 대기 설정
|3.2 이상
|-
|<code>65h</code>
| 확장 국가 정보 가져오기
|3.3 이상
|-
|<code>66h</code>
| 코드 페이지 가져오기 또는 설정
|3.3 이상
|-
|<code>67h</code>
| 핸들 수 설정
|3.3 이상
|-
|<code>68h</code>
| 파일 위탁(commit)
|3.3 이상
|-
|<code>69h</code>
| 미디어 ID 가져오기 또는 설정
|4.0 이상
|-
|<code>6Ah</code>
| 파일 위탁(commit)
|4.0 이상
|-
|<code>6Bh</code>
| 예비
|4.0 이상
|-
|<code>6Ch</code>
| 파일 확장 열기/만들기
|4.0 이상
|}

== MS-DOS API를 지원하는 운영 체제 ==
* [[MS-DOS]]
* [[IBM PC DOS|PC&nbsp;DOS]]
* [[DR-DOS]]
* [[PTS-DOS]]
* [[ROM-DOS]]
* [[FreeDOS]]
* [[윈도우 95]] - MS-DOS 7.0 포함
* [[윈도우 98]] - MS-DOS 7.1 포함
* [[윈도우 98 SE]] - MS-DOS 7.1 포함
* [[윈도우 미]] - MS-DOS 8.0 포함

== MS-DOS API 지원 프로그램 ==
* [[멀티유저 도스|PCMODE]] 포함 [[MP/M|컨커런트 CP/M-86]] (3.1 전용)
* [[멀티유저 도스|컨커런트 도스]]
* [[도스 플러스]]
* [[멀티유저 도스]]
* [[가상 도스 머신|NTVDM.EXE]] ([[윈도우 NT]] 계열)
* [[DOSEMU]] ([[리눅스]])
* [[도스박스]]

== 같이 보기 ==
* [[바이오스 인터럽트 호출]]
* [[도스 확장자]]

== 참고 문헌 ==
* {{언어링크|en}} [http://www.cs.cmu.edu/~ralf/files.html The x86 Interrupt List] (a.k.a. RBIL, Ralf Brown's Interrupt List)
* {{언어링크|en}} [http://www.ctyme.com/intr/cat-010.htm ctyme.com - INT Calls by function]
* {{언어링크|en}} [https://web.archive.org/web/20020622163518/http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/toc.html wustl.edu - Description of MS-DOS services]
* {{언어링크|en}} [https://web.archive.org/web/20060721115437/http://www.redbooks.ibm.com/redbooks/pdfs/gg244459.pdf IBM PC DOS 7 Technical Update]
* ''Microsoft MS-DOS Programmer's Reference - The Official Technical Reference to MS-DOS'', Microsoft Press, 1993 {{ISBN|1-55615-546-8}}
* ''The MS-DOS Encyclopedia'', Microsoft Press, 1988, {{ISBN|1-55615-174-8}}
* ''Advanced MS-DOS Programming: The Microsoft Guide for Assembly Language and C Programmers'' by Ray Duncan, Microsoft Press, 1988 {{ISBN|1-55615-157-8}}
* ''The Programmer's PC Sourcebook'' by Thom Hogan, Microsoft Press, 1991 {{ISBN|1-55615-321-X}}
* ''The New Peter Norton Programmer's Guide to the IBM PC & PS/2'' by Peter Norton and Richard Wilton, Microsoft Press, 1987 {{ISBN|1-55615-131-4}}.
* Caldera, Inc. (1997). ''OpenDOS Developer's Reference Series — OpenDOS Programmer's Guide — System and Programmer's Guide''. Printed in the UK, August 1997. Caldera Part No. 200-DOPG-003 ([https://web.archive.org/web/20120625021802/http://www.drdos.net/documentation/sysprog/httoc.htm]).

[[분류:도스 기술]]
[[분류:X86 아키텍처]]
[[분류:인터럽트]]
[[분류:마이크로소프트 API]]
[[분류:운영 체제 API]]