프로그램 세그먼트 접두사

Program Segment Prefix

PSP(Program Segment Prefix)는 프로그램 상태를 저장하기 위해 DOS 시스템에서 사용되는 데이터 구조다.CP/M 운영체제의 Zero 페이지를 닮았다.PSP는 다음과 같은 구조를 가지고 있다.

오프셋 크기 내용물
00h-01h 2바이트(코드) CP/M-80 유사 종료(항상 INT 20h 포함)[1][2]
02h-03h 단어(2바이트) 프로그램에 할당된 메모리를 초과하는 첫 번째 바이트의 세그먼트
04시 바이트 내성적이다.
05h-09h 5바이트(코드) CP/M-80 유사 DOS 원호 입력 및 프로그램 세그먼트 크기[1][3]
0Ah-0Dh dword (4바이트) 이전 프로그램의 주소 종료(이전 INT 22시간)
어-11시 드워드 이전 프로그램의 주소 끊기(이전의 INT 23h)
12시-15분 드워드 이전 프로그램의 심각한 오류 주소(이전의 INT 24시간)
16시간-17시간 단어 상위 PSP 세그먼트(일반적으로 Command).COM - 내부)
18h-2Bh 20바이트 작업 파일 테이블(JFT)(내부)
2Ch–2Dh 단어 환경 세그먼트
2에-31시간 드워드 마지막 INT 21h 통화에 대한 SS:SP 입력(내부)
32h-33h 단어 JFT 크기(내부)
34시간-37시간 드워드 JFT에 대한 포인터(내부)
38h-3Bh 드워드 이전 PSP에 대한 포인터(DOS 3.3 이상에서 SHARE에 의해서만 사용됨
3장 3절 4바이트 내성적이다.
40h-41h 단어 반환할 DOS 버전(DOS 4 이상, DOS 5 이상에서 SETVER를 통해 변경 가능)
42h-4fh 14바이트 내성적이다.
50h-52h 3바이트(코드) DOS에 대한 Unix 유사 원호 입력(항상 INT 21h + RETF 포함)
53h-54h 2바이트 내성적이다.
55h-5Bh 7바이트 예약됨(첫 번째 FCB를 확장 FCB로 만드는 데 사용할 수 있음)
5Ch–6Bh 16바이트 미개봉 표준 FCB 1
6차-7시 20바이트 미개봉 표준 FCB 2(FCB 1이 열린 경우 덮어쓰기)
80시간 1바이트 명령줄의 바이트 수
81-FFH 127바이트 명령줄 테일(0Dh로 종료됨)[4][5]

PSP는 DOS 프로그램의 명령줄 인수를 얻기 위해 가장 자주 사용된다. 예를 들어, "FO" 명령어.EXE /A /F"는 FOO를 실행한다.'/A'와 '/F' 인수가 있는 EXE.

명령줄 길이에 대한 PSP 항목이 0이 아니고 환경 세그먼트에 대한 포인터가 0000h 또는 FFFFh가 아닌 경우 프로그램은 PSP에서 명령줄을 추출하기 전에 환경 변수 %CMDLINE%에서 명령줄을 먼저 검색해 보아야 한다.이렇게 하면 126자 이상의 명령줄을 애플리케이션에 전달할 수 있다.

PSP의 세그먼트 주소는 프로그램이 실행될 때 DS 레지스터에서 전달된다.또한 나중에 Int 21h 함수 51h 또는 Int 21h 함수 62h를 사용하여 결정할 수 있다.두 기능 모두 레지스터 BX의 PSP 주소를 반환한다.[6]

또는 에서 입니다.오프셋에 로드된 COM 프로그램100h위에 나열된 오프셋을 사용하는 것만으로 PSP를 직접 처리할 수 있다.오프셋000hPSP의 시작을 가리키며,0FFh끝점 등

예를 들어, 다음 코드는 명령줄 인수를 표시한다.

조직화하다100시간      ; .COM - ds를 사용하지 않음  ; INT 21h 하위 기능 9에서 문자열을 종료하려면 '
                
필요 xor bx,bx 영화를 찍다 bl,[80시간] cmp bl,세븐에 네. 퇴장하다 ; 오버플로 방지 영화를 찍다 바이트 [bx+81시간],'
$$SIDE_BOTTOM$$
    $$BOTTOM$$