2013-10-07 2 views
1

내가 PROGRAM.ASM을 말해봐 - 나는 데이터 세그먼트에서 다음과 같은 한 :8086 조립/MS-DOS는 명령 줄에서 파일 이름을 전달

.data 

Filename db 'file.txt', 0 
Fhndl dw ? 
Buffer db ? 

내가 'file.txt를'동적하기를 원하는 나는? 컴파일 된 후에는 PROGRAM.exe가 명령 줄을 통해 파일 이름을 받아 들일 수 있어야합니다.

c:\> PROGRAM anotherfile.txt 
EXECUTION GOES HERE 

어떻게 활성화합니까? 미리 감사드립니다.

답변

3

DOS는 Program Segment Prefix ("PSP")라는 레거시 구조에 명령 줄을 저장합니다. 그리고 저는 기존의을 의미합니다. 이 구조는 CP/M에서 이식 된 프로그램과 역 호환되도록 설계되었습니다.

PSP는 어디에 있습니까?

.COM 파일로 작성된 프로그램은 항상 ORG 100h으로 시작됩니다. 그 이유는 정확하게 .COM 프로그램의 경우 - PSP는 항상 코드 세그먼트의 시작 부분에 저장됩니다 (CS : 0h). PSP는 0FFh 바이트 길이이며 실제 프로그램 코드는 바로 그 다음에 시작됩니다 (CS : 100h에서).

.COM 형식의 핵심 특징은 모든 세그먼트 레지스터가 동일한 값으로 시작하고 COM 프로그램이 일반적으로 변경하지 않기 때문에 DS : 00h 및 ES : 00h에서 주소를 편리하게 사용할 수 있습니다.

.COM 프로그램에서 명령 줄을 읽으려면 CS : 80h (또는 해당 레지스터를 변경하지 않은 한 DS : 80h 등)에서 길이를 선택할 수 있습니다. 명령 줄은 CS : 81h에서 시작하여 PSP의 나머지 부분을 가져 와서 캐리지 리턴 (0Dh)으로 끝나기 때문에 명령 줄은 결코 126 바이트를 넘지 않습니다.

(명령 줄이 DOS에서 영원히 126 바이트 인 이유입니다. 우리 모두가 수 년 동안 원했던 사실에도 불구하고 WinNT가 명령 행에 액세스하는 데 다른 메커니즘을 제공하기 때문에 WinNT/XP/etc 커맨드 라인은이 크기 제한을 겪지 않습니다).

.EXE 프로그램의 경우 시작 코드 세그먼트가 메모리의 어느 위치 에나있을 수 있으므로 CS : 00h에 의존 할 수 없습니다. 그러나 프로그램이 시작될 때 DOS는 항상 기본 데이터 세그먼트의 기본에 PSP를 저장합니다. 따라서 시작시 DS : 00h 및 ES : 00h는 .EXE 및 .COM 프로그램 모두에 대해 항상 PSP를 가리 킵니다.

프로그램 시작시 PSP 주소를 추적하지 않고 DS와 ES를 모두 변경 한 경우 DOS에 언제든지 INT 21h, 62h 기능을 통해 언제든지 세그먼트 값을 제공하도록 요청할 수 있습니다. PSP 주소의 세그먼트 부분은 BX로 반환됩니다 (오프셋은 물론 0h 임).

관련 문제