챕터 - 6
컴퓨터 기본 소개
소개
때로는 데이터를 복구하거나 데이터 및 디스크 문제 해결 작업(또는 다른 시스템 관련 작업)을 수행할 때 DEBUG DOC 명령을 사용하는 것이 매우 편리합니다.
어떤 특별한 경우에는 프로그래밍을 하는 것보다 DEBUG를 사용하여 이 특정 작업을 완료하는 것이 더 쉬울 수도 있습니다. 예를 들어보겠습니다. 다음 디버그 코딩은 DBR 백업을 만드는 데 충분합니다. 다음 줄을 입력하세요:
BKDBR.BIN 디버깅
엘 100 2 0 1
R SH
200
안에
안에
여기서는 몇 줄만 입력해도 프로그램을 작성하지 않아도 된다는 것을 알 수 있습니다. DBR 백업을 디스크에 로드하는 또 다른 코딩 예를 살펴보겠습니다.
항상 기억하세요! 충분한 지식 없이 이것을 시도하지 마세요. 무엇을 할 것인지 확신하세요. 다음 지침을 부주의하게 사용하면 심각한 데이터 손실이 발생할 수 있으며, 지침을 잘못 사용하면 디스크에 있는 모든 정보에 액세스할 수 없게 될 수 있습니다.
BKDBR.BIN 디버깅
100 2 0 1
안에
이 예제의 코드를 보면, 가장 필요할 때 얼마나 큰 도움이 될 수 있는지 쉽게 짐작할 수 있을 것입니다. 더욱이 모든 상황에 맞게 프로그래밍하는 것은 불가능합니다. 그러나 간단한 문제 사례에서 빌드 지침을 사용하려면 debug.exe/debug.com을 부팅 디스크에 복사하고 코드 작성을 시작하면 됩니다.
이 장과 이 책에 설명된 기능과 예제는 Intel x86 프로세서 제품군 아키텍처와만 호환됩니다.
우선, 다음 섹션에서 설명하는 기능과 다양한 단계의 예시에서 사용되는 용어를 이해할 수 있도록 컴퓨터 아키텍처의 기본에 대해 조금 알아야 합니다. 컴퓨터 아키텍처의 기본을 알아보겠습니다.
기본 개념
CPU
이 부분은 중앙 처리 장치 또는 CPU라고도 하며, 제어 장치와 산술 논리 장치로 구성됩니다. 이 프로세서의 기능에는 메모리 셀의 내용을 읽고 쓰는 기능, 메모리 셀과 특수 레지스터 사이의 데이터 전송, 프로그램 명령어의 디코딩 및 실행 기능이 포함됩니다. 프로세서에는 매우 자주 사용되는 많은 메모리 셀이 있으며, 이는 CPU의 일부입니다.
이러한 셀을 레지스터라고 합니다. 프로세서는 이러한 레지스터를 1~24개 가질 수 있습니다. CPU의 산술 논리 장치는 수치 및 기호 계산과 관련된 연산을 구현합니다.
일반적으로 이러한 장치는 두 개의 정수를 더하고 빼고, 정수를 곱하고 나누고, 레지스터 비트를 조작하고, 두 레지스터의 내용을 비교하는 등 매우 기본적인 연산만 수행할 수 있습니다. 개인용 컴퓨터는 워드 크기에 따라 분류할 수 있는데, 워드 크기는 프로세서가 한 번에 처리할 수 있는 비트 수를 말합니다.
중앙 메모리
프로그램 실행이나 연산에 필요한 정보 저장 등 일반적인 프로세스에 사용되는 반도체를 사용하여 만든 셀의 집합입니다. 이러한 각 셀은 숫자 값을 포함할 수 있으며 방향성을 갖는 속성을 갖습니다. 이는 각 세포마다 고유한 번호나 주소를 사용하여 서로를 구별할 수 있다는 것을 의미합니다. 이러한 저장 장치의 일반적인 이름은 램(Random Access Memory) 또는 RAM입니다.
이러한 유형의 메모리의 가장 큰 단점은 전원 공급이 중단되면 통합 회로에 저장된 정보가 손실된다는 것입니다. 이로 인해 시스템이 꺼져도 정보가 손실되지 않는 메모리가 만들어졌습니다. 이 메모리를 읽기 전용 메모리, 즉 ROM이라고 합니다.
컴퓨터가 정보를 처리하려면, 이 정보를 레지스터라고 불리는 특수한 셀에 저장해야 합니다. 레지스터는 8개 또는 16개의 플립플롭으로 구성된 그룹입니다.
플립플롭은 두 레벨의 전압을 저장할 수 있는 장치로, 하나는 일반적으로 0.5볼트의 낮은 전압이고, 다른 하나는 일반적으로 5볼트입니다. 플립플롭의 낮은 에너지 레벨은 꺼짐 또는 0으로 해석되고, 높은 레벨은 켜짐 또는
- 이러한 상태는 일반적으로 비트라고 하며, 컴퓨터의 가장 작은 정보 단위입니다.
16비트의 그룹을 워드라고 하며, 워드는 바이트라고 하는 8비트 그룹으로 나눌 수 있고, 4비트 그룹은 니블이라고 합니다.
CPU 레지스터
CPU에는 각각 16비트인 4개의 내부 레지스터가 있습니다. 처음 네 개, AX, BX, CX, DX는 일반 사용 레지스터이며 8비트 레지스터로도 사용할 수 있습니다. 이러한 방식으로 사용하는 경우 예를 들어 AH와 AL과 같이 참조해야 합니다. AH와 AL은 AX 레지스터의 상위 바이트와 하위 바이트입니다. 이 명명법은 BX, CX, DX 레지스터에도 적용할 수 있습니다.
특정 이름으로 알려진 레지스터:
등록하다 |
구체적인 이름 |
도끼 |
어큐뮬레이터 |
비엑스 |
기본 레지스터 |
고객 서비스 |
카운팅 레지스터 |
디엑스 |
데이터 레지스터 |
디에스 |
데이터 세그먼트 레지스터 |
이다 |
추가 세그먼트 레지스터 |
봄 여름 시즌 |
배터리 세그먼트 레지스터 |
씨에스 |
코드 세그먼트 레지스터 |
혈압 |
기본 포인터 레지스터 |
그리고 |
소스 인덱스 레지스터 |
에서 |
목적지 인덱스 레지스터 |
에스. |
배터리 포인터 레지스터 |
아이피(IP) |
다음 명령어 포인터 레지스터 |
에프 |
깃발 등록 |
그러나 다음 장에서는 C를 통한 인터럽트 프로그래밍에서 이러한 레지스터를 자세히 사용할 것이지만, 여기서 어셈블리 언어의 기본을 배우는 것이 이상적이고 디스크 작업 등의 프로그래밍에 도움이 될 것입니다.
디버그 프로그램을 사용하여 CPU의 내부 레지스터 값을 시각화할 수 있습니다. 디버그 작업을 시작하려면 컴퓨터에 다음 프롬프트를 입력합니다.
C:/>디버그 <Enter>
다음 줄에 대시가 나타납니다. 이것은 디버그 표시기입니다. 이 순간 다음 명령을 사용하여 디버그 지침을 입력할 수 있습니다.
- r <Enter>
CPU 내부 레지스터의 모든 내용이 표시됩니다. 이를 보는 대안은 "r" 명령을 사용하여 값을 보고자 하는 레지스터의 이름을 매개변수로 사용하는 것입니다. 예를 들어:
-rbx <Enter>
이 명령어는 BX 레지스터의 내용만 표시하고 디버그 표시기는 "-"에서 ":"로 변경됩니다.
프롬프트가 이런 경우, 새로운 값을 입력하고 <Enter>를 눌러 표시된 레지스터의 값을 변경할 수 있으며, 다른 값을 입력하지 않고 Enter를 눌러 기존 값을 그대로 둘 수 있습니다.
플래그 레지스터의 값을 변경하고 나중에 볼 수 있듯이 프로그램에서 제어 구조로 사용할 수 있습니다. 레지스터의 각 비트는 특별한 이름과 의미를 가지고 있으며, 다음 목록은 각 비트의 값, 켜짐 또는 꺼짐 및 프로세서의 작업과의 관계를 설명합니다.
과다
NV = 오버플로가 없습니다
OV = 오버플로가 있습니다
방향
UP = 앞으로
DN = 뒤로
인터럽트
DI = 비활성화됨
EI = 활성화됨
징후
PL = 양수
NG = 부정
영
NZ = 0이 아니다
ZR = 0이다
보조 휴대
NA = 보조 캐리가 없음
AC = 보조 캐리가 있습니다
둥가
PO = 불균등 패리티
PE = 짝수 패리티
나르다
NC = 캐리가 없음
CY = 캐리가 있다
어셈블러 구조
어셈블리 언어 코드 줄에는 두 부분이 있는데, 첫 번째 부분은 실행할 명령어의 이름이고 두 번째 부분은 명령의 매개변수입니다. 예를 들어:
추가 아, 으응
여기서 "ADD"는 실행할 명령이며, 이 경우에는 추가이고, "ah"와 "bh"는 매개변수입니다.
언어의 명령어 이름은 두 글자, 세 글자 또는 네 글자로 구성됩니다. 이러한 명령어는 프로세서가 수행할 기능을 나타내므로 니모닉 이름 또는 연산 코드라고도 합니다. 연산에 매개변수가 필요하지 않은 명령도 있고, 매개변수가 하나만 필요한 명령도 있습니다.
때로는 지침이 다음과 같이 사용됩니다.
추가[170]
두 번째 매개변수의 괄호는 170 값이 아닌 메모리 셀 번호 170의 내용으로 작업할 것임을 나타냅니다. 이를 직접 방향이라고 합니다.
이제 우리는 디버그의 도움으로 첫 번째 프로그램을 코딩할 준비가 되었습니다. 우리는 우리가 보고 있는 것을 설명하는 프로그램을 만들 것이고, 우리가 할 일은 프로그램에 직접 도입할 두 개의 값을 추가하는 것입니다.
첫 번째 단계는 디버그를 시작하는 것입니다. 이 단계는 운영 체제 프롬프트에 debug <Enter>를 입력하는 것으로만 구성됩니다.
디버그에서 프로그램을 어셈블하려면 "a"(어셈블) 명령을 사용합니다. 이 명령을 사용하면 어셈블을 시작할 주소를 매개변수로 지정할 수 있습니다. 매개변수를 생략하면 어셈블은 CS:IP에서 지정한 지역, 일반적으로 0100h에서 시작되며, 이는 .COM 확장자를 가진 프로그램을 시작해야 하는 지역입니다. 그리고 이 특정 유형의 프로그램을 만들 수 있는 곳은 디버그뿐이므로 우리가 사용할 곳이 됩니다.
이 순간에는 "a" 명령에 매개변수를 줄 필요는 없지만 CS:IP 레지스터가 사용되면 문제를 피하기 위해 매개변수를 주는 것이 좋습니다. 따라서 다음을 입력합니다.
-a0100 <Enter>
이렇게 하면 화면에 다음과 같은 것이 나타납니다. 0C1B:0100 그리고 커서는 이 숫자의 오른쪽에 위치합니다. 16진법에서 처음 네 자리는 다를 수 있지만 마지막 네 자리는 0100이어야 합니다. 시작으로 지정한 주소이기 때문입니다. 이제 지침을 소개할 수 있습니다.
0C1B:0100 mov ax,0002; ax 레지스터에 0002 값을 넣습니다.
0C1B:0103 mov bx,0004; 0004 값을 bx 레지스터에 넣습니다.
0C1B:0106 add ax,bx; bx의 내용이 ax의 내용에 추가됩니다.
0C1B:0108 int 20; 프로그램을 종료합니다.
0C1B:010A
";" 뒤에 오는 주석은 쓸 필요가 없습니다. 마지막 명령인 int 20을 입력한 후, 더 이상 아무것도 쓰지 않고 <Enter>를 누르면 디버거 프롬프트가 다시 표시됩니다.
마지막으로 쓰여진 줄은 엄밀히 말하면 어셈블러 명령어가 아니며, 운영체계의 중단을 요청하는 것입니다. 이러한 중단 덕분에 줄을 많이 줄일 수 있고 운영체계의 기능에 접근하는 데 매우 유용합니다.
우리가 쓴 프로그램을 실행하려면 "g" 명령을 사용하는데, 사용하면 다음과 같은 메시지가 표시됩니다.
"프로그램이 정상적으로 종료되었습니다". 이런 메시지에서는 프로그램이 추가를 했는지 확신할 수 없지만, Debug의 "r" 명령을 사용하여 프로세서의 모든 레지스터 내용을 볼 수 있는 간단한 방법이 있습니다. 간단히 다음을 입력하세요.
-r <Enter>
각 레지스터는 해당 실제 값과 함께 다음과 같이 화면에 나타납니다.
AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1B ES=0C1B SS=0C1B CS=0C1B IP=010A NV UP EI PL NZ NA PO NC
0C1B:010A DB
레지스터에 서로 다른 값이 들어있을 가능성이 있지만, AX와 BX는 우리가 방금 수정한 것이므로 동일해야 합니다.
프로그램이 실행되는 동안 값을 확인하는 또 다른 방법은 실행을 끝내려는 주소를 사용하고 "g"의 매개변수로 레지스터 값을 표시하는 것입니다. 이 경우에는 g108이 됩니다. 이 명령어는 프로그램을 실행하고 108 주소에서 멈추고 레지스터의 내용을 표시합니다.
레지스터에서 무슨 일이 일어나고 있는지에 대한 후속 조치는 "t" 명령(추적)을 사용하여 수행할 수 있습니다. 이 명령의 기능은 어셈블된 내용을 줄별로 실행하여 매번 레지스터의 내용을 표시하는 것입니다.
디버그를 종료하려면 "q"(종료) 명령을 사용합니다.
어셈블러의 장점
어셈블리를 사용하는 첫 번째 이유는 PC의 작동을 더 잘 알 수 있어서 보다 일관된 방식으로 소프트웨어를 개발할 수 있다는 것입니다.
두 번째 이유는 어셈블러를 사용하면 컴퓨터를 완전히 제어할 수 있다는 것입니다. 또 다른 이유는 어셈블리 기반 프로그램이 더 빠르고 어떤 경우에는 더 작고 다른 언어로 만든 프로그램보다 용량이 더 크다는 것입니다.
제 약속을 지키겠습니다!!
이 장의 앞부분에서 우리는 DBR의 백업을 만들고 필요할 때 DBR의 백업을 원래 위치에 로드하기 위해 몇 가지 지침을 예로 사용했습니다. 먼저 백업을 만드는 지침을 살펴봅니다.
C:\>DEBUG A:\BKDBR.BIN <Enter>
파일을 찾을 수 없습니다
- L 100 2 0 1 < 입력>
- R CX < Enter>
CX 0000
: 200 < 입력>
- W < 엔터>
00200바이트 쓰기
- Q < 입력>
이 예에서 첫 번째 줄부터 공부를 시작해 보겠습니다. 명령 DEBUG A:\BKDBR.BIN은 A: 플로피 드라이브에 BKDBR.BIN이라는 이름의 파일을 생성하여 디버그 명령을 초기화합니다(파일이 없는 경우). 그래서 시작에서 "파일을 찾을 수 없음"이라는 메시지가 나온 것입니다.
두 번째 명령어 L 100 2 0 1에서 L(로드) 명령은 명령된 드라이브의 DBR을 로드하는 것입니다. 어떻게 하는지 알아봅시다. 이 명령어에서 숫자 100은 DBR이 저장될 버퍼의 주소이고, 다음 숫자 2는 드라이브 C(C :)에 사용됩니다. 드라이브 번호는 다음과 같습니다.
드라이브 문자 |
사용된 숫자 |
에이: |
0 |
비: |
1 |
기음: |
2 |
디: |
3 |
. |
. |
. |
. |
등 |
. |
다음 숫자 0은 읽을 섹터 수의 시작 섹터 번호입니다. 여기서는 0을 사용하여 첫 번째 섹터, 즉 DBR 섹터를 읽습니다. 다음 숫자인 1은 읽을 섹터 수를 알리는 데 사용됩니다.
여기서 우리는 하나의 섹터만 읽고 싶기 때문에 1을 주었습니다. 그러나 우리는 필요에 따라 시작 및 종료 섹터의 번호와 위치를 다른 유형의 다른 작업에서 사용할 수 있습니다. 따라서 드라이브 C:의 첫 번째 섹터에서 시작하여 메모리 위치 100까지 하나의 섹터를 로드합니다.
그리고 R CX 명령어는 BKDBR.BIN 파일에 쓰고자 하는 데이터의 길이를 변경하거나 정의하는 데 사용됩니다. 이 명령어는 CX 레지스터의 현재 값을 보여주고 변경할 수 있도록 합니다. 여기서 200을 입력한 이유는 DEBUG 명령어가 16진수 시스템을 사용하고 16진수에서 DBR의 크기가 200(h)바이트이고 10진수 시스템에서는 512바이트이기 때문입니다.
W 명령은 DEBUG에 위치 100에서 200(h) 바이트를 BKDBR.BIN 파일에 쓰라고 지시합니다. 마지막으로 명령어 Q를 사용하여 DEBUG를 종료하고 DOS 프롬프트로 돌아갑니다.
경고!!! 경고!!! 경고!!!
모든 디스크의 DBR을 복원하는 절차에서 무엇을 어떻게 하는지 아는 것이 좋습니다. 실수로 다른 디스크의 불법 또는 DBR을 저장한 경우 대부분의 경우 디스크의 전체 데이터에 액세스할 수 없게 될 수 있습니다.
코딩의 첫 번째 지침을 입력하면 다음과 같습니다.
디버그 A:\BKDBR.BIN <Enter>
파일은 DEBUG 프로그램을 시작하는 지정된 위치에 있어야 합니다. 이제 DEBUG 프롬프트 전에 "파일을 찾을 수 없음"이라는 오류 메시지가 나타나면 Q(종료) 명령을 사용하여 즉시 프로세스를 중지합니다. 이는 BKDBR.BIN 파일을 DEBUG 프로그램에서 찾거나 열 수 없다는 것을 의미하며 이 프로세스를 계속하면 DBR에 일부 정크 정보가 기록되어 전체 파티션에 액세스할 수 없게 됩니다. |
이제 BKDBR.BIN이라는 이름의 백업 파일에서 DBR을 복원하기 위한 지침의 코딩에서 우리가 무엇을 했는지 살펴보겠습니다. 백업을 복원하기 위한 DEBUG 명령은 다음과 같습니다.
C:\> DEBUG A:\BKDBR.BIN <Enter>
- W 100 2 0 1 < 입력>
- Q < 입력 >
|
이 명령어는 플로피 디스크 드라이브(a:)의 BKDBR.BIN 파일에서 메모리 위치 100의 정보 1섹터를 2번째 드라이브(C:)의 섹터 0인 첫 번째 섹터에 씁니다.
프로그램 저장 및 로딩
필요할 때마다 전체 프로그램을 입력하는 것은 실용적이지 않을 것 같고, 이를 피하기 위해 디스크에 프로그램을 저장하는 것이 가능합니다. 이렇게 하면 이미 어셈블되어 있으므로 다시 디버그를 실행하지 않고도 실행할 수 있다는 엄청난 이점이 있습니다.
메모리에 이미 저장된 프로그램을 저장하는 단계는 다음과 같습니다.
- 16진법 방식으로 초기 주소에서 최종 주소를 빼서 프로그램의 길이를 구합니다.
- 프로그램의 이름과 확장자를 지정합니다.
- 프로그램의 길이를 CX 레지스터에 입력하세요.
- 디스크에 프로그램을 작성하려면 디버그 명령을 사용합니다.
다음 프로그램을 예로 들면, 이러한 단계를 수행하는 방법에 대한 더 명확한 아이디어를 얻을 수 있습니다. 프로그램이 마침내 조립되면 다음과 같이 보일 것입니다.
0C1B:0100 이동 도끼,0002
0C1B:0103 이동 bx,0004
0C1B:0106 ax,bx 추가
0C1B:0108 당신은 20살이에요
0C1B:010A
-h 10a 100
020a 000a
-n 테스트닷컴
-rcx
CX 0000
:000아
-안에
000A 바이트 쓰기
프로그램의 길이를 구하려면 "h" 명령어를 사용합니다. 16진수로 두 수의 덧셈과 뺄셈을 보여주기 때문입니다. 우리의 길이를 구하려면 매개변수로 프로그램의 최종 주소(10A)와 프로그램의 초기 주소(100) 값을 제공합니다. 명령어가 보여주는 첫 번째 결과는 매개변수의 덧셈이고 두 번째 결과는 뺄셈입니다.
"n" 명령어를 사용하면 프로그램의 이름을 지정할 수 있습니다. "rcx" 명령어를 사용하면 CX 레지스터의 내용을 "h"를 사용하여 파일 크기에서 얻은 값으로 변경할 수 있습니다. 이 경우 000a입니다. 이는 최종 주소에서 초기 주소를 뺀 결과이기 때문입니다.
마지막으로, "w" 명령은 디스크에 프로그램을 기록하여 기록한 바이트 수를 나타냅니다. 또한 이미 로드된 파일을 저장하려면 두 단계가 필요합니다.
- 로드할 파일의 이름을 입력하세요.
- "l" (로드) 명령을 사용하여 로드합니다.
다음 단계의 올바른 결과를 얻으려면 위 프로그램이 이미 만들어져 있어야 합니다.
디버그 내부에서 다음과 같이 작성합니다.
-n 테스트닷컴
-엘
-100 109에
0C3D:0100 B80200 MOV AX,0002
0C3D:0103 BB0400 MOV BX,0004
0C3D:0106 01D8 AX,BX 추가
0C3D:0108 CD20 INT 20
마지막 "u" 명령은 프로그램이 메모리에 로드되었는지 확인하는 데 사용됩니다. 이 명령은 코드를 디스어셈블하고 디스어셈블된 것을 보여줍니다. 매개변수는 DEBUG가 어디에서 디스어셈블할 것인지를 나타냅니다. DEBUG는 항상 프로그램을 주소 100H의 메모리에 로드하고, 그렇지 않으면 지정됩니다.
세그먼트
x86 프로세서의 아키텍처는 정보를 관리하기 위해 메모리 세그먼트를 사용하도록 강제하며, 이러한 세그먼트의 크기는 64kb입니다.
이러한 세그먼트가 존재하는 이유는 프로세서가 관리할 수 있는 숫자의 최대 크기가 16비트 또는 레지스터의 단어로 주어지기 때문에 이러한 레지스터 중 하나만 사용하여 65536개가 넘는 메모리 로컬리티에 액세스할 수 없지만 지금은 메모리가 그룹이나 세그먼트로 나뉘고 각각이 65536개의 로컬리티를 갖고 있고 배타적 레지스터의 주소를 사용하여 각 세그먼트를 찾은 다음 두 개의 레지스터로 특정 슬롯의 각 주소를 만들면 4294967296바이트의 메모리에 액세스할 수 있습니다.
어셈블러가 데이터를 관리할 수 있으려면 각 정보 또는 명령어가 해당 세그먼트에 해당하는 영역에서 발견되어야 합니다. 어셈블러는 DS, ES, SS 및 CS 레지스터에서 제공하는 세그먼트의 로컬라이제이션과 레지스터 내부의 지정된 정보의 주소를 고려하여 이 정보에 액세스합니다. 이 때문에 어셈블하는 각 줄에서 Debug를 사용하여 프로그램을 만들면 다음과 같은 내용이 나타납니다.
1CB0:0102 MOV AX,BX
첫 번째 숫자인 1CB0은 사용되는 메모리 세그먼트에 해당하고, 두 번째 숫자는 이 세그먼트 내부의 주소를 나타내며, 그 주소에서 저장될 명령어가 뒤에 나옵니다.
어셈블러는 각 어셈블된 명령어에 필요한 바이트 수를 기준으로 세그먼트 크기를 조정합니다. 전체 세그먼트를 사용하는 것은 메모리 낭비이기 때문입니다. 예를 들어, 프로그램이 데이터를 저장하는 데 10kb만 필요한 경우 데이터 세그먼트는 10kb에 불과하며 처리할 수 있는 64kb가 아닙니다.
데이터 이동
인터럽트와 다른 BIOS 작업을 사용하여 프로그래밍을 할 때 데이터 작업을 위한 어셈블리 언어 명령어의 기본 사항이 필요하므로 여기서 여러분의 지식과 편의를 위해 일부 어셈블리 언어 명령어를 나열해 보겠습니다.
어셈블리 언어에 대한 자세한 소개와 철저한 연구는 이 책의 한계를 넘어선다. 어셈블리의 기본에 대한 지식은 더 중요한 프로그래밍 장을 진행하는 데 필요하지만 모든 명령어를 이해하기 어렵다고 느낀다면 걱정할 필요는 없지만 명령어에 대한 기본적인 아이디어를 얻는 것이 좋습니다.
모든 프로그램에서 메모리와 CPU 레지스터의 데이터를 이동하는 것이 필요하며, 이를 수행하는 방법에는 여러 가지가 있습니다. 메모리에 있는 데이터를 어떤 레지스터로, 레지스터에서 레지스터로, 레지스터에서 스택으로, 스택에서 레지스터로 복사할 수 있으며, 외부 장치로 데이터를 전송할 수도 있고, 그 반대로도 가능합니다.
이러한 데이터 이동에는 규칙과 제한이 적용됩니다. 다음은 그 중 일부입니다.
- 한 메모리 위치에서 다른 메모리 위치로 직접 데이터를 이동하는 것은 불가능합니다. 먼저 소스 위치의 데이터를 레지스터로 이동한 다음 레지스터에서 대상 지역으로 이동해야 합니다.
- 상수를 세그먼트 레지스터로 직접 옮기는 것은 불가능합니다. 먼저 CPU의 레지스터로 옮겨야 합니다.
- MOVS 명령어를 통해 데이터 블록을 이동할 수 있으며, 이는 바이트 또는 단어 체인을 복사합니다. MOCSB는 한 위치에서 다른 위치로 n바이트를 복사하고 MOVSW는 한 위치에서 다른 위치로 n워드를 복사합니다. 마지막 두 명령어는 DS:SI가 정의한 주소에서 값을 가져오고, 이를 이동할 데이터 그룹으로, ES:DI를 데이터의 새 지역화로 가져옵니다.
데이터를 이동하려면 배터리라는 구조도 있는데, 여기서 데이터는 push 명령어로 도입되고 pop 명령어로 추출됩니다. 스택에서 도입되는 첫 번째 데이터는 우리가 취할 수 있는 마지막 데이터입니다. 즉, 우리 프로그램에서 다음 명령어를 사용하는 경우입니다.
푸시 액스
푸시 BX
푸시CX
스택에서 레지스터를 꺼낼 때 각 레지스터에 올바른 값을 반환하려면 다음 순서에 따라야 합니다.
팝CX
팝비엑스
팝 액스
외부 장치와 통신하려면 out 명령을 사용하여 포트로 정보를 전송하고, in 명령을 사용하여 포트에서 수신한 정보를 읽습니다.
OUT 명령의 구문은 다음과 같습니다.
아웃 DX,AX
여기서 DX는 통신에 사용될 포트 값을 포함하고, AX는 전송될 정보를 포함합니다.
IN 명령의 구문은 다음과 같습니다.
AX,DX에서
여기서 AX는 수신 정보를 보관하는 레지스터이고 DX는 정보가 도착할 포트의 주소를 포함합니다.
MOV 지침
메모리 셀, 레지스터 및 어큐뮬레이터 간의 데이터 전송에 사용됩니다. 구문은 다음과 같습니다.
MOV 목적지, 소스
이 지침에 허용된 다양한 데이터 이동은 다음 표에 나와 있습니다.
일련번호 |
목적지 |
원천 |
1. |
메모리 |
축전지 |
2. |
축전지 |
메모리 |
3. |
세그먼트 레지스터 |
메모리/레지스터 |
4 |
메모리/레지스터 |
세그먼트 레지스터 |
5. |
등록하다 |
등록하다 |
6. |
등록하다 |
메모리 |
7. |
메모리 |
등록하다 |
8. |
등록하다 |
즉각적인 데이터 |
9. |
메모리 |
즉각적인 데이터 |
예를 들어 보겠습니다.
무브 AX,0006
MOV BX,AX
MOV AX,4C00
지능 21
이 프로그램은 0006H의 값을 AX 레지스터로 옮긴 다음, AX(0006h)의 내용을 BX 레지스터로 옮기고, 마지막으로 4C00h 값을 AX 레지스터로 옮겨 21h 인터럽트의 4C 옵션으로 실행을 끝냅니다. 인터럽트 13H와 인터럽트 21H에 대한 간략한 소개는 나중에 하겠습니다.
방해
인터럽트는 CPU가 실행을 중단하고 상태를 저장하고 특정 위치로 전송하도록 하는 하드웨어 시설입니다. 전송 위치는 인터럽트에 응답하여 조치를 취하려는 프로그램의 주소를 지정합니다. 인터럽트의 결과로 실행되는 프로그램을 인터럽트 처리 프로그램이라고 합니다.
예를 들어: DOS가 BIOS에 정보를 보내거나 BIOS가 컴퓨터 시스템에 정보를 보내려고 할 때, DOS나 BIOS는 인터럽트를 생성합니다. 인터럽트가 생성될 때마다 컴퓨터는 무엇을 하고 있는지 중단하고 먼저 인터럽트를 생성한 작업을 처리합니다.
인터럽트를 생성할 수 있는 각 장치에는 이러한 인터럽트를 생성하는 장치를 식별하기 위한 고유한 인터럽트 번호가 부여됩니다. 이 책에서는 인터럽트 13H의 모든 기능과 하위 기능, 인터럽트 13H의 확장 및 인터럽트 21H에 대해 논의합니다.
기본적으로 중단은 다음 세 가지 유형으로 나타날 수 있습니다.
- 내부 하드웨어 중단
- 외부 하드웨어 중단
- 소프트웨어 중단
내부 하드웨어 중단
내부 인터럽트는 프로그램 실행 중에 발생하는 특정 이벤트에 의해 생성됩니다. 이러한 유형의 인터럽트는 하드웨어에 의해 전체적으로 관리되며 수정할 수 없습니다.
이러한 유형의 중단에 대한 분명한 예는 컴퓨터 내부 시계의 카운터를 활성화하는 것입니다. 하드웨어는 시간을 최신 상태로 유지하기 위해 1초 동안 이 중단에 여러 번 호출을 합니다.
우리는 소프트웨어로 시간 업데이트를 제어할 수 없기 때문에 이러한 방해를 직접 관리할 수는 없지만 컴퓨터에 미치는 영향을 이용하여 이익을 얻는 것은 가능합니다.
예를 들어 지속적으로 업데이트되는 가상 시계를 만들려면 카운터의 실제 값을 읽고 사용자가 이해할 수 있는 형식으로 변환하는 프로그램만 작성하면 됩니다.
외부 하드웨어 중단
외부 인터럽트는 키보드, 프린터, 통신 카드 등과 같은 주변 장치에 의해 생성됩니다. 또한 코프로세서에 의해 생성됩니다. 외부 인터럽트를 비활성화하는 것은 불가능합니다.
이러한 중단은 CPU에 직접 전송되지 않고 이러한 유형의 중단을 독점적으로 처리하는 기능을 가진 통합 회로에 전송됩니다.
소프트웨어 중단
소프트웨어 인터럽트는 어셈블러가 INT 명령어를 사용하여 원하는 인터럽트 번호를 호출함으로써 직접 활성화될 수 있습니다.
인터럽트를 사용하면 프로그램을 만드는 데 도움이 되며, 인터럽트를 사용하면 프로그램이 더 짧아집니다. 인터럽트를 이해하기가 더 쉽고, 크기가 작기 때문에 일반적으로 성능이 더 좋습니다. 이러한 유형의 인터럽트는 운영 체제 DOS 인터럽트와 BIOS 인터럽트의 두 가지 범주로 구분할 수 있습니다.
두 가지의 차이점은 운영 체제 인터럽트는 사용하기 쉽지만 BIOS를 사용하여 목적을 달성하기 때문에 느리다는 것입니다. 반면에 BIOS 인터럽트는 훨씬 빠르지만 하드웨어의 일부이기 때문에 매우 특정적이고 회로 제조업체 브랜드에 따라서도 달라질 수 있다는 단점이 있습니다.
사용할 중단 유형을 선택하는 것은 전적으로 프로그램에 부여하려는 특성에 따라 달라집니다.
C 언어를 통한 인터럽트 처리를 통해 데이터 복구 프로그래밍을 위해 인터럽트를 사용할 것이므로 , 인터럽트 13H, 인터럽트 13H 확장 및 인터럽트 21H 루틴 만 특별히 논의하겠습니다 . 다른 모든 인터럽트와 그 기능에 대해 논의하는 것은 그렇게 중요하지 않습니다. C 언어 에서는 대부분의 작업을 수행하는 데 더 쉬운 기능이 있기 때문입니다. 그러나 데이터 복구 프로그래밍을 위해서는 인터럽트 13H 와 그 확장에 대한 지식이 필수적입니다. |
Interrupt 20H와 Interrupt 21H에 대한 간략한 소개를 해보겠습니다. 괄호로 쓰여진 값(예: 0x20)은 사용 방법을 나타냅니다.
INT 20H ( 0x20) --> 프로세스 종료
CS = 프로그램 세그먼트 접두사의 세그먼트 주소로 호출
반품 : 없음
댓글:
현재 프로세스를 종료합니다. 이것은 프로그램이 최종 종료를 수행하는 데 사용할 수 있는 여러 방법 중 하나입니다. INT 21H의 함수(00H 또는 31H 또는 4CH) 또는 단순히 INT 27H를 사용하여 최종 종료를 수행할 수도 있습니다. 여기서 INT 21H의 함수 31H 및 4CH는 일반적으로 선호되는데, 이는 반환 코드를 부모 프로세스에 전달할 수 있기 때문입니다.
파일 제어 블록(FCB)을 사용하여 파일을 쓴 경우 먼저 파일을 닫는 것이 좋습니다. 최종 종료 동작에서 프로세스가 차지한 모든 메모리가 해제되고 파일 버퍼가 플러시되고 프로세스가 소유한 파일이나 장치에 대한 모든 열려 있는 핸들이 닫히기 때문에 데이터가 손실될 수 있습니다.
따라서 파일에 대한 핸들이 열려 있는 경우 데이터가 손실될 수 있습니다.
INT 21H(0x21)
함수 00H (0x00) --> 프로세스 종료
AH = 00H로 호출
CS = 프로그램 세그먼트 접두사의 세그먼트 주소
반품 : 없음
댓글:
이 인터럽트는 현재 프로세스를 종료합니다. 이것은 프로그램이 최종 종료를 수행하는 데 사용할 수 있는 여러 방법 중 하나입니다. 자세한 내용은 INT 20H를 참조하세요.
INT 21H(0x21)
기능 01H (0x01) --> echo를 사용한 문자 입력
AH = 01H로 전화하세요
반환: AL = 8비트 입력 데이터
댓글:
이 인터럽트는 키보드와 같은 표준 입력 장치에서 문자를 읽고 표준 출력 장치에 에코합니다. 문자가 준비되지 않은 경우 문자가 사용 가능할 때까지 기다립니다.
INT 21H(0x21)
기능 02H (0x02) --> 문자 출력
AH = 02H로 전화하세요
DL = 출력을 위한 8비트 데이터
반품 : 없음
댓글:
표준 출력 장치에 문자를 출력합니다. 출력은 리디렉션될 수 있습니다. 출력이 리디렉션되면 디스크가 꽉 찼다는 것을 감지할 방법이 없습니다.
출력이 리디렉션되지 않았거나 핸들이 논리 장치 CON을 얻은 경우, 미리 정의된 표준 출력 핸들(0001H)을 사용하여 쓰기(INT 21H, 함수 40H)를 수행하여 문자열을 디스플레이에 전송할 수도 있습니다.
INT 21H(0x21)
기능 03H (0x03) --> 보조 입력
AH = 03H로 전화하세요
반환: AL = 8비트 입력 데이터
댓글:
표준 보조 장치에서 문자를 읽습니다. 기본값은 첫 번째 직렬 포트(COM1)입니다.
보조 장치가 프로그램에서 처리할 수 있는 것보다 더 빠르게 데이터를 보내는 경우 문자가 손실될 수 있습니다. 사용자 프로그램이 보조 장치의 상태를 읽거나 이 함수 호출을 통해 손실된 문자와 같은 I/O 오류를 감지할 방법이 없습니다.
INT 21H(0x21)
기능 04H (0x04) --> 보조 출력
AH = 04H로 전화하세요
DL = 출력을 위한 8비트 데이터
반품 : 없음
댓글:
INT 21H의 이 기능은 표준 보조 장치에 문자를 출력합니다. 기본값은 첫 번째 직렬 포트(COM1)입니다. 표준 보조 장치에 대한 사전 정의된 핸들(00034)을 사용하거나 논리 장치 AUX를 열어 얻은 핸들을 사용하여 쓰기(INT 21H 기능 40H)를 수행하여 문자열을 보조 장치로 보낼 수도 있습니다.
INT 21H(0x21)
기능 05H (0x05) --> 프린터 출력
AH = 05H로 전화하세요
DL = 출력을 위한 8비트 데이터
반품 : 없음
댓글:
이 함수는 표준 목록 장치로 문자를 보냅니다. 기본 장치는 첫 번째 병렬 포트(LPT1)의 프린터입니다. 표준 프린터 장치(0004H)에 대한 미리 정의된 핸들을 사용하거나 논리 장치 PRN 또는 LPT1을 열어서 얻은 핸들을 사용하여 쓰기(INT 21H 함수 40H)를 수행하여 문자열을 프린터로 보낼 수도 있습니다.
INT 21H(0x21)
기능 06H(0x06) --> 직접 콘솔 I/O
AH = 06H로 전화하세요
DL = 요청된 기능,
출력요청의 경우 00H-FEH
입력요청시 0FFH
반환: 없음, DL = 00H-0FEH로 호출된 경우
DL = FFH로 호출되고 캐릭터가 준비된 경우
제로 플래그 = 클리어
AL = 8비트 입력 데이터
DL = FFH로 호출되고 문자가 준비되지 않은 경우
제로 플래그 = 설정
댓글:
표준 입력 장치에서 문자를 읽거나 표준 출력 장치에 문자를 씁니다. I/O는 리디렉션될 수 있지만 I/O가 리디렉션된 경우 EOF 또는 디스크가 꽉 찼다는 것을 감지할 방법이 없습니다. INT 21H의 이 기능은 운영 체제의 간섭 없이 모든 가능한 문자와 제어 코드를 읽고 써야 하는 프로그램에서 사용합니다.
INT 21H(0x21)
기능 07H(0x07) --> 에코 없는 필터링되지 않은 문자 입력
AH = 07H로 전화하세요
반환: AL = 8비트 입력 데이터
댓글:
이 함수는 표준 출력 장치에 문자를 에코하지 않고 표준 입력 장치에서 문자를 읽습니다.
INT 21H(0x21)
기능 08H(0x08) --> 에코 없는 문자 입력
AH = 08H로 전화하세요
반환: AL = 8비트 입력 데이터
댓글:
이 함수는 표준 출력 장치에 문자를 에코하지 않고 표준 입력 장치에서 문자를 읽습니다.
INT 21H(0x21)
함수 09H (0x09) --> 문자열 표시
AH = 09H로 전화하세요
DS:DX = 세그먼트: 문자열의 오프셋
반품 : 없음
댓글:
표준 출력 장치로 문자열을 보냅니다. 출력은 리디렉션될 수 있습니다. 출력이 리디렉션된 경우 디스크가 꽉 찼다는 것을 감지할 방법이 없습니다. 또한 표준 출력(0001H)에 대한 사전 정의된 핸들을 사용하여 쓰기(INT 21H 함수 40H)를 수행하여 문자열을 디스플레이로 보낼 수 있습니다(리디렉션되지 않은 경우). 또는 논리 장치 CON을 열어서 얻은 핸들을 사용합니다.
INT 21H(0x21)
기능 0AH(0x0A 또는 10) --> 버퍼링된 키보드 입력
AH = 0AH로 호출
DS:DX = 세그먼트: 버퍼의 오프셋
반환값: 버퍼에 데이터가 배치됨, 아무것도 반환하지 않음
댓글:
표준 입력 장치에서 ASCII 캐리지 리턴(0DH)까지 바이트 문자열을 읽고 사용자가 지정한 버퍼에 넣습니다. 문자는 표준 출력 장치에 에코됩니다. 함수에서 사용하는 버퍼의 형식은 다음과 같습니다.
바이트 |
내용물 |
0 |
프로그램에서 설정한 읽을 수 있는 최대 문자 수 |
1 |
MS-DOS에서 설정한, 실제로 읽혀진 문자 수(캐리지 리턴 제외) |
2+ |
키보드나 표준 입력에서 읽은 문자열이며 캐리지 리턴(0DH)으로 종료됩니다. |
INT 21H(0x21)
기능 0BH(0x0B 또는 11) --> 입력 상태 확인
AH = 0BH로 호출
반환값: AL = 00H (문자가 없는 경우)
FFH (최소한 하나의 문자가 사용 가능한 경우)
댓글:
키보드와 같은 표준 입력 장치에서 문자를 사용할 수 있는지 확인합니다. 이 기능은 IOCTL INT 21H 함수 44H 하위 기능 06H와 동일합니다.
INT 21H(0x21)
기능 0CH(0x0C 또는 12) --> 입력 버퍼 플러시 후 입력
AH = 0CH로 호출
AL = 재설정 후 호출할 입력 수
버퍼(01H, 06H, 07H, 08H 또는 0AH여야 함)
AL = 0AH인 경우
DS: DX = 세그먼트: 입력 버퍼의 오프셋
반환: AL = 01H, 06H, 07H 또는 08H로 호출되는 경우
AL = 8비트 입력 데이터
AL=0AH로 호출되는 경우,
아무것도 없음(데이터가 버퍼에 저장됨)
댓글:
표준 입력 버퍼를 비운 다음 문자 입력 함수 중 하나를 호출합니다. 입력은 리디렉션될 수 있습니다. AL의 함수 번호(01H, 06H, 07H, 08H 또는 0AH 제외)는 입력 버퍼를 플러시하고 호출 프로그램으로 제어를 반환합니다.
INT 21H(0x21)
기능 0DH(0x0D 또는 13) -> 디스크 재설정
AH = 0DH로 호출
반품 : 없음
댓글:
이 기능은 모든 파일 버퍼를 플러시합니다. 이 기능은 아직 열려 있는 파일에 대한 디스크 디렉토리를 업데이트하지 않습니다.
INT 21H(0x21)
기능 0EH (0x0E 또는 14) -> 디스크 선택
AH = 0EH로 호출
DL = 드라이브 코드(0 = A, 1 = B 등)
반환값: AL = 시스템의 논리 드라이브 수
댓글:
지정된 드라이브를 현재 또는 기본 디스크 드라이브로 선택하고 시스템에 있는 총 논리 드라이브 수를 반환합니다.
응용 프로그램은 드라이브 문자 AZ(0 = A, 1 = B 등)로 제한되어야 합니다. 논리 드라이브는 플로피 디스크 및 하드 디스크 드라이브 등과 같은 블록 장치의 총 수를 의미합니다. 일반적으로 단일 실제 하드 디스크 드라이브는 두 개 이상의 논리 드라이브로 분할됩니다.
INT 21H(0x21)
함수 0FH (0x0F 또는 15) -> 파일 열기
AH = 0FH로 호출
S: DX = 세그먼트: 파일 제어 블록의 오프셋
반환: 함수가 성공하고 파일을 찾은 경우
알 = 00H
그리고 MS-DOS로 채워진 FCB는 다음과 같습니다:
드라이브 필드(오프셋 00H) = 드라이브 A의 경우 1, 드라이브 B의 경우 2 등. 현재 블록 필드(오프셋 0CH) = 00H
레코드 크기 필드(오프셋 0EH) = 0080H
크기 필드(오프셋 10H) = 디렉토리의 파일 크기
데이터 필드(오프셋 14H) = 디렉토리의 날짜 스탬프
시간 필드(오프셋 16H) = 디렉토리의 타임스탬프
함수가 실패하고 파일을 찾을 수 없는 경우
AL = 0FFH
댓글:
파일을 열고 이후의 읽기/쓰기 작업에 사용할 수 있도록 합니다. 프로그램이 128바이트가 아닌 레코드 크기를 사용하려는 경우 파일이 성공적으로 열린 후 다른 디스크 작업 전에 FCB 오프셋 0EH에서 레코드 크기 필드를 설정해야 합니다.
INT 21H(0x21)
함수 10H(0x10 또는 16) -> 파일 닫기
호출: AH = 10H
DS: DX = 세그먼트: 파일 제어 블록의 오프셋
반환: 함수가 성공한 경우(디렉토리 업데이트 성공)
알 = 00H
함수가 실패한 경우(디렉토리에서 파일을 찾을 수 없음)
알 = FH
댓글:
파일을 닫는 데 사용됩니다. 파일을 닫고, 파일과 관련된 모든 MS-DOS 내부 디스크 버퍼를 디스크로 플러시하고, 파일이 수정되거나 확장된 경우 디스크 디렉토리를 업데이트합니다.
INT 21H(0x21)
함수 11H (0x11 또는 17) -> 첫 번째 파일 찾기
AH = 11H로 호출
DS: DX = 세그먼트: 파일 제어 블록의 오프셋
반환: 함수가 성공하고 일치하는 파일을 찾은 경우
알 = 00H
그리고 현재 디스크 전송 영역(DTA) 주소의 버퍼는 작동하기 위해 입력된 FCB 유형에 따라 열리지 않은 일반 FCB 또는 확장 FCB로 채워집니다.
함수가 실패한 경우(일치하는 파일 이름을 찾을 수 없음)
AL = FFH
댓글:
지정된 드라이브의 현재 디렉토리에서 일치하는 파일 이름을 검색합니다. 와일드카드(?)와 *를 사용할 수 있습니다. 이 함수는 첫 번째로 일치하는 파일 이름을 반환합니다.
INT 21H(0x21)
함수 12H (0x12 또는 18) -> 다음 파일 찾기
호출: AH = 12H
DS: DX = 세그먼트: 파일 제어 블록의 오프셋
반환: 함수가 성공하고 일치하는 파일 이름을 찾은 경우
알 = 00H
그리고 현재 디스크 전송 영역(DTA) 주소의 버퍼는 INT21H 함수 11H에 원래 입력된 FCB 유형에 따라 열리지 않은 일반 FCB 또는 확장 FCB로 설정됩니다.
함수가 실패하고 일치하는 파일 이름을 찾을 수 없는 경우
알 = FH
댓글:
이것은 이전 함수의 동반 함수입니다. INT 21H 함수 11H가 성공적이었다면 일치하는 다음 파일 이름이 있으면 반환합니다. 이 함수는 입력으로 사용된 FCB가 INT 21H 함수 11H에 대한 이전 호출과 INT 21H 함수 12H에 대한 후속 호출에 의해 적절하게 초기화되었으며 검색되는 파일 이름이나 확장자에 최소한 하나의 와일드카드 문자가 포함되어 있다고 가정합니다.
INT 21H(0x21)
함수 13H (0x13 또는 19) -> 파일 삭제
호출: AH = 13H
DS: DX = 세그먼트: 파일 제어 블록의 오프셋
반환: 함수가 성공하고 파일 또는 파일들이 삭제된 경우
알 = 00H
함수가 실패하고 일치하는 파일이 발견되지 않았거나 적어도 하나의 일치하는 파일이 읽기 전용인 경우,
알 = FH
댓글:
기본 또는 지정된 디스크 드라이브의 현재 디렉토리에서 일치하는 모든 파일을 삭제합니다. 와일드카드(?)와 *도 사용할 수 있습니다.
INT 21H(0x21)
함수 14H(0x14 또는 20) -> 순차 읽기
AH = 14H로 호출
DS: DX = 세그먼트: 이전에 열린 오프셋
파일 제어 블록
반환: 읽기가 성공하면 AL = 00H
01H 파일 끝인 경우
02H 세그먼트 랩핑 시
03H 레코드의 일부가 끝에서 읽혀지는 경우
파일
댓글:
이 기능은 파일에서 다음 연속적인 데이터 블록을 읽은 다음 파일 포인터를 적절히 증가시킵니다. 읽을 데이터 바이트 수는 파일 제어 블록(FCB)의 레코드 크기 필드(오프셋 0EH)로 지정됩니다.
레코드는 INT 21H 함수 1AH에 대한 가장 최근의 호출로 지정된 현재 디스크 전송 영역(DTA) 주소에서 메모리로 읽혀집니다. 레코드의 크기와 버퍼의 위치가 세그먼트 오버플로 또는 래핑이 발생할 정도이면 함수는 02H의 반환 코드로 실패합니다.
INT 21H(0x21)
기능 15H(0x15 또는 21) --> 순차 쓰기
호출: AH = 15H
DS: DX = 세그먼트: 이전에 열린 파일 제어 블록의 오프셋
반환: 쓰기가 성공하면 AL = 00H
01H, 디스크가 파일인 경우
02H, 세그먼트 랩의 경우
댓글:
이 함수는 다음 연속적인 데이터 블록을 파일에 쓰고, 그런 다음 파일 포인터를 적절히 증가시킵니다. 쓸 데이터의 바이트 수는 파일 제어 블록(FCB)의 레코드 크기 필드(오프셋 0EH)에 의해 지정됩니다.
INT 21H(0x21)
함수 16H (0x16 또는 22) --> 파일 생성
호출: AH = 16H
DS: DX = 세그먼트: 열리지 않은 파일 제어 블록의 오프셋
반환: 함수가 성공하고 파일이 생성되거나 잘린 경우
알 = 00H
그리고 FCB는 다음과 같이 MS-DOS로 채워졌습니다:
드라이브 필드(오프셋 00H) = 드라이브 A의 경우 1, 드라이브 B의 경우 2 등.
현재 블록 필드(offset0CH) = 00H
레코드 크기 필드(오프셋 0EH) = 0080H
크기 필드(오프셋 10H) = 디렉토리의 파일 크기
날짜 필드(오프셋 14H) = 디렉토리의 날짜 스탬프
시간 필드(오프셋 16H = 디렉토리의 타임스탬프)
기능이 실패한 경우(디렉토리가 꽉 찬 경우)
알 = FH
댓글:
이 함수는 현재 디렉토리에 새 디렉토리 항목을 만들거나 동일한 이름을 가진 기존 파일을 0 길이로 자릅니다. 또한 후속 읽기/쓰기 작업을 위해 파일을 엽니다. 이 함수는 지정된 이름을 가진 기존 파일이 0 길이로 잘리고 해당 파일의 모든 데이터가 복구 불가능하게 손실되므로 주의해서 사용해야 합니다.
INT 21H(0x21)
기능 17H(0x17 또는 23) --> 파일 이름 바꾸기
AH = 17H로 호출
DS: DX = 세그먼트: 특수 파일 제어 블록의 오프셋
반환: 함수가 성공하고 하나 이상의 파일 이름이 변경된 경우
알 = 00H
함수가 실패하고 일치하는 파일이 없거나 새 파일 이름이 기존 파일과 일치하는 경우
알 = FH
댓글:
이 기능은 지정된 드라이브의 디스크에 있는 현재 디렉토리에서 일치하는 모든 파일의 이름을 변경합니다.
여기에 와일드카드를 사용할 수도 있습니다. 특수 파일 제어 블록은 드라이브 코드, 파일 이름, 확장자를 일반 위치(바이트 0~0BH)에 두고, 첫 번째 파일 이름 뒤 6바이트에서 시작하는 두 번째 파일 이름(오프셋 11H)을 갖습니다.
국제 21시
함수 18H(0x18 또는 24) --> 예약됨
INT 21H(0x21)
함수 19H(0x19 또는 25) --> 현재 디스크 가져오기
AH = 19H로 호출
반환값: AL = 드라이브 코드(0은 A 드라이브, 1은 B 드라이브 등)
댓글:
이 함수는 현재 또는 기본 디스크 드라이브의 드라이브 코드를 반환합니다.
INT 21H(0x21)
기능 1AH(0x1A 또는 26) --> DTA 주소 설정
호출: AH = 1AH
DS: DX = 세그먼트: 디스크 전송 영역의 오프셋.
반품 : 없음
댓글:
이 함수는 이후의 FCB 관련 함수 호출에 사용될 디스크 전송 영역(DTA)의 주소를 지정합니다.
INT 21H(0x21)
기능 1BH(0x1B 또는 27) --> 기본 드라이브 데이터 가져오기
호출: AH = 1BH
반환: 함수가 성공한 경우
AL = 클러스터당 섹터
DS: DX = 미디어 ID 바이트의 세그먼트 오프셋
CX = 물리적 섹터의 크기(바이트)
DX = 기본 드라이브의 클러스터 수
기능이 실패한 경우(잘못된 드라이브 또는 심각한 오류)
알 = FH
댓글:
이 기능은 기본 디스크 드라이브에 대한 선택된 정보와 파일 할당 테이블에서 미디어 식별 바이트에 대한 포인터를 가져옵니다.
미디어 ID 바이트의 의미는 다음과 같습니다.
미디어 설명자 ID |
중간 |
0F0H |
3.5인치 플로피 디스크, 양면, 18섹터(또는 기타) |
0F8H |
고정 디스크 |
0F9H |
5.25인치 플로피 디스크, 양면, 15섹터 |
0F9H |
3.5인치 플로피 디스크, 양면, 9섹터 |
0FCH |
5.25인치 플로피 디스크, 단면, 9섹터 |
0FDH |
5.25인치 플로피 디스크, 양면, 9섹터 |
0FDH |
8인치 플로피 디스크, 단면, 단일 밀도 |
0FEH |
5.25인치 플로피 디스크, 단면, 8섹터 |
0FEH |
8인치 플로피 디스크, 단면, 단일 밀도 |
0FEH |
8인치 플로피 디스크, 양면, 이중 밀도 |
0FFH |
5.25인치 플로피 디스크, 양면, 8섹터 |
INT 21H(0x21)
기능 1CH (0x1C 또는 28) --> 드라이브 데이터 가져오기
AH = 1CH로 전화하세요
DL = 드라이브 코드
반환값: 함수가 성공한 경우
AL = 클러스터당 섹터
DS: BX = 세그먼트: 미디어 ID 바이트의 오프셋
CX = 물리적 섹터의 크기(바이트)
DX = 기본 또는 지정된 드라이브에 대한 클러스터 수
기능이 실패하고 드라이브가 잘못되었거나 심각한 오류가 있는 경우
알 = FH
댓글:
이 함수는 지정된 디스크 드라이브에 대한 할당 정보와 파일 할당 테이블에서 미디어 식별 바이트에 대한 포인터를 얻습니다. 미디어 ID 정보는 INT 21H, 함수 1BH에 제공된 미디어 설명자 ID 바이트 테이블을 참조하십시오.
INT 21H(0x21)
기능 1DH(0x1D 또는 29) --> 예약됨
INT 21H(0x21)
기능 1EH (0x1E 또는 30) --> 예약됨
INT 21H(0x21)
기능 1FH(0x1F 또는 31) --> 예약됨
INT 21H(0x21)
함수 20H(0x20 또는 32) --> 예약됨
INT 21H(0x21)
함수 21H(0x21 또는 33) --> 무작위 읽기
AH = 21H로 호출
DS: DX = 세그먼트: 이전에 열린 오프셋
파일 제어 블록
반환: 읽기가 성공하면 AL = 00H
01H 파일 끝인 경우
02H 세그먼트 랩핑 시 읽기 취소됨
03H 레코드의 일부가 끝에서 읽혀지는 경우
파일
댓글:
이 기능은 파일에서 선택된 레코드를 메모리로 읽어옵니다. 레코드는 INT 21H 함수 1AH에 대한 가장 최근의 호출로 지정된 현재 디스크 전송 영역 주소에서 메모리로 읽힙니다.
INT 21H(0x21)
함수 22H (0x22 또는 34) --> 무작위 쓰기
AH = 22H로 호출
DS: DX = 세그먼트: 이전에 열린 오프셋
파일 제어 블록
반환: 쓰기가 성공하면 AL = 00H
01H 디스크가 꽉 찬 경우
02H 세그먼트 랩핑시 쓰기 취소됨
댓글:
이 기능은 메모리의 데이터를 파일의 선택된 레코드에 씁니다.
INT 21H(0x21)
함수 23H(0x23 또는 35) --> 파일 크기 가져오기
AH = 23H로 호출
DS: DX = 세그먼트: 열리지 않은 파일의 오프셋
제어 블록
반환: 함수가 성공하고 일치하는 파일 이름이 발견된 경우
알 = 00H
그리고 FCB 상대 레코드 필드(오프셋 21H)는 파일의 레코드 수로 설정되며 필요한 경우 다음 완전한 레코드로 반올림됩니다.
함수가 실패하고 일치하는 파일을 찾을 수 없는 경우
알 = FH
댓글:
이 함수는 현재 디렉토리에서 일치하는 파일을 검색합니다. 파일이 발견되면 레코드 수에 따른 파일 크기로 FCB를 업데이트합니다. 이 함수에는 기본 레코드 크기가 없으므로 이 함수를 호출하기 전에 FCB 레코드 크기 필드(오프셋 0EH)에 적절한 값을 입력해야 합니다.
INT 21H(0x21)
기능 24H(0x24 또는 36) --> 상대 레코드 번호 설정
AH = 24H로 전화하세요
DS: DX = 세그먼트: 이전에 열린 오프셋
파일 제어 블록
반환: AL이 파괴됨(다른 레지스터는 영향을 받지 않음)
FCB 상대 레코드 필드(오프셋 21H) 업데이트됨
댓글:
이 기능은 파일 제어 블록(FCB)의 상대 레코드 번호 필드를 열린 FCB에 기록된 현재 파일 위치에 맞게 설정합니다.
INT 21H(0x21)
기능 25H(0x25 또는 37) --> 인터럽트 벡터 설정
호출: AH = 25H
AL = 인터럽트 번호
DS: DX = 세그먼트: 인터럽트 처리의 오프셋
루틴
반품 : 없음
댓글:
이 기능은 CPU 인터럽트 벡터를 초기화하여 인터럽트 처리 루틴을 가리킵니다. 잘 동작하는 애플리케이션에서 인터럽트 벡터 테이블을 직접 편집하는 것보다 우선적으로 사용해야 합니다.
INT 21H(0x21)
기능 26H(0x26 또는 38) --> 새 프로그램 세그먼트 접두사(PSP) 생성
AH = 26H로 호출
DX = 세그먼트: 새로운 프로그램 세그먼트의
접두사(PSP)
반품 : 없음
댓글:
이 기능은 현재 실행 중인 프로그램의 프로그램 세그먼트 접두사(PSP)를 여유 메모리의 지정된 세그먼트 주소로 복사한 다음, 새 PSP를 업데이트하여 다른 프로그램에서 사용할 수 있도록 합니다.
INT 21H(0x21)
함수 27H(0x27 또는 39) --> 랜덤 블록 읽기
AH = 27H로 호출
CX = 읽을 레코드 수
DS: DX = 세그먼트: 이전에 열린 오프셋
파일 제어 블록
반환: 요청된 모든 레코드가 읽힌 경우 AL = 00H
01H 파일 끝인 경우
02H 세그먼트 랩핑 시
03H 레코드의 일부가 끝에서 읽혀지는 경우
파일
CX = 읽은 실제 레코드 수
댓글:
이 함수는 지정된 파일 위치에서 시작하여 파일에서 하나 이상의 순차적인 레코드를 메모리로 읽습니다. 버퍼의 크기와 위치가 세그먼트 오버플로 또는 래핑어라운드가 발생할 정도이면 함수는 02H의 반환 코드로 실패하고 파일 끝에서 일부 레코드가 읽히면 나머지 레코드는 0으로 패딩됩니다.
INT 21H(0x21)
함수 28H(0x28 또는 40) --> 랜덤 블록 쓰기
AH = 28H로 호출
CX = 쓸 레코드 수
DS: DX = 세그먼트: 이전에 열린 오프셋
파일 제어 블록
반환: 요청된 모든 레코드가 기록된 경우 AL = 00H
01H 디스크가 꽉 찬 경우
02H 세그먼트 랩핑 시
CX = 실제로 기록된 레코드 수
댓글:
이 함수는 지정된 파일 위치에서 시작하여 메모리에서 하나 이상의 순차적 레코드를 파일에 씁니다. 버퍼의 크기와 위치가 세그먼트 오버플로 또는 래핑어라운드가 발생할 정도이면 함수는 반환 코드 02H로 실패합니다.
INT 21H(0x21)
함수 29H(0x29 또는 41) --> 파일 이름 구문 분석
AH = 29H로 호출
AL = 구문 분석을 제어하는 플래그
비트 0 = 1, 선행 구분 기호가 있는 경우
스캔됨(무시됨).
= 0, 선행 구분 기호가 없는 경우
스캔해서 꺼짐
비트 1 = 1, FCB의 드라이브 ID 바이트가 다음과 같은 경우
드라이브가 수정된 경우에만
구문 분석되는 문자열에 지정됨.
= 0, FCB의 드라이브 ID 바이트가 다음과 같은 경우
수정 여부와 관계없이 드라이브가 없는 경우
지정자가 구문 분석된 문자열에 존재하고 FCB 드라이브 코드 필드가 0(기본값)으로 설정됩니다.
비트 2 = 1, FCB의 파일 이름 필드가 다음과 같은 경우
파일 이름이 다음과 같은 경우에만 수정됩니다.
구문 분석되는 문자열에 지정됨.
= 0, FCB의 파일 이름 필드가 무조건 수정되고, 구문 분석된 문자열에 파일 이름이 없으면 FCB 파일 이름은 ASCIIZ 공백으로 설정됩니다.
FCB의 확장 필드가 1이면 비트 3 = 1입니다.
수정됨, 확장자가 있는 경우에만
구문 분석되는 문자열에 지정됨.
= 0, FCB의 확장 필드가 다음과 같은 경우
확장자가 없는 경우 수정 여부와 관계 없음
구문 분석된 문자열 FCB에 존재합니다.
확장자는 ASCIIZ 공백으로 설정됩니다.
DS: SI = segment: 문자열의 오프셋
ES: DI = 세그먼트: 파일 제어 블록의 오프셋
반환: 와일드카드 문자가 없는 경우 AL = 00H
문자열을 구문 분석하면 01H가 발생합니다.
와일드카드 문자 FFH가 포함되어 있습니다.
드라이브 지정자가 유효하지 않은 경우
DS: SI = 세그먼트: 첫 번째 문자의 오프셋
파일 이름을 구문 분석한 후
ES: DI = 세그먼트: 포맷된 오프셋
열리지 않은 파일 제어 블록
댓글:
이 함수는 텍스트 문자열을 파일 제어 블록(FCB)의 다양한 필드로 구문 분석합니다.
이 기능은 문자(: . ; , = + 탭 공백)를 구분 문자로 간주하고 모든 제어 문자 및 문자(: . ; , = + 탭 공백 < > | / “ [ ])를 종료 문자로 간주합니다.
INT 21H(0x21)
함수 2AH(0x2A 또는 42) --> 요일 및 날짜 가져오기
호출: AH = 2AH
반환: CX = 연도(1980~2099)
DH = 월(1~12)
DL = 일(1~31)
AL = 요일(0 = 일요일,
1= 월요일 등)
댓글:
이 함수는 시스템의 날짜, 요일, 월, 년도를 가져옵니다.
INT 21H(0x21)
기능 2BH(0x2B 또는 43) --> 날짜 설정
호출: AH = 2BH
CX = 연도(1980년부터 2099년까지)
DH = 월(1~12)
DL = 일(1~31)
반환: 날짜가 성공적으로 설정된 경우 AL = 00H
날짜가 유효하지 않으면 FFH(무시됨)
댓글:
이 기능은 시스템 시계 드라이버를 특정 날짜로 초기화하지만 시스템 시간은 변경되지 않습니다.
INT 21H(0x21)
함수 2CH (0x2C 또는 44) --> 시간 가져오기
AH = 2CH로 호출
반환: CH = 시간(0~23)
CL = 분(0~59)
DH = 초(0~59)
DL = 백분의 몇 초(0~99)
댓글:
이는 시스템 실시간 클록 드라이버로부터 시간을 시, 분, 초, 백분의 초로 변환하여 얻는 데 사용됩니다.
INT 21H(0x21)
기능 2DH(0x2D 또는 45) --> 시간 설정
AH = 2DH로 호출
CH = 시간(0~23)
CL = 분(0~59)
DH = 초(0~59)
DL = 백분의 몇 초(0~99)
반환: 시간이 성공적으로 설정된 경우 AL = 00H
FFH, 시간이 유효하지 않은 경우(무시됨)
댓글:
이 기능은 시스템 실시간 시계를 지정된 시간, 분, 초, 백분의 초로 초기화합니다. 시스템 날짜는 영향을 받지 않습니다.
INT 21H(0x21)
기능 2EH(0x2E 또는 46) --> 확인 플래그 설정
AH = 2EH로 호출
AL = 00H, 검증 플래그를 끄는 경우
01H, 확인 플래그를 켜는 경우
DL = 00H
반품 : 없음
댓글:
이 기능은 데이터의 자동 읽기-쓰기 검증을 위한 운영 체제 플래그를 끄거나 켭니다. 검증 플래그의 기본 설정은 OFF입니다. 읽기-쓰기 검증은 디스크 작업을 느리게 하기 때문입니다.
INT 21H(0x21)
기능 2FH(0x2F 또는 47) --> DTA 주소 가져오기
AH = 2FH로 호출
반환값: ES: BX = 세그먼트: 디스크 전송 영역의 오프셋
댓글:
이 기능은 FCB 파일 읽기/쓰기 작업을 위한 디스크 전송 영역(DTA)의 현재 주소를 얻습니다.
INT 21H(0x21)
함수 30H(0x30 또는 48) --> MS-DOS 버전 번호 가져오기
호출: AH = 30H
알 = 00H
반환값: AL = 주요 버전 번호(MS-DOS 3.10=3 등)
AH = 부 버전 번호(MS-DOS 3.10= 0AH 등)
BH = Original Equipment Manufacturer's
(OEM) 일련 번호(OEM에 따라 다름-일반적으로 IBM의 경우 00H)
PC-DOS, 0FFH 또는 MS-DOS의 경우 다른 값)
BL: CX = 24비트 사용자 일련 번호(선택 사항, OEM에 따라 다름)
댓글:
호스트 MS-DOS 운영체제의 버전 번호를 반환합니다.
INT 21H(0x21)
기능 31H(0x31 또는 49) --> 종료 및 상주 유지(TSR)
AH = 31H로 호출
AL = 반환 코드
DX = 예약할 문단의 메모리 양
아무것도 반환하지 않습니다
댓글:
이 함수는 부모 프로세스에 반환 코드를 전달하여 현재 실행 중인 프로그램의 실행을 종료하지만 로드될 다음 일시적 프로그램에 의해 오버레이되도록 프로그램의 메모리 일부 또는 전체를 예약합니다. 이 함수는 CS가 프로그램 세그먼트 접두사의 세그먼트를 포함하도록 지원하므로 INT 27H보다 우선적으로 사용해야 합니다.
INT 21H(0x21)
함수 32H(0x32 또는 50) --> 예약됨
INT 21H(0x21)
함수 33H(0x33 또는 51) --> 중단 플래그 가져오기 또는 설정, 부팅 드라이브 가져오기
전화: 브레이크 플래그가 발생하는 경우
아.H = 33H
알 = 00H
중단 플래그를 설정하는 경우
아.H = 33H
알 = 01H
DL = 00H (브레이크 플래그 OFF 시)
01H 브레이크 플래그를 켜면
부팅 드라이브를 얻는 경우
아.H = 33H
알 = 05H
반환: AL = 00H 또는 01H로 호출되는 경우
DL = 00H 중단 플래그가 OFF입니다.
01H 브레이크 플래그가 ON입니다
AL = 05H로 호출되는 경우
DL = 부팅 드라이브(1 = A, 2 = B 등)
댓글:
이 함수는 함수 호출 중 Ctrl-C 확인에 영향을 미치는 운영 체제의 중단 플래그 상태를 얻거나 변경합니다.
INT 21H(0x21)
함수 34H(0x34 또는 52) --> 예약됨
INT 21H(0x21)
함수 35H(0x35 또는 53) --> 인터럽트 벡터 가져오기
호출: AH = 35H
AL = 인터럽트 번호
반환값: ES: BX = 세그먼트: 인터럽트 핸들러의 오프셋
댓글:
이 함수는 지정된 머신 인터럽트에 대한 현재 인터럽트 핸들러 루틴의 주소를 얻습니다.
INT 21H(0x21)
기능 36H(0x36 또는 54) --> 드라이브 할당 정보 가져오기
호출: AH = 36H
DL = 드라이브 코드(0은 기본값, 1은 A 등)
반환: 함수가 성공한 경우
AX = 클러스터당 섹터
BX = 사용 가능한 클러스터 수
CX = 섹터당 바이트
DX = 드라이브당 클러스터
기능이 실패한 경우(드라이브가 유효하지 않음)
AX = FFFFH
댓글:
이 기능은 디스크 드라이브에 대한 선택된 정보를 얻습니다.
이 기능은 데이터 복구와 디스크 문제 해결 프로그래밍에 매우 중요합니다. 이를 통해 드라이브의 용량과 남아 있는 여유 공간, 그리고 다른 많은 중요한 사항을 계산할 수 있습니다.
INT 21H(0x21)
함수 37H(0x37 또는 55) --> 예약됨
INT 21H(0x21)
기능 38H(0x38 또는 56) --> 국가 정보 가져오기 또는 설정
전화: 국가 정보를 얻는 경우
아.H = 38H
AL = 0, 현재 국가 정보를 얻습니다.
1-FEH, 정보를 얻기 위해
코드 <255를 가진 국가
FFH, 국가별 정보를 얻으세요
코드 >=255
BX = 국가 코드, AL = FFH인 경우
DS:DX = 세그먼트: 반환된 정보에 대한 버퍼의 오프셋
현재 국가 코드를 설정하는 경우
아.H = 38H
AL = 1-FEH, 코드가 <255인 국가의 국가 코드
FFH, 코드 >=255인 국가의 경우
BX = 국가 코드, AL = 0FFH인 경우
DX = FFFFH
보고:
함수가 성공하면
캐리 플래그 = 클리어
그리고 국제화 정보를 얻는다면
BX = 국가 코드
DS: DX = 세그먼트: 국제화 정보를 보관하는 버퍼의 오프셋.
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 기능은 현재 또는 지정된 국가에 대한 국제 정보를 얻거나 현재 국가 코드를 설정합니다.
INT 21H(0x21)
함수 39H (0x39 또는 57) --> 디렉토리 생성
AH = 39H로 호출
DS: DX = 세그먼트: ASCIIZ 경로명의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 기능은 지정된 드라이브와 경로를 사용하여 디렉토리를 생성합니다.
ASCIIZ는 Null 또는 Zero, Byte로 끝나는 ASCII 문자 시퀀스로 알려져 있습니다. |
INT 21H(0x21)
기능 3AH(0x3A 또는 58) --> 디렉토리 삭제
호출: AH = 3AH
DS: DX = 세그먼트: ASCIIZ 경로명의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 기능은 지정된 드라이브와 경로를 사용하여 디렉토리를 제거합니다. 경로명의 요소가 존재하지 않거나 디렉토리가 비어 있지 않거나 액세스가 거부되거나 지정된 디렉토리가 현재 디렉토리인 경우 디렉토리 삭제 기능이 실패합니다.
INT 21H(0x21)
함수 3BH (0x3B 또는 59) --> 현재 디렉토리 설정
AH = 3BH로 호출
DS: DX = 세그먼트: ASCIIZ 경로명의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 지정된 드라이브와 경로를 사용하여 현재 또는 기본 디렉토리를 설정합니다. 지정된 경로 또는 경로의 요소가 존재하지 않으면 함수가 실패합니다.
INT 21H(0x21)
함수 3CH (0x3C 또는 60) --> 파일 생성
AH = 3CH로 호출
CX = 파일 속성, 여기서 속성
significance bits may be Combined.
Significance of bits is given in the following Table:
Bit(s) |
Significance (if set) |
0 |
Read-only |
1 |
Hidden |
2 |
System |
3 |
Volume label |
4 |
Reserved (0) |
5 |
Archive |
6 – 15 |
Reserved (0) |
DS: DX = segment: offset of ASCIIZ
pathname
Returns: If function successful
Carry flag = clear
AX = handle
If function unsuccessful
Carry flag = set
AX = error code
Comments:
If an ASCIIZ pathname is given, this function creates a new file in the designated or default directory on the designated or default disk drive. If the specified file already exists, it is truncated to zero length. In either case, the file is opened and a handle is returned that can be used by the program for subsequent access to the file.
If any element of the pathname does not exists or file is being created in root directory and root directory is full or access is denied or a file with read – only attribute is already in the specified directory, the function of creating file fails.
INT 21H (0x21)
Function 3DH (0x3D or 61) --> Open file
Call with: AH = 3DH
AL = access mode
Access mode bits significance is given in the following table:
Bits |
Significance |
0 – 2 |
Access Mode
000 = read access
001 = write access
010 = read/write access |
3 |
Reserved (0) |
4 – 6 |
Sharing Mode
000 = compatibility mode
001 = deny all
010 = deny write
011 = deny read
100 = deny none |
7 |
Inheritance flag
0 = child process inherits handle
1 = child does not inherit handle |
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
AX = handle
If function unsuccessful
Carry flag = set
AX = error code
Comments:
If an ASCIIZ pathname is given, this function opens the specified file in the designated or default directory on the designated or default disk drive. A handle is returned which can be used by the program for subsequent access to the file.
INT 21H (0x21)
Function 3EH (0x3E or 62) --> Close file
Call with: AH = 3EH
BX = handle
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Comments:
This function flushes all internal buffers associated with the file to disk, closes the file, and releases the handle for reuse, of previously open or created with success of a given handle. If the file was modified, the time and date stamp and file size are updated in the directory entry of the file.
INT 21H (0x21)
Function 3FH (0x3F or 63) --> Read file or device
Call with: AH = 3FH
BX = handle
CX = number of bytes to read
DS: DX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AX = byte transferred
If function unsuccessful
Carry flag = set
AX = error code
Comments:
이 함수는 파일에서 현재 파일 포인터 위치의 데이터를 버퍼로 전송한 다음, 이전에 열거나 만든 작업에서 주어진 유효한 파일 핸들에 대한 파일 포인터 위치, 버퍼 주소, 바이트 길이를 업데이트합니다.
INT 21H(0x21)
기능 40H(0x40 또는 64) --> 파일 또는 장치 쓰기
호출: AH = 40H
BX = 핸들
CX = 쓸 바이트 수
DS: DX = 세그먼트: 버퍼의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
AX = 전송된 바이트
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 버퍼에서 파일로 데이터를 전송한 다음, 이전 열기 또는 만들기 작업, 버퍼 주소 및 바이트 길이에서 주어진 유효한 파일 핸들에 대한 파일 포인터 위치를 업데이트합니다. 이 함수가 CX = 0으로 호출되면 파일이 잘리거나 현재 파일 포인터 위치로 확장됩니다.
INT 21H(0x21)
기능 41H (0x41 또는 65) --> 파일 삭제
AH = 41H로 호출
DS: DX = 세그먼트: ASCIIZ 경로명의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 기본 또는 지정된 디스크와 디렉토리에서 파일을 삭제합니다. 이 함수는 루트 디렉토리의 파일 이름의 첫 번째 문자를 E5H(0xE5) 문자로 바꾸고 파일 할당 테이블의 새 데이터에 대해 파일의 클러스터를 사용 가능하게 만들어 파일을 삭제합니다. 그때까지 해당 클러스터에 저장된 실제 데이터는 덮어쓰지 않습니다.
INT 21H(0x21)
함수 42H (0x42 또는 66) --> 파일 포인터 설정
AH = 42H로 호출
AL = 메서드 코드
00H 파일 시작 지점으로부터의 절대 오프셋
01H 현재 파일에서의 부호 있는 오프셋
바늘
02H 파일 끝으로부터 부호 있는 오프셋
BX = 핸들
CX = 오프셋의 가장 중요한 절반
DX = 오프셋의 최하위 절반
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
DX = 결과 파일의 가장 중요한 절반
바늘
AX = 결과 파일의 최하위 절반
바늘
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 파일 포인터 위치를 파일 시작, 파일 끝 또는 현재 파일 위치를 기준으로 설정합니다.
INT 21H(0x21)
함수 43H(0x43 또는 67) --> 파일 속성 가져오기 또는 설정
AH = 43H로 호출
AL = 00H 속성을 가져옵니다.
01H 속성을 설정하려면
CX = 파일 속성, AL=01H인 경우. 비트를 결합할 수 있음
DS: DX = 세그먼트: ASCIIZ 경로명의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
CX = 파일 속성
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 기능은 파일(읽기 전용, 숨김, 시스템 또는 아카이브) 또는 디렉토리의 속성을 얻거나 변경합니다. 다양한 속성에 대한 비트의 중요성은 이전에 제공된 비트 중요성 표를 참조하세요.
INT 21H(0x21)
기능 44H(0x44 또는 68) --> 입출력 제어(I/O Ctrl)
이 기능은 애플리케이션 프로그램과 장치 드라이버 간의 직접적인 통신 경로를 제공합니다. 이를 통해 프로그램은 하드웨어 종속 정보를 얻고 다른 MS-DOS 함수 호출에서 지원하지 않는 작업을 요청할 수 있습니다.
다음 표에는 입력 및 출력 제어의 하위 기능이 나와 있습니다.
하위 기능 |
작업 이름 |
00시 |
장치 정보 가져오기 |
01시 |
장치 정보 설정 |
02시 |
문자 장치 드라이버로부터 제어 데이터 수신 |
03시 |
제어 데이터를 문자 장치 드라이버로 전송 |
04시 |
블록 장치 드라이버로부터 제어 데이터 수신 |
05시 |
블록 장치 드라이버에 제어 데이터 보내기 |
06시 |
입력 상태 확인 |
07시 |
출력 상태 확인 |
08시 |
블록 장치가 제거 가능한지 확인 |
09시 |
블록 장치가 원격인지 확인 |
0AH(10) |
핸들이 원격인지 확인하세요 |
0비에이치(11) |
공유 재시도 횟수 변경 |
0CH (12)
|
문자 장치를 위한 일반 I/O 제어
값 |
설명 |
CL = 45H |
반복 횟수 설정 |
CL = 4AH |
코드 페이지 선택 |
CL = 4CH |
코드 페이지 준비 시작 |
씨엘 = 4DH |
코드 페이지 준비 종료 |
CL = 5FH |
디스플레이 정보 설정 |
CL = 65H |
반복 횟수 얻기 |
CL = 6AH |
선택된 코드 페이지 쿼리 |
CL = 6BH |
쿼리 준비 목록 |
CL = 7FH |
디스플레이 정보 얻기 |
|
0DH(13)
|
블록 장치를 위한 일반 I/O 제어
값 |
설명 |
CL = 40H |
장치 매개변수 설정 |
CL = 41H |
트랙 쓰기 |
CL = 42H |
트랙 포맷 및 확인 |
CL = 47H |
액세스 플래그 설정 |
CL = 60H |
장치 매개변수 가져오기 |
CL = 61H |
트랙 읽기 |
CL = 62H |
트랙 확인 |
CL = 67H |
액세스 플래그 얻기 |
|
0EH (14) |
논리 드라이브 맵 가져오기 |
0FH (15) |
논리 드라이브 맵 설정 |
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 00H(0x00) I/O Ctrl --> 장치 정보 가져오기
AH = 44H로 호출
알 = 00H
BX = 핸들
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
DX = 장치 정보 단어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 함수는 지정된 핸들과 연관된 파일이나 장치에 대한 장치 정보 단어를 반환합니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 01H(0x01) I/O Ctrl --> 장치 정보 설정
AH = 44H로 호출
알 = 01H
BX = 핸들
DX = 장치 정보 단어
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
INT 21H의 함수 44H의 이 하위 함수는 문자 장치와 연관된 핸들에 대한 특정 플래그를 설정합니다. 이 하위 함수는 파일과 연관된 핸들에 사용할 수 없습니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 02H(0x02) I/O Ctrl --> 제어 데이터 문자 장치 드라이버 읽기
AH = 44H로 호출
알 = 02H
BX = 핸들
CX = 읽을 바이트 수
DS: DX = 세그먼트: 버퍼의 오프셋
반환값: 함수가 성공한 경우
캐리 플래그 = 클리어
AX = 읽은 바이트
그리고 버퍼에는 드라이버의 제어 데이터가 포함되어 있습니다.
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
문자 장치 드라이버에서 제어 데이터를 읽습니다. 데이터의 길이와 내용은 각 장치 드라이버에 지정되며 표준 형식을 따르지 않습니다. 이 기능은 반드시 물리적 장치에서 입력을 가져오는 것은 아닙니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 03H(0x03) I/O Ctrl --> 제어 데이터 문자 장치 드라이버 쓰기
AH = 44H로 호출
알 = 03H
BX = 핸들
CX = 쓸 바이트 수
DS: DX = 세그먼트: 데이터의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
AX = 전송된 바이트
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 애플리케이션에서 문자 장치 드라이버로 제어 데이터를 전송합니다. 데이터의 길이와 내용은 각 장치 드라이버에 따라 다르며 표준 형식을 따르지 않습니다. 이 기능은 반드시 물리적 장치에 대한 출력을 가져오는 것은 아닙니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 04H(0x04) I/O Ctrl --> 제어 데이터 블록 장치 드라이버 읽기
AH = 44H로 호출
알 = 04H
BL = 장치 코드(0=기본값, 1=A, 2=B 등)
CX = 읽을 바이트 수
DS: DX = 세그먼트: 버퍼의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
AX = 전송된 바이트
그리고 버퍼에는 장치 드라이버의 제어 데이터가 포함되어 있습니다.
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 블록 장치 드라이버에서 제어 데이터를 애플리케이션 프로그램의 버퍼로 직접 전송합니다. 데이터의 길이와 내용은 각 장치 드라이버에 따라 다르며 표준 형식을 따르지 않습니다. 이 기능은 반드시 물리적 장치에서 입력을 가져오는 것은 아닙니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 05H(0x05) I/O Ctrl --> 쓰기 제어 데이터 블록 장치 드라이버
AH = 44H로 호출
알 = 05H
BL = 장치 코드(0=기본값, 1=A, 2=B 등)
CX = 쓸 바이트 수
DS: DX = 세그먼트: 데이터의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
AX = 전송된 바이트
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 애플리케이션 프로그램에서 블록 장치 드라이버로 직접 제어 데이터를 전송합니다. 제어 데이터의 길이와 내용은 각 장치 드라이버에 따라 다르며 표준 형식을 따르지 않습니다. 이 기능은 반드시 물리적 장치에 출력을 생성하지는 않습니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 06H(0x06) I/O Ctrl --> 입력 상태 확인
AH = 44H로 호출
알 = 06H
BX = 핸들
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
그리고 장치의 경우:
AL = 00H, 장치가 준비되지 않은 경우
FFH, 장치가 준비되면
파일의 경우:
AL = 00H, 파일 포인터가 EOF에 있는 경우
FFH, 파일 포인터가 EOF에 없는 경우
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
핸들과 연관된 장치나 파일이 입력을 받을 준비가 되었는지 여부를 나타내는 코드를 반환합니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 07H(0x07) I/O Ctrl --> 출력 상태 확인
AH = 44H로 호출
알 = 07H
BX = 핸들
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
그리고 장치의 경우:
AL = 00H, 장치가 준비되지 않은 경우
FFH, 장치가 준비되면
파일의 경우:
알 = FH
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
핸들과 연관된 장치가 출력을 할 준비가 되었는지 여부를 나타내는 코드를 반환합니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 08H(0x08) I/O Ctrl --> 블록 장치가 제거 가능한지 확인
AH = 44H로 호출
알 = 08H
BL = 드라이브 번호(0 = 기본값, 1=A, 2=B 등)
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
AL = 00H, 매체가 제거 가능한 경우
01H, 매체가 제거 불가능한 경우
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 지정된 블록 장치에 플로피 디스크와 같은 이동식 저장 매체가 포함되어 있는지 확인합니다. 특정 드라이브에서 예상대로 파일을 찾을 수 없는 경우 프로그램은 이 하위 기능을 사용하여 사용자에게 다른 디스크를 삽입하라는 메시지를 표시할지 여부를 결정할 수 있습니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 09H(0x09) I/O Ctrl --> 블록 장치가 원격인지 확인
AH = 44H로 호출
알 = 09H
BL = 드라이브 번호(0 = 기본값, 1=A, 2=B 등)
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
DX = 장치 속성 단어
비트 12 = 0, 드라이브가 로컬인 경우
= 1, 드라이브가 원격인 경우
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 지정된 블록 장치가 로컬(프로그램을 실행하는 컴퓨터에 연결됨)인지 원격(네트워크 서버로 리디렉션됨)인지 확인합니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 0AH(0x0A 또는 10) I/O Ctrl --> 핸들이 원격인지 확인
AH = 44H로 호출
알 = 0아르
BX = 핸들
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
DX = 파일 또는 장치에 대한 속성 단어
비트 15 = 로컬인 경우 0
1 원격인 경우
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
지정된 핸들이 로컬(프로그램을 실행 중인 PC에 있는) 파일이나 장치를 참조하는지, 원격(네트워크 서버에 있는) 파일이나 장치를 참조하는지 확인합니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 0BH(0x0B 또는 11) I/O Ctrl --> 공유 재시도 횟수 변경
AH = 44H로 호출
알 = 0BH
CX = 재시도당 지연(기본값 = 1)
DX = 재시도 횟수(기본값 = 3)
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 파일 공유 위반으로 인해 실패한 후 MS-DOS가 요청 프로세스에 오류를 반환하기 전에 디스크 작업을 재시도하는 횟수를 설정합니다. 이 하위 기능은 파일 공유 모듈이 로드되지 않으면 사용할 수 없습니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 0CH(0x0C 또는 12) I/O Ctrl 문자 장치에 대한 일반 I/O 제어
AH = 44H로 호출
알 = 0CH
BX = 핸들
CH = 카테고리(주요) 코드:
00H = 알 수 없음
01H = COM1, COM2, COM3 또는 COM4
03H = CON (키보드 및 디스플레이)
05H = LPT1, LPT2 또는 LPT3
CL = 기능(마이너) 코드:
45H = 반복 횟수 설정
4AH = 코드 페이지 선택
4CH = 코드 페이지 준비 시작
4DH = 코드 페이지 준비 종료
5FH = 디스플레이 정보 설정
65H = 반복 횟수 얻기
6AH = 선택된 코드 페이지 쿼리
6BH = 쿼리 준비 목록
7FH = 디스플레이 정보 가져오기
DS: DX = 세그먼트: 매개변수 블록의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
CL = 65H, 6AH, 6BH 또는 7FH로 호출되는 경우
DS: DX = 세그먼트: 매개변수 블록의 오프셋
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
애플리케이션 프로그램과 문자 장치 드라이버 간의 통신을 위한 범용 메커니즘을 제공합니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 0DH(0x0D 또는 13) I/O Ctrl --> 블록 장치에 대한 일반 I/O 제어
AH = 44H로 호출
알 = 0DH
BL = 드라이브 코드(0 = 기본값, 1 = A, 2 = B 등)
CH = 카테고리(주요) 코드:
08H = 디스크 드라이브
CL = 기능(마이너) 코드:
40H = 드라이브 매개변수 설정
41H = 트랙 쓰기
42H = 트랙 포맷 및 확인
47H = 액세스 플래그 설정
60H = 장치 매개변수 가져오기
61H = 트랙 읽기
62H = 트랙 확인
67H = 액세스 플래그 가져오기
DS: DX = 세그먼트: 매개변수 블록의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
CL = 60H 또는 61H로 호출되는 경우
DS: DX = 세그먼트: 매개변수 블록의 오프셋
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 애플리케이션 프로그램과 블록 장치 드라이버 간의 통신을 위한 범용 메커니즘을 제공합니다. 프로그램이 논리 드라이브의 장치 매개변수를 검사하거나 변경하고 하드웨어 독립적인 방식으로 디스크 트랙을 읽고, 쓰고, 포맷하고, 확인할 수 있도록 합니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 0EH(0x0E 또는 14) I/O Ctrl -->> 논리 드라이브 맵 가져오기
AH = 44H로 호출
알 = 0EH
BL = 드라이브 코드(0 = 기본값, 1=A, 2=B 등)
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
AL = 매핑 코드
00H, 논리 드라이브 코드가 하나만 있는 경우
블록 장치에 할당됨
01H-1AH 논리 드라이브 코드(1=A,
2=B 등) 블록 장치에 매핑됨
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
지정된 블록 드라이브에 액세스하는 데 가장 최근에 사용된 논리 드라이브 코드를 반환합니다.
INT 21H(0x21)
기능 44H(0x44 또는 68), 하위 기능 0FH(0x0F 또는 15) I/O Ctrl --> 논리 드라이브 맵 설정
AH = 44H로 호출
알 = 0FH
BL = 드라이브 코드(0 = 기본값, 1=A, 2=B 등)
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
AL = 매핑 코드
00H, 논리 드라이브 코드가 하나만 있는 경우
블록 장치에 할당됨
01H-1AH, 논리 드라이브 코드(1=A,
2=B 등)에 매핑됨
블록 장치
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 블록 장치를 참조하는 데 사용될 다음 논리 드라이브 코드를 설정합니다.
INT 21H(0x21)
함수 45H(0x45 또는 69) --> 핸들 복제
AH = 45H로 호출
BX = 복제될 핸들
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
AX = 새로운 핸들
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 현재 열려 있는 장치나 파일의 주어진 핸들에 대해 동일한 위치에 있는 동일한 장치나 파일을 참조하는 새 핸들을 반환합니다.
INT 21H(0x21)
함수 46H(0x46 또는 70) --> 핸들 리디렉션
AH = 46H로 호출
BX = 파일 또는 장치의 핸들
CX = 리디렉션될 핸들
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
주어진 핸들이 두 개이면, 이 함수는 두 번째 핸들이 첫 번째 핸들과 같은 위치에 있는 같은 장치나 파일을 참조하게 합니다. 그러면 두 번째 핸들은 리디렉션되었다고 합니다.
INT 21H(0x21)
함수 47H(0x47 또는 71) --> 현재 디렉토리 가져오기
AH = 47H로 호출
DL = 드라이브 코드(0 = 기본값, 1 = A,
2=B 등)
DS: SI = segment: 64바이트 버퍼의 오프셋
반환값: 함수가 성공한 경우
캐리 플래그 = 클리어
그리고 버퍼는 현재 디렉토리의 루트로부터의 전체 경로명으로 채워집니다.
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 루트에서 현재 디렉토리까지의 경로를 설명하는 ASCIIZ 문자열과 해당 디렉토리의 이름을 가져옵니다.
INT 21H(0x21)
함수 48H(0x48 또는 72) --> 메모리 블록 할당
AH = 48H로 호출
BX = 기억의 문단 수
필요함
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
Ax = 할당된 기본 세그먼트 주소
차단하다
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
BX = 사용 가능한 가장 큰 블록의 크기
(단락)
댓글:
메모리 블록을 할당하고 할당된 영역의 시작 부분에 대한 포인터를 반환합니다.
INT 21H(0x21)
함수 49H(0x49 또는 73) --> 메모리 블록 해제
AH = 49H로 호출
ES = 릴리스될 블록의 세그먼트
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 메모리 블록을 해제하고 다른 프로그램에서 사용할 수 있도록 하는 데 사용됩니다. 프로그램이 자신에게 속하지 않는 메모리 블록을 해제하거나 레지스터 ES에 전달된 세그먼트 주소가 기존 메모리 블록의 유효한 기본 주소가 아닌 경우 함수가 실패하거나 예측할 수 없는 시스템 오류가 발생할 수 있습니다.
INT 21H(0x21)
기능 4AH(0x4A 또는 74) --> 메모리 블록 크기 조정
AH = 4AH로 호출
BX = 문단의 원하는 새 블록 크기
ES = 수정할 블록의 세그먼트
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
BX = 사용 가능한 최대 블록 크기
(단락)
댓글:
이 기능은 애플리케이션 프로그램의 요구에 따라 메모리 블록을 동적으로 축소하거나 확장합니다.
INT 21H(0x21)
함수 4BH (0x4B 또는 75) --> 프로그램 실행(EXEC)
AH = 4BH로 호출
AL = 하위 함수
00H = 프로그램 로드 및 실행
03H = 오버레이 로드
ES: BX = 세그먼트: 매개변수 블록의 오프셋
DS: DX = 세그먼트: ASCIIZ 프로그램의 오프셋
경로명
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기록은 일반적인 방식으로 보존됩니다.
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 기능은 애플리케이션 프로그램이 다른 프로그램을 실행하고, 완료되면 제어권을 되찾을 수 있도록 합니다. 오버레이를 로드하는 데에도 사용할 수 있지만, 이 사용은 흔하지 않습니다.
INT 21H(0x21)
함수 4CH (0x4C 또는 76) --> 반환 코드로 프로세스 종료
AH = 4CH로 전화하세요
AL = 반환 코드
반품 : 없음
댓글:
이 함수는 현재 프로세스를 종료하고 부모 프로세스에 반환 코드를 전달합니다. 이것은 프로그램이 최종 종료를 수행하는 데 사용할 수 있는 여러 방법 중 하나입니다.
INT 21H(0x21)
함수 4DH(0x4D 또는 77) --> 반환 코드 가져오기
AH = 4DH로 전화하세요
반환: AH = 종료 유형
00H, INT 20H, INT 21H 함수 00H 또는 INT 21H 함수 4CH 에 의한 정상 종료인 경우
01H 사용자의 Ctrl-C 입력에 의한 종료인 경우
02H 치명적 오류 처리기에 의한 종료인 경우
03H INT21H 함수 31H 또는
INT 27H 에 의한 종료인 경우 |
AL = 자식 프로세스가 전달한 반환 코드
(INT 20H에 의해 자식이 종료된 경우 0,
INT 21H 기능 00H 또는 INT 27H)
댓글:
이 함수는 EXEC 호출(INT 21H 함수 4BH)을 성공적으로 실행한 후 부모 프로세스에서 자식 프로세스의 반환 코드와 종료 유형을 얻는 데 사용됩니다.
INT 21H(0x21)
함수 4EH (0x4E 또는 78) --> 첫 번째 파일 찾기
AH = 4EH로 호출
CX = 검색 속성(비트를 결합할 수 있음)
DS: DX = 세그먼트: ASCIIZ 경로명의 오프셋
반환: 함수가 성공하고 일치하는 파일을 찾은 경우
캐리 플래그 = 클리어
현재 디스크 전송 영역에 반환된 검색 결과는 다음과 같습니다.
변경(들) |
설명 |
00시~14시 |
예약됨 (0) |
15시 |
일치하는 파일 또는 디렉토리의 속성 |
16시~17시 |
파일 시간
비트 00H-04H = 2초 단위(0-29)
비트 05H-0AH = 분(0-59)
비트 0BH-0FH = 시간(0-23) |
18시~19시
|
파일 날짜
비트 00H-04H = 일(1-31)
비트 05H-08H = 월(1-12)
비트 09H-0FH = 년(1980년 기준) |
1AH-1DH |
파일 크기 |
1EH-2AH |
ASCIIZ 파일 이름 및 확장자 |
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 기능은 ASCIIZ 문자열 형태로 주어진 파일 사양에 대한 첫 번째 일치 파일을 기본 또는 지정된 드라이브의 기본 또는 지정된 디렉토리에서 검색합니다. 속성의 비트 중요성은 이전에 제공된 비트 중요성 표를 참조하세요.
INT 21H(0x21)
함수 4FH (0x4F 또는 79) --> 다음 파일 찾기
AH = 4FH로 호출
반환: 함수가 성공하고 일치하는 파일을 찾은 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이전에 INT 21H 함수 4EH에 대한 성공적인 호출이 있었던 경우, 이 함수는 원래 파일 사양과 일치하는 기본 또는 지정된 드라이브의 기본 또는 지정된 디렉토리에서 다음 파일을 찾습니다.
INT 21H(0x21)
기능 50H(0x50 또는 80) --> 예약됨
INT 21H(0x21)
함수 51H(0x51 또는 81) --> 예약됨
INT 21H(0x21)
함수 52H(0x52 또는 82) --> 예약됨
INT 21H(0x21)
함수 53H(0x53 또는 83) --> 예약됨
INT 21H(0x21)
함수 54H(0x54 또는 84) --> 확인 플래그 가져오기
AH = 54H로 호출
반환: AL = 현재 확인 플래그 값
00H 확인이 꺼진 경우
01H 확인하면
댓글:
이 함수는 시스템 확인(읽기 후 쓰기) 플래그의 현재 값을 얻습니다.
INT 21H(0x21)
기능 55H(0x55 또는 85) --> 예약됨
INT 21H(0x21)
함수 56H(0x56 또는 86) --> 파일 이름 바꾸기
AH = 56H로 호출
DS: DX = 세그먼트: 현재 ASCIIZ의 오프셋
경로명
ES: DI = 세그먼트: 새로운 ASCIIZ의 오프셋
경로명
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 기능은 파일의 이름을 바꾸거나 해당 디렉토리 항목을 같은 디스크의 다른 곳으로 옮깁니다. MS-DOS 버전 3.0 이상에서는 이 기능을 사용하여 디렉토리 이름을 바꿀 수도 있습니다.
경로명의 요소가 존재하지 않거나, 새 경로명을 가진 파일이 이미 존재하거나, 현재 경로명 지정에 새 경로명과 다른 디스크 드라이브가 포함되어 있거나, 파일이 루트 디렉토리로 이동되고 루트 디렉토리가 가득 찼거나 사용자에게 권한이 부족한 경우, 파일 이름을 바꾸는 기능은 실패합니다.
INT 21H(0x21)
함수 57H(0x57 또는 87) --> 파일 날짜 및 시간 가져오기 또는 설정
날짜와 시간을 얻는 경우:
아 = 57H
알 = 00H
BX = 핸들
날짜 및 시간을 설정하는 경우
아 = 57H
알 = 01H
BX = 핸들
CX = 시간
비트 00H-04H = 2초 단위(0-29)
비트 05H-0AH = 분(0-59)
비트 0BH-0FH = 시간(0-23)
DX = 날짜
비트 00H-04H = 일(1-31)
비트 05H-08H = 월(1-12)
비트 09H-0FH = 연도(1980년 기준)
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
그리고 AL = 00H로 호출되는 경우
CX = 시간
DX = 날짜
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 파일의 루트 디렉토리 항목에서 날짜 및 시간 스탬프를 얻거나 수정합니다.
INT 21H(0x21)
함수 58H(0x58 또는 88) --> 할당 전략 가져오기 또는 설정
전략 코드를 받는 경우:
아 = 58H
알 = 00H
전략코드를 설정하는 경우
아 = 58H
알 = 01H
BX = 원하는 전략 코드
00H = 첫 번째 적합
01H = 가장 적합
02H = 마지막 맞춤
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
그리고 AL = 00H로 호출되는 경우
AX = 현재 전략 코드
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
메모리 블록을 할당하기 위한 현재 MS-DOS 전략을 나타내는 코드를 얻거나 변경합니다. 기본 MS-DOS 메모리 할당 전략은 First Fit(코드 0)입니다.
첫 번째 적합 메모리 할당에서 MS-DOS는 사용 가능한 메모리 블록을 낮은 주소에서 높은 주소로 검색하여 블록 할당 요청을 충족시킬 수 있을 만큼 큰 첫 번째 메모리 블록을 할당합니다.
최적 할당 전략의 경우, MS-DOS는 사용 가능한 모든 메모리 블록을 검색하고, 해당 위치에 상관없이 요청을 충족하는 가장 작은 사용 가능한 블록을 할당합니다.
마지막 적합 메모리 할당 전략에서 MS-DOS는 사용 가능한 메모리 블록을 높은 주소에서 낮은 주소까지 검색하여 블록 할당 요청을 충족시킬 수 있을 만큼 충분히 큰 가장 높은 주소를 할당합니다.
INT 21H(0x21)
함수 59H(0x59 또는 89) --> 확장된 오류 정보 가져오기
AH = 59H로 호출
BX = 00H
반환: AX = 확장 오류 코드
오류 코드 표는 아래와 같습니다.
오류 코드 |
오류 |
01시 |
함수 번호가 잘못되었습니다 |
02시 |
파일을 찾을 수 없습니다 |
03시 |
경로를 찾을 수 없습니다 |
04시 |
열려 있는 파일이 너무 많습니다 |
05시 |
접근 불가 |
06시 |
핸들이 잘못되었습니다 |
07시 |
메모리 제어 블록이 파괴됨 |
08시 |
메모리가 부족합니다 |
09시 |
메모리 블록 주소가 잘못되었습니다 |
0AH(10) |
환경이 잘못되었습니다 |
0비에이치(11) |
형식이 잘못되었습니다 |
0CH (12) |
액세스 코드가 유효하지 않습니다 |
0DH(13) |
데이터가 유효하지 않습니다 |
0EH (14) |
알 수 없는 단위 |
0FH (15) |
디스크 드라이브가 유효하지 않습니다 |
10H(16) |
현재 디렉토리를 제거하려고 시도했습니다. |
11시(17) |
같은 장치가 아닙니다 |
12시(18) |
더 이상 파일이 없습니다 |
13H(19) |
디스크 쓰기 보호됨 |
14시간(20) |
알 수 없는 단위 |
15H(21) |
드라이브가 준비되지 않았습니다 |
16시간(22) |
알 수 없는 명령 |
17H(23) |
데이터 오류(CRC) |
18H(24) |
잘못된 요청 구조 길이 |
19H (25) |
오류를 찾다 |
1AH(26) |
알 수 없는 미디어 유형 |
1BH(27) |
섹터를 찾을 수 없습니다 |
1장(28) |
프린터에 종이가 없음 |
1DH(29) |
오류를 쓰다 |
1EH (30) |
읽기 오류 |
1층(31) |
일반적인 실패 |
20H(32) |
공유 위반 |
21H (33) |
잠금 위반 |
22H (34) |
디스크 변경이 잘못되었습니다 |
23H (35) |
FCB를 사용할 수 없습니다 |
24시간(36) |
공유 버퍼 초과 |
25시~31시 |
예약된 |
32H (50) |
지원되지 않는 네트워크 요청 |
33H (51) |
원격 컴퓨터가 수신하지 않음 |
34H (52) |
네트워크에 중복된 이름 |
35H (53) |
네트워크 이름을 찾을 수 없습니다 |
36H (54) |
네트워크가 바쁨 |
37H (55) |
장치가 더 이상 네트워크에 존재하지 않습니다 |
38H (56) |
net BIOS 명령 제한을 초과했습니다 |
39H (57) |
네트워크 어댑터 하드웨어 오류 |
3AH(58) |
네트워크에서 잘못된 응답이 왔습니다 |
3BH(59) |
예상치 못한 네트워크 오류 |
3CH(60) |
원격 어댑터가 호환되지 않습니다 |
3DH(61) |
인쇄 대기열이 가득 찼습니다 |
3EH (62) |
인쇄 파일에 대한 공간이 충분하지 않습니다 |
3FH(63) |
인쇄 파일 취소됨 |
40H(64) |
네트워크 이름이 삭제되었습니다 |
41H(65) |
네트워크 접근이 거부되었습니다 |
42H (66) |
잘못된 네트워크 장치 유형 |
43H (67) |
네트워크 이름을 찾을 수 없습니다 |
44시간(68) |
네트워크 이름 제한을 초과했습니다 |
45H (69) |
net BIOS 세션 제한을 초과했습니다. |
46H(70) |
파일 공유가 일시적으로 중단되었습니다 |
47H (71) |
네트워크 요청이 수락되지 않았습니다 |
48시간(72) |
인쇄 또는 디스크 리디렉션이 일시 중지되었습니다. |
49H-4FH |
예약된 |
50H(80) |
파일이 이미 존재합니다 |
51H(81) |
예약된 |
52H(82) |
디렉토리를 만들 수 없습니다 |
53H(83) |
INT 24H에서 실패(중대한 오류) |
54H(84) |
리디렉션이 너무 많아요 |
55H(85) |
중복 리디렉션 |
56H(86) |
잘못된 비밀번호 |
57H(87) |
잘못된 매개 변수 |
58H(88) |
네트워크 장치 오류 |
59H(89) |
네트워크에서 지원되지 않는 기능입니다. |
5AH(90) |
필수 시스템 구성 요소가 설치되지 않았습니다 |
BH = 오류 클래스
01시 |
리소스(예: 저장소 또는 핸들)가 부족한 경우 |
02시 |
오류가 아니라면 종료될 것으로 예상되는 일시적인 상황(예: 파일의 잠긴 영역)입니다. |
03시 |
권한 문제라면 |
04시 |
시스템 소프트웨어 내부 오류가 있는 경우 |
05시 |
하드웨어 장애가 발생한 경우 |
06시 |
시스템 소프트웨어 오류가 활성 프로세스의 오류가 아닌 경우(예: 구성 파일 누락) |
07시 |
응용 프로그램 오류인 경우 |
08시 |
파일이나 항목을 찾을 수 없는 경우 |
09시 |
파일이나 항목이 잘못된 유형이나 형식인 경우 |
0AH(10) |
파일이나 항목이 잠긴 경우 |
0비에이치(11) |
드라이브에 잘못된 디스크가 있거나, 디스크의 잘못된 위치 또는 저장 매체에 문제가 있는 경우 |
0CH (12) |
항목이 이미 존재하는 경우 |
0DH(13) |
알 수 없는 오류 |
BL = 권장 조치
01시 |
적절한 횟수만큼 재시도한 다음 사용자에게 중단 또는 무시를 선택하라는 메시지를 표시합니다. |
02시 |
재시도 사이에 지연 시간을 두고 적절한 횟수만큼 재시도한 다음 사용자에게 중단 또는 무시를 선택하도록 요청합니다. |
03시 |
사용자로부터 올바른 정보를 얻습니다(일반적으로 잘못된 파일 이름이나 장치 사양으로 인해 발생) |
04시 |
정리 작업을 통해 응용 프로그램을 중단합니다(즉, 가능한 한 순서대로 프로그램을 종료합니다: 잠금 해제, 파일 닫기 등). |
05시 |
정리하지 않고 즉시 종료합니다. |
06시 |
오류 무시 |
07시 |
오류 원인을 제거하기 위해 사용자 개입 후 다시 시도하세요. |
CH = 오류 위치
01H 알 수 없음
02H 블록 장치(디스크 또는 디스크 에뮬레이터)
03H 네트워크
04H 직렬 장치
05H 메모리
ES: DI = 디스크의 ASCIIZ 볼륨 레이블
삽입, AX = 0022H (잘못된 디스크 변경)
댓글:
이 함수는 이전에 실패한 INT 21H 함수 호출 이후의 자세한 오류 정보와 권장되는 시정 조치를 포함합니다.
INT 21H(0x21)
기능 5AH(0x5A 또는 90) --> 임시 파일 생성
호출: AH = 5AH
CX = 속성(비트를 결합할 수 있음)
DS: DX = 세그먼트: ASCIIZ 경로의 오프셋
반환값: 함수가 성공한 경우
캐리 플래그 = 클리어
AX = 핸들
DS: DX = 세그먼트: 완전한 ASCIIZ의 오프셋
경로명
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 기본 또는 지정된 디스크 드라이브의 현재 또는 지정된 디렉토리에 고유한 이름의 파일을 생성하고, 프로그램에서 파일에 대한 후속 액세스를 위해 사용할 수 있는 핸들을 반환합니다. 파일에 대해 생성된 이름도 프로그램에서 지정한 버퍼에 반환됩니다.
경로명의 요소가 존재하지 않거나 루트 디렉토리에 파일을 생성하는 중이고 루트 디렉토리가 가득 찬 경우, 함수는 실패합니다.
INT 21H(0x21)
함수 5BH (0x5B 또는 91) --> 새 파일 생성
AH = 5BH로 호출
CX = 속성(비트를 결합할 수 있음)
DS: DX = 세그먼트: ASCIIZ 경로명의 오프셋
반환값: 함수가 성공한 경우
캐리 플래그 = 클리어
AX = 핸들
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 지정되거나 기본 드라이브의 지정되거나 기본 디렉토리에 파일을 생성하고, 프로그램이 주어진 ASCIIZ 경로명에 대한 파일에 나중에 액세스할 때 사용할 수 있는 핸들을 반환합니다.
같은 이름과 경로를 가진 파일이 이미 존재하거나 지정된 경로의 요소가 존재하지 않거나 루트 디렉터리에 파일을 만들고 있고 루트 디렉터리가 가득 찼거나 사용자에게 충분한 액세스 권한이 없는 경우 이 함수는 실패합니다.
INT 21H(0x21)
기능 5CH(0x5C 또는 92) --> 파일 영역 잠금 또는 잠금 해제
AH = 5CH로 호출
AL = 00H 잠금 영역인 경우
01H 지역 잠금 해제 시
BX = 핸들
CX = 지역 오프셋의 높은 부분
DX = 영역 오프셋의 낮은 부분
SI = 지역 길이의 높은 부분
DI = 지역 길이의 낮은 부분
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 기능은 파일의 지정된 영역을 잠그거나 잠금 해제합니다. 이 기능은 파일 공유 모듈(예: SHARE.EXE)이 로드되지 않으면 사용할 수 없습니다.
INT 21H(0x21)
기능 5DH(0x5D 또는 93) --> 예약됨
INT 21H(0x21)
기능 5EH(0x5E 또는 94), 하위 기능 00H(0x00) --> 머신 이름 가져오기
AH = 5EH로 호출
알 = 00H
DS: DX = 세그먼트: 수신할 버퍼의 오프셋
끈
반환값: 함수가 성공한 경우
캐리 플래그 = 클리어
이름이 정의되지 않은 경우 CH = 00H
<> 00H 이름이 정의된 경우
CL = netBIOS 이름 번호(CH <> 0인 경우)
DX: DX = 세그먼트: 식별자의 오프셋(CH <> 0인 경우)
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 함수는 로컬 컴퓨터를 식별하는 ASCIIZ 문자열의 주소를 반환합니다. 이 함수 호출은 Microsoft 네트워크가 실행 중일 때만 사용할 수 있습니다.
INT 21H(0x21)
기능 5EH(0x5E 또는 94), 하위 기능 02H(0x02) --> 프린터 설정 문자열 설정
AH = 5EH로 호출
알 = 02H
BX = 리다이렉션 리스트 인덱스
CX = 설정 문자열의 길이
DS: SI = 세그먼트: 설정 문자열의 오프셋
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 특정 네트워크 프린터로 전송되는 모든 파일의 앞에 보낼 문자열을 지정하여, 서로 다른 네트워크 노드에 있는 사용자가 동일한 프린터에서 개별적인 작동 모드를 지정할 수 있도록 합니다.
INT 21H(0x21)
기능 5EH(0x5E 또는 94), 하위 기능 03H(0x03) --> 프린터 설정 문자열 가져오기
AH = 5EH로 호출
알 = 03H
BX = 리다이렉션 리스트 인덱스
ES: DI = 세그먼트: 수신할 버퍼의 오프셋
설정 문자열
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
CX = 프린터 설정 문자열의 길이
ES: DI = 세그먼트: 수신할 버퍼의 오프셋
설정 문자열
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 기능은 특정 네트워크 프린터에 대한 프린터 설정 문자열을 얻는 데 사용됩니다.
INT 21H(0x21)
함수 5FH(0x5F 또는 95), 하위 함수 02H(0x02) --> 리디렉션 목록 항목 가져오기
AH = 5FH로 호출
알 = 02H
BX = 리다이렉션 리스트 인덱스
DS: SI = 세그먼트: 16바이트 버퍼의 오프셋
로컬 장치 이름을 받다
ES: DI = 세그먼트: 128바이트 버퍼의 오프셋
네트워크 이름을 받다
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
BH = 장치 상태 플래그
비트 0 = 장치가 유효한 경우 0
= 유효하지 않으면 1
BL = 장치 유형
03H, 프린터의 경우
04H, 운전 중이라면
CX = 저장된 매개변수 값
DX = 파괴됨
BP = 파괴됨
DS: SI = 세그먼트: ASCIIZ 로컬의 오프셋
장치 이름
ES: DI = 세그먼트: ASCIIZ 네트워크의 오프셋
이름
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 로컬 논리 이름을 네트워크 파일, 디렉토리 또는 프린터와 연관시키는 시스템 리디렉션 목록을 검사할 수 있게 해줍니다. 이 함수 호출은 Microsoft Networks가 실행 중이고 파일 공유 모듈이 로드된 경우에만 사용할 수 있습니다.
INT 21H(0x21)
기능 5FH(0x5F 또는 95), 하위 기능 03H(0x03) --> 장치 리디렉션
AH = 5FH로 호출
알 = 03H
BL = 장치 유형
03H, 프린터의 경우
04H, 운전 중이라면
DS: SI = 세그먼트: ASCIIZ 로컬의 오프셋
장치 이름
ES: DI = 세그먼트: ASCIIZ 네트워크의 오프셋
이름 뒤에 ASCIIZ 비밀번호가 옵니다.
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
로컬 장치 이름을 네트워크 이름과 연결하여 네트워크에서 리디렉션을 설정합니다. 이 함수 호출은 Microsoft Networks가 실행 중이고 파일 공유 모듈(SHARE.EXE)이 로드된 경우에만 사용할 수 있습니다.
INT 21H(0x21)
기능 5FH(0x5F 또는 95), 하위 기능 04H(0x04) --> 장치 리디렉션 취소
AH = 5FH로 호출
알 = 04H
DS: SI = 세그먼트: ASCIIZ 로컬의 오프셋
장치 이름
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 하위 기능은 로컬 장치 이름과 네트워크 이름의 연결을 제거하여 이전 리디렉션 요청을 취소합니다. 이 함수 호출은 Microsoft Networks가 실행 중이고 SHARE.EXE와 같은 파일 공유 모듈이 로드된 경우에만 사용할 수 있습니다.
INT 21H(0x21)
기능 60H(0x60 또는 96) --> 예약됨
INT 21H(0x21)
함수 61H(0x61 또는 97) --> 예약됨
INT 21H(0x21)
함수 62H(0x62 또는 98) --> 프로그램 세그먼트 접두사(PSP) 주소 가져오기
호출: AH = 62H
반환값: BX = 프로그램 세그먼트의 세그먼트 주소
접두사
댓글:
이 함수는 현재 실행 중인 프로그램의 프로그램 세그먼트 접두사(PSP)의 세그먼트(문단) 주소를 얻습니다.
INT 21H(0x21)
함수 64H(0x64 또는 100) --> 예약됨
국제 21시
기능 65H(0x65 또는 101) --> 확장된 국가 정보 가져오기
AH = 65H로 호출
AL = 하위 함수
00H = 일반 가져오기
국제화 정보
02H = 대문자 포인터 가져오기
테이블
04H = 파일 이름에 대한 포인터 가져오기
대문자 표
06H = 정렬 테이블에 대한 포인터 가져오기
07H = 더블바이트 포인터 가져오기
문자 집합(DBCS) 벡터
BX = 관심 있는 코드 페이지(-1 = 활성)
CON 장치)
CX = 수신할 버퍼의 길이
정보 (>=5이어야 함)
DX = 국가 ID (-1 = 기본값)
ES: DI = 수신할 버퍼의 주소
정보
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
그리고 요청된 데이터는 호출 프로그램의 버퍼에 저장됩니다.
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이것은 지정된 국가 및/또는 코드 페이지에 대한 정보를 얻습니다. 정보 바이트에 대해 알아보려면 이전에 제공된 국제화 표를 참조하세요.
INT 21H(0x21)
함수 66H(0x66 또는 102) --> 코드 페이지 가져오기 또는 설정
AH = 66H로 호출
AL = 하위 함수
01H = 코드 페이지 가져오기
02H = 코드 페이지 선택
BX = 선택할 코드 페이지, AL = 02H인 경우
반환값: 함수가 성공한 경우
캐리 플래그 = 클리어
그리고 AL = 01H로 호출하면
BX = 활성 코드 페이지
DX = 기본 코드 페이지
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 현재 코드 페이지를 얻거나 선택합니다.
INT 21H(0x21)
함수 67H(0x67 또는 103) --> 핸들 수 설정
AH = 67H로 호출
BX = 원하는 핸들 수
반환값: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 현재 프로세스에서 핸들을 사용하여 동시에 열 수 있는 최대 파일 및 장치 수를 설정합니다.
INT 21H(0x21)
함수 68H (0x68 또는 104) --> 파일 커밋
AH = 68H로 호출
BX = 핸들
반환: 함수가 성공한 경우
캐리 플래그 = 클리어
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 기능은 지정된 핸들과 연관된 MS DOS의 내부 버퍼에 있는 모든 데이터를 장치에 물리적으로 쓰도록 강제합니다. 핸들이 파일을 참조하고 파일이 수정된 경우 파일의 루트 디렉토리 항목에 있는 시간 및 날짜 스탬프와 파일 크기가 업데이트됩니다.
INT 21H(0x21)
함수 69H(0x69 또는 105) --> 예약됨
INT 21H(0x21)
기능 6AH(0x6A 또는 106) --> 예약됨
INT 21H(0x21)
함수 6BH (0x6B 또는 107) --> 예약됨
내부 21H(0x21)
기능 6CH(0x6C 또는 108) --> 확장된 열린 파일
전화 : AH = 6CH
알 = 00N
BX = 오픈 모드
페이지(들) |
의미 |
0-2 |
액세스 유형
000 = 읽기 전용
001 = 쓰기 전용
010 = 읽기/쓰기 |
3 |
예약됨 (0) |
4-6 |
공개 모드
000 = 호환성
001 = 읽기/쓰기 거부(모두 거부)
010 = 쓰기 거부
011 = 읽기 거부
100 = 아무것도 거부하지 않음 |
7 |
상속
0 = 자식 프로세스가 핸들을 상속함
1 = 자식 프로세스가 핸들을 상속하지 않음 |
8-12 |
예약됨 (0) |
13 |
중요 오류 처리
0 = INT 24H 수행
1 = 프로세스에 오류 반환 |
14 |
쓰기-스루
0 = 쓰기를 버퍼링하고 지연할 수 있음
1 = 요청 시 물리적 쓰기 |
15 |
예약됨 (0) |
CX = 파일 속성(비트를 결합할 수 있음)
무시되고 열려 있는 경우 비트 유의도 표를 참조하세요 .
DX = 오픈 플래그
페이지(들) |
의미 |
0-3 |
파일이 존재하는 경우 동작
0000 = 오류
0001 = 파일 열기
0010 = 파일 바꾸기 |
4-7 |
파일이 존재하지 않을 경우의 동작
0000 = 실패
0001 = 파일 생성 |
8-15 |
예약됨 (0) |
DS:SI = segment:ASCIIZ 경로 오프셋
반환: m함수가 성공하면
캐리 플래그 = 클리어
도끼 = 손잡이
CX = 수행된 작업
1 = 파일이 존재하고 있었습니다
열렸다
2 = 파일이 존재하지 않습니다
만들어졌다
3 = 파일이 존재했고
교체하다
기능이 실패하면
캐리 플래그 = 설정
AX = 오류 코드
댓글:
이 함수는 지정된 ASCIIZ 경로에 대해 지정되거나 기본 드라이브의 지정되거나 기본 디렉토리에 있는 파일을 열거나 생성하거나 대체하고 프로그램이 이후에 파일에 액세스하는 데 사용할 수 있는 핸들을 반환합니다.
경로의 요소가 존재하지 않는 경우, 파일이 루트 디렉토리에 생성되었는데 루트 디렉토리가 가득 찬 경우, 파일이 생성되었는데 같은 이름과 읽기 전용 속성을 가진 파일이 지정된 디렉토리에 이미 존재하는 경우, 또는 사용자에게 충분한 액세스 권한이 없는 경우, 이 함수는 실패합니다.