장기: 메모리 관리 QuickBasic 및 기본 컴파일러

만료된 KB 콘텐츠 고지 사항

이 문서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 작성되었습니다. 따라서 이 문서는 “있는 그대로" 제공되며 더 이상 업데이트되지 않습니다.

요약

프로그래머가 어떻게 Microsoft QuickBasic 및 Microsoft 기본 컴파일러 정렬 메모리 쓰는 프로그램을 효율적으로 시스템 리소스의 사용을 이해 하려고 할 수 있습니다. QuickBasic 언어 프로그램 코드 및 다양 한 데이터 형식 및 데이터를 관리할 수 있도록 모듈식 코드 구문을 제공 합니다.

자세한 내용

이 문서에서는 다음 항목을 다룹니다.


  1. 코드 관리


    1. 모듈식 프로그래밍
    2. 지원 모듈에서 모듈 수준에서 무엇이
    3. 공용, 공유, 공통 공유, 공유 흐리게
  2. 데이터 관리


    1. $DYNAMIC 및 $STATIC metacommands
    2. 거 대 한 배열
부록 A는이 문서에서 다루는 주제를 설명 하기 위해 코드 예제를 포함 합니다.


부록 B에 설명 된. A 부록 프로그램 예제에서는 연결 될 때 만든 파일을 매핑하십시오. 링크 맵을 사용 하 여 각 모듈 코드 64 K 한계에 도달할 정도 확인 하 고 종료 방법에. EXE 프로그램 정적 변수는 DGROUP에서 64 K 제한에 얻는.


부록 C 및 D 다음 세 가지 다른 환경에서 프로그램을 실행 하기 위한 메모리 매핑 자세히 설명: 해당 QB. 컴파일된 EXE 편집기입니다. EXE 프로그램을 런타임 모듈을 사용 하 고 있습니다. EXE 독립 실행형 옵션으로 컴파일한입니다.

정의

"모듈" 기본 프로시저를 포함 하는 개별 소스 파일로 정의 됩니다.


"모듈 수준 코드" SUB 외부에 있는 모듈의 문으로 정의 됩니다... END SUB, 함수... 끝 함수 또는 DEF FN... DEF 정의 블록을 종료 합니다.


"지원 모듈" 추가 SUB 또는 함수 프로시저를 포함 하는 주 모듈에서 별도 소스 파일입니다.

코드 관리

모듈식 프로그래밍

모듈식 프로그래밍에서는 프로그램 (즉,: SUB 또는 함수 프로시저를 포함 하는 별도 소스 파일) 별도 모듈로 분할 합니다. 이렇게 하는 이유는 다음과 같습니다.


  1. 작성 한 후 코드 블록을 모듈로, 향후 프로젝트에 쉽게 통합할 수 있습니다.
  2. 디버깅 하는 것이 더 쉽습니다. 문제와 훨씬 더 빠르게 찾을 수 있는 프로그램의 특정 영역에 포함 될 수 있습니다.
  3. 컴파일러 (BC. EXE) 및 환경 (QB. EXE) 당 모듈 코드 64 K 제한 되어 있습니다. 모듈식 스타일을 프로그래밍 하면 프로그램의 일부인 경우에 모든 모듈 이후 64 K 보다 큰 프로그램을 만들 수 있습니다 크기가 64 K 최대 수 있습니다.
프로그램이 큰 경우, 여러 모듈로 나눌 수 필요할 수 있습니다. 주 모듈에서 SUB 프로시저나 FUNCTION 프로시저를 중단 하 고 지원 모듈에서을 배치 하 여 쉽게 수행 됩니다. 이러한 모듈은 다음 BC와 별도로 컴파일됩니다. EXE와 다음 예제 에서처럼 기본 모듈에 연결 합니다.


Main.BAS로 3 개의 분리 되는 프로그램을 고려해 야 합니다.


  1. 주입니다. BAS (있는 외부 프로시저를 호출 하는)
  2. MODULE2입니다. BAS (을 SUB 또는 함수 프로시저를 포함 하는)
  3. MODULE3입니다. BAS (을 SUB 또는 함수 프로시저를 포함 하는)
다음 개체 파일을 생성 하기 위해 각 개별적으로 컴파일된 모듈은 3가:


  1. BC 주입니다. BAS; 주--->. OBJ
  2. BC MODULE2입니다. BAS; MODULE2--->. OBJ
  3. BC MODULE3입니다. BAS; MODULE3--->. OBJ
실행 파일을 생성 하기 위해 (. EXE) 프로그램, 다음 명령줄을 사용 합니다.
    LINK Main.OBJ+Module2.OBJ+Module3.OBJ; ---->  Main.EXE
Main.EXE 완성 된 실행 프로그램입니다. 컴파일하면 QuickBasic의 환경 (QB. EXE) 환경에서 자동으로 각 모듈을 컴파일하고 링크를 생성 하는 동일한. OBJ 파일 및 실행 프로그램을 완료 합니다.


확인 하는. EXE 프로그램을 사용 하면 Qb입니다. EXE 환경에서 다음 작업을 수행 합니다.


  1. 실행 메뉴를 선택 합니다.
  2. 만들기 EXE 파일 선택... 옵션.
  3. 독립 실행형 파일을 만들 독립 실행형 EXE 파일 옵션을 선택 합니다. 이 옵션을 선택 하지 않은 경우 프로그램 BRUN4x.EXE 런타임 모듈 실행 중에 있이 필요 합니다.
  4. ENTER 키를 누릅니다.
QuickBasic 환경에서 쉽게는 아래에 더 자세히 설명 하 여 다음과 같은 작업을 수행할 수 있습니다.


  1. 잠수함에 대 한 새 모듈 만들기
  2. 잠수함 및 모듈 편집
  3. 잠수함 삭제
  4. 한 모듈에서 다른 모듈 Sub 이동
QB. 잠수함을 위한 별도 모듈 (소스 파일) 만들려면 EXE 실행.


  1. 파일 메뉴를 선택 합니다.
  2. 파일 만들기... 옵션.
  3. 모듈 이름을 입력 합니다.
  4. ENTER 키를 누릅니다.
파일을 만들 다음 이름으로 지정 하 고 다른 모듈을 사용 하 여 메모리에 됩니다. 로드 된 모듈을 모두 저장 하려면 다음을 수행 합니다.


  1. 파일 메뉴를 선택 합니다.
  2. 모두 저장 옵션을 선택 합니다.
모듈을 함께 저장 하는 경우 QuickBasic 파일 형식은 (확장명이. MAK) 하은 주 모듈과 주에 사용 되는 모듈입니다. 에 있는 모든 모듈을 한 번에 로드 하려면 다음을 수행 합니다.


  1. 파일 메뉴를 선택 합니다.
  2. 열린 프로그램이 선택 옵션입니다.
  3. 파일을 열 수로 프로그램의 주 모듈을 선택 합니다.
확인 하 고 편집할 수 있도록 잠수함 선택 하려면 다음을 수행 합니다.


  1. 보기 메뉴를 선택 합니다.
  2. 해당 잠수함 선택... 옵션입니다.
  3. 모듈 또는 편집 하려는 SUB 강조 표시 합니다.
  4. Tab 편집에서 활성, 아래로 또는 분할에서 편집을 수행.
  5. ENTER 키를 누릅니다.
SUB를 삭제 하려면 다음을 수행 합니다.


  1. 보기 메뉴를 선택 합니다.
  2. 해당 잠수함 선택... 옵션입니다.
  3. 삭제할 SUB을 강조 표시 합니다.
  4. 아래로 삭제 옵션을 탭.
  5. ENTER 키를 누릅니다.
SUB는 다른 단원으로 이동 하려면 다음을 수행 합니다.


  1. 보기 메뉴를 선택 합니다.
  2. 해당 잠수함 선택... 옵션입니다.
  3. 이동할 SUB을 강조 표시 합니다.
  4. 아래로 이동 옵션을 탭.
  5. ENTER 키를 누릅니다.
  6. 에 있어야 SUB 모듈을 선택 합니다.
  7. ENTER 키를 누릅니다.
QB는 사용에 대 한 자세한 내용은. EXE 환경 버전, 4.50 "Microsoft QuickBasic:: 학습을" 사용 설명서를 참조 하거나 버전 4.00 및 4.00b 및 기본 컴파일러 버전 6.00 및 6.00b에 대 한 "Microsoft QuickBasic 4.0:: 학습 하 고" 사용 설명서를 참조 하십시오.

지원 모듈에서 모듈 수준에서 무엇이

개체를 생성 하는 지원 모듈을 컴파일할 때 (. 실행 파일을 만드는 기본 모듈에 연결 된 OBJ) 파일입니다. 주 모듈의 모듈 수준 코드는 QuickBasic에서 직접 실행 하는 유일한 코드입니다. 지원 모듈 모듈 수준 코드는 CALLed, 실행 또는 CHAINed 수 없습니다. 이 모듈 수준 코드 지원 모듈의 대해서만 사용 됩니다.


  1. 이벤트 또는 오류 트래핑 처리기
  2. Metacommands
  3. SHARED 문, DIM 및 일반적인 정의 입력 합니다.
[어디에 이벤트 의미 ON KEY(n), ON COM(n), ON TIMER(n).] 하위 프로그램 프로시저 내에 이벤트 GOSUB 및 ON ERROR GOTO 트래핑 문을 배치할 수 있습니다. 그러나, 선 또는 이벤트 또는 오류 트래핑 GOTO 또는 GOSUB 대상이 줄 레이블을 해당 하위 프로그램 모듈에 모듈 수준 코드에 있어야 합니다. QuickBasic 없도록 GOTOs 또는 GOSUBs을 하위 프로그램에서 하위 프로그램, 또는 다른 모듈 및 QuickBasic 사용만 ON 이벤트 GOSUB 및 ON ERROR GOTO 문이 있는 하위 프로그램 모듈 수준 코드를 이동 하려면 때문입니다.


모듈 수준에서 해당 컴파일러 metacommands (REM $INCLUDE, REM $STATIC 및 $DYNAMIC REM) 사용할 수도 있습니다. REM $INCLUDE 모듈로 컴파일 타임에 여분의 소스를 붙여 넣습니다. REM $DYNAMIC 및 $STATIC REM 다음 배열 $DYNAMIC (실행 중에 할당 됨) 또는 $STATIC (컴파일 타임에 할당 됨)를 선언 합니다.


유형을 사용할 수 있습니다... 모듈 수준 코드에서 끝 유형, DIM, 공통 공유 및 문입니다. 변수 및 배열이 모듈 수준에서 공통 공유 문을 사용 하 여 모듈 간에 공유할 수 있습니다.

공통, 공통 공유, 공유 및 공유 DIM

SHARED 문 (이들을 매개 변수로 전달) 없이 해당 모듈 주 모듈 수준에서 선언 된 변수를 SUB 프로시저나 FUNCTION 프로시저 액세스를을 제공 합니다. 지원 모듈에 선언 된 변수를 액세스를 부여 하지 않습니다.


일반적인 문은 모듈 간에 모듈 수준에서 사용 가능한 변수 보내기 때문. (즉, 일반적인 공유 됨) 일반적인 문의 SHARED 특성은 하위 프로그램 또는 함수를 사용 하 여 변수를 공유 해야 합니다. 공통 및 공통 공유 문은 변수 목록을 각 모듈의 공용 공유 및 공통 문의 형식을 일치 해야 있습니다.


공용 (또는 공통 공유) 문을 사용 하 여, 정적 및 동적 배열 다르게 치수 처리 됩니다. 정적 배열을 공통 공통 해당 문 사용 하 여 모든 모듈의 치수를 지정 하기 전에 일반적인 문 이어야 합니다. 동적 배열을 공통 단순히 기본 모듈에 치수를 지정 후 일반 문 및 모든 지원 모듈에서 치수화 될 해야.


SHARED 문 및 공유 DIM 문을 사용 하 여 두 가지 차이점을 가지.


  1. 변수에 액세스할 수 있도록 모든 하위 프로그램으로 모듈에서, 모듈 수준에서 DIM 공유를 사용 합니다.
  2. 특정 한 하위 프로그램 모듈 수준 변수 공유에 있는 하위 프로그램 SHARED 문에서 변수를 넣습니다. SHARED 문은 해당 하위 프로그램 중 첫 번째 줄 바로 뒤에 이동합니다.

데이터 관리

$DYNAMIC 및 $STATIC 배열

배열을 저장 하기 위한 기본 설정은 모든 배열 (기본 데이터 세그먼트) DGROUP에 저장 하는 REM $STATIC입니다. Basic의. EXE 프로그램 DGROUP 64 K로 제한 됩니다. 정적 배열을 사용 하는 경우 얻을 수 있습니다 DGROUP 더 많은 메모리 배열 하 여 동적 far 힙으로 이동입니다. 배열을 동적으로 만들려면 metacommand REM $DYNAMIC, 후 배열의 차원 또는 그 아래 첨자로 변수는 배열의 차원.


모든 동적 배열 가변 길이 문자열 배열 제외한 far 힙 저장 됩니다. 항상 문자열, 가변 길이 문자열 배열 및 간단한 변수 DGROUP에 저장 됩니다. far 힙 문자열을 저장 하는 동적 배열을 고정 길이 문자열 치수 해야 있습니다. 로 동적 배열이 고정된 길이 문자열을 치수 그렇지 않으면 수 도달한를 DGROUP에서 64 K 제한 되는 저장소 공간을 늘릴 수 있습니다.

거 대 한 배열

거 대 한 배열은 배열 64 K를 초과 하는. 거 대 한 배열, 사용 하는 경우는 QB를 호출 해야 합니다. EXE 편집기 및 Bc입니다. EXE /AH 옵션 사용 하 여 컴파일러입니다. 동적 배열 변수 배열 아래 첨자 또는 위 metacommand REM $DYNAMIC 거 대 한 배열에서 치수화 될 해야 합니다. /AH 옵션 동적 배열을 사용자 정의 형식, 고정 길이 문자열 및 숫자 데이터 사용 가능한 메모리가 모두 차지할 수 있습니다.


거 대 한 배열의 단일 요소가 바이트 수는 2의 거듭제곱 메모리 낭비를 방지 하기 위해 및 배열 아래에 설명 된 대로 128 K 보다 더 큰 수를 사용할 수 있도록 가능 해야 합니다.


far 힙의 64 K 경계에서 분할할 수 없는 단일 배열 요소 (또는 레코드)은 수 있도록 제한을 두어에 인접 하 여 거 대 한 배열 공간이 할당 됩니다. 레코드 크기가 2의 거듭제곱이 아닌, 배열의 각 요소에 정확히 64 K 기본 세그먼트 위에 경계에 걸쳐 분할 되는 높은, (VARSEG 함수에 의해 반환 된) 배열의 기본 세그먼트 주소에 상대적인 오프셋에서 배열 할당 됩니다. 값은 배열의 첫 번째 요소에 대 한 하나 함수에서 반환 된 다음 모두 배열 오프셋 및 또한 far 힙 만든 간격 크기를 나타냅니다. 이러한 격차 far 힙 조각 및 낭비 된, 사용 되지 않는 메모리. 간격의 크기 (65536)과 같은 MOD (배열 레코드 크기)입니다. [최악의 경우 격차까지 사용 가능 (배열 레코드 크기) 크기에 1을 뺀 값입니다.]


배열 요소 2의 거듭제곱 크기가 있는 경우 128 K 보다 더 큰 하는 거 대 한 배열 할당 "아래 첨자 범위를 벗어났습니다." 오류가 발생 합니다. 128 K 2의 거듭제곱이 요소 크기가 있어야 것 보다 더 큰 배열 (2, 4, 8, 16, 32, 64, 등), 배열을 연속적으로 저장 되 고 64 K 경계에서 분할할 수 없는 단일 배열 요소 수입니다.


QuickBasic 메모리 관리의 마지막 주요 측면은 QuickBasic 이동할 수 메모리에서 문의 문을 런타임에 동적 배열 가변 길이 문자열을 가변 길이 문자열 배열 수 있는 메모리의 효율적인 사용을 시도 하는. (다른 변수에 있는 EXE 로드 시에 결정 된 고정된 된 위치입니다.) 또한 체인 문을 수행 하면, 일반적인 블록에서 전달 된 데이터가 이동할 수 있습니다. 즉, 결과의 하나, VARSEG, SADD 함수 또는 하나 $를 항상 사용 해야 바로 다음 함수가 호출 됩니다.

부록 A: 샘플 프로그램

이 샘플 프로그램을이 문서에서 다루는 항목은 보여 줍니다. 이 프로그램 차원 배열 하 고 하위 프로그램 간에 변수 전달 방법의 예를 제공 합니다. 프로그램 각 정의 하는 한 하위 프로그램 두 개의 모듈로 구성.

주 모듈 (EXAMPL1. BAS)

DECLARE SUB OtherModSub ()DECLARE SUB Subdemo ()

TYPE PowerOfTwo
I AS INTEGER ' 2 Bytes
L AS LONG ' 4 Bytes
S AS SINGLE ' 4 Bytes
D AS DOUBLE ' 8 Bytes
St AS STRING * 14 ' 14 Bytes

END TYPE ' 32 Bytes Total, a power of 2, 2^5

REM $STATIC
DIM A(100) AS INTEGER ' Static array, stored in DGROUP.

COMMON SHARED A() AS INTEGER ' Share the variables with the other
COMMON SHARED B AS STRING * 20 ' module and its SUBprograms.
COMMON SHARED X() AS INTEGER

REM $DYNAMIC
DIM X(100) AS INTEGER ' Dynamic array, stored in far heap.
DIM PTwo(4000) AS PowerOfTwo ' Dynamic huge array, stored in far heap
' Each element is a power of two, 2^5.

DIM NonFixedLen(10) AS STRING ' Dynamic array, but since it is not
' fixed length it is stored in DGROUP.

REM $STATIC
DIM SHARED M(100) AS LONG ' These variables are shared with all
DIM SHARED Equals AS STRING * 10 ' the SUBprograms in this module,
' and are stored in the DGROUP.

Num = 40

DIM DynArray(Num) AS SINGLE ' The array is dynamic since it is
' DIMensioned with a variable, so
' it is stored in far heap.

Plus$ = " + "
Equals = " = "
M(1) = 7
A(1) = 4

CALL Subdemo ' CALLs the SUBprogram of this module.
CALL OtherModSub ' CALLs the SUBprogram of the support module.
END

'SUBprogram of the Main Module:

SUB Subdemo

SHARED Plus$, NonFixedLen() AS STRING, Num

PRINT STR$(Num) + Plus$;
PRINT STR$(M(1))+ Equals + STR$(A(1));
A(1) = M(1)


END SUB

지원 모듈 (EXAMPL2. BAS)

REM $STATIC
DIM A(100) AS INTEGER ' Only the static array is DIMensioned
COMMON SHARED A() AS INTEGER ' before the COMMON SHARED statement.
COMMON SHARED B AS STRING * 20
COMMON SHARED X() AS INTEGER ' The dynamic array is only DIMensioned
' in the main module.

Panic: ' The label for ON ERROR has to be at
resume next ' the module level.


' SUBprogram of the Support Module:

SUB OtherModSub
PRINT A(1)
ON ERROR GOTO Panic
END SUB

부록 B: 링크입니다. 맵 파일 설명

다음은 한. 부록 A의에서 프로그램 예제에서는 연결 될 때 만든 맵 파일입니다. 오류로 인해. 성공적인 링크에서 맵 파일에 거리 모듈의 코드 세그먼트가 64 K 코드 제한을 도달 하 고 전체에 대 한 정적 변수를 종료 하는 방법 보여 줍니다. EXE 프로그램의 DGROUP에서 64 K 제한에 도달 하는. 프로그램의 목록을 지도 생성 하려면, 다음 예제와 같이 LINK 명령 중 세 번째 인수의 맵 파일 이름을 포함:
   LINK EXAMPL1.OBJ+EXAMPL2.OBJ,,EXAMPLE.MAP;
링크에 대 한 메모입니다. 추가 표시 지도 아래와 같습니다.


  1. EXAMPL1_CODE는 EXAMPL1에 대 한 코드입니다. BAS입니다.
  2. EXAMPL2_CODE는 EXAMPL2에 대 한 코드입니다. BAS입니다.
  3. 각 모듈의 코드 세그먼트는 64k 보다 작은 것으로 했습니다. 코드 세그먼트가 64 K 가깝게 꽉, 둘 이상의 모듈에 모듈을 해제. 코드 세그먼트 길이 찾으려면 길이 열에서 찾습니다. 예를 들어, EXAMPL1에 대 한 코드 세그먼트의 길이입니다. BAS는 10 진수 표시법으로 346 15A 16 진수 바이트입니다.
  4. FAR_MSG 오류 메시지의 텍스트를 포함 하는 먼 관리 그룹입니다. Far 힙 아닙니다. Far 힙 런타임에 할당 됩니다.
  5. 하단의 링크 맵 원본 섹션에 따라 DGROUP 있는 단락 주소 06DC 16 진수, 0의 오프셋을 사용 하 여 06DC:0에서 시작 됩니다. 이것은 (단락 16 바이트 포함) 이후 바이트 주소 06DC0 16 진수 동일 합니다. 따라서이 예에서 DGROUP 시작 BR_DATA 시작 되는 위치입니다.
  6. DGROUP는 스택의 주소 Stop에서 끝납니다.
  7. 얼마나 큰 프로그램의 DGROUP 되는지 확인 하십시오 스택의 주소 중지 하 고 해당 DGROUP 첫 번째 데이터 요소의 시작 주소를 뺍니다. 예를 들어, 프로그램의 DGROUP 크기가 7F9F 16 진수 11DF 16 진수 (4575) 바이트와 같은 6DC0 16 진수.
  8. 모든 주소에 해당 합니다. 시작에 상대적인 지도 하는. EXE 프로그램을 사용 합니다. 절대 로드 주소는 런타임에만 DOS에 의해 결정 됩니다. VARSEG 및 하나 문 용도 프로그램에서 런타임 시 변수가 절대 주소를 표시 합니다.

EXAMPLE.MAP

 Start  Stop   Length Name                   Class
00000H 00159H 0015AH EXAMPL1_CODE BC_CODE
00160H 001C1H 00062H EXAMPL2_CODE BC_CODE
001C2H 03931H 03770H CODE CODE
03932H 03A0CH 000DBH INIT_CODE CODE
03A10H 041B2H 007A3H _TEXT CODE
041C0H 065EFH 02430H EMULATOR_TEXT CODE
065F0H 065F0H 00000H C_ETEXT ENDCODE
065F0H 065F7H 00008H FAR_HDR FAR_MSG
065F8H 06C44H 0064DH FAR_MSG FAR_MSG
06C45H 06C46H 00002H FAR_PAD FAR_MSG
06C47H 06C47H 00001H FAR_EPAD FAR_MSG
06C50H 06DBFH 00170H EMULATOR_DATA FAR_DATA

06DC0H 06DC0H 00000H BR_DATA BLANK
06DC0H 06DEFH 00030H BR_SKYS BLANK
06DF0H 06EFBH 0010CH COMMON BLANK
06EFCH 070E3H 001E8H BC_DATA BC_VARS
070E4H 070E9H 00006H NMALLOC BC_VARS
070EAH 070EAH 00000H ENMALLOC BC_VARS
070EAH 070EAH 00000H BC_FT BC_SEGS
070F0H 0710FH 00020H BC_CN BC_SEGS
07110H 07122H 00013H BC_DS BC_SEGS
07124H 07124H 00000H BC_SAB BC_SEGS
07124H 0712BH 00008H BC_SA BC_SEGS
0712CH 0712FH 00004H BC_SAE BC_SEGS
07130H 07345H 00216H _DATA DATA
07346H 0761FH 002DAH _BSS DATA
07620H 0771CH 000FDH BR_DATA DATA
0771EH 0771EH 00000H XIB DATA
0771EH 07741H 00024H XI DATA
07742H 07742H 00000H XIE DATA
07742H 0774DH 0000CH DBDATA DATA
0774EH 0775BH 0000EH CDATA DATA
0775CH 0775CH 00000H XIFB DATA
0775CH 0775CH 00000H XIF DATA
0775CH 0775CH 00000H XIFE DATA
0775CH 0775CH 00000H XPB DATA
0775CH 0775CH 00000H XP DATA
0775CH 0775CH 00000H XPE DATA
0775CH 0775CH 00000H XCB DATA
0775CH 0775FH 00004H XC DATA
07760H 07760H 00000H XCE DATA
07760H 07760H 00000H XCFB DATA
07760H 07760H 00000H XCF DATA
07760H 07760H 00000H XCFE DATA
07760H 0779FH 00040H CONST DATA
077A0H 077A0H 00000H BC_DATA BC_DATA
077A0H 077A0H 00000H XOB BSS
077A0H 077A0H 00000H XO BSS
077A0H 077A0H 00000H XOE BSS
077A0H 07F9FH 00800H STACK STACK

Origin Group
06DC:0 DGROUP
065F:0 FMGROUP
Program entry point at 03A1:00C8

부록 c:를 QuickBasic 4.00, 4.00b, 4.50의 배열을 저장 하 고

차이가 한 스토리지 배열에서에서 프로그램을 컴파일할 때 실행 합니다. QuickBasic 버전 4.00, 4.00b, 및 4.50 환경 (QB EXE 파일 및 프로그램 실행. EXE)입니다. QB. EXE 환경 배열을 정적 가변 길이 문자열의 구성에 공통 되지 않습니다, not (DGROUP, 다음과 같이 대신 far 힙 저장 됩니다. EXE 프로그램)입니다.


이 프로그램을 실행할 따라 프로그램의 메모리 관리를 변경 합니다.


(QB 4.00, 4.00b, 또는 4.50 QuickBasic 환경 내에서 실행 되는 프로그램에 따라서. EXE) 배열은 다음과 같이 저장 됩니다.


  1. 공통 모든 $STATIC 배열 DGROUP에 저장 하 고 거의 주소로 참조할 수 있습니다.
  2. 모든 배열 가변 길이 문자열 DGROUP에 저장 되며 고 거의 주소로 참조할 수 있습니다.
  3. 다른 모든 배열은 먼 개체로 저장 되 고 먼 주소가 있어야 합니다. 이 일반적인 문에서 없는 $STATIC 배열을 포함 하 고 이러한 배열은 $DYNAMIC 배열 같은 메모리에 이동할 수 있습니다.
QuickBasic 4.00, 4.00b, 및 4.50 프로그램을 컴파일할 때 실행 됩니다. EXE 파일, 배열은 다음과 같이 저장 됩니다.


  1. 모든 $STATIC 배열 DGROUP에 저장 하 고 거의 주소로 참조할 수 있습니다.
  2. 모든 $DYNAMIC 배열을 가변 길이 문자열 DGROUP에 저장 되며 고 거의 주소로 참조할 수 있습니다.
  3. 다른 모든 $DYNAMIC 배열은 먼 개체로 저장 됩니다.

부록 D: 메모리 맵

이 부록에는 한 일반 메모리 맵 및 세 가지 자세한 런타임 메모리 맵을 포함합니다.

일반 메모리 다이어그램

다음 다이어그램은 요약 방법을 QuickBasic 컴파일된 프로그램 실행 중에 메모리에 로드 됩니다.
          High Memory (640K maximum)
+-----------+
| | The far heap stores dynamic arrays. The far
| (Far) | heap consists of the rest of high memory
| Heap | available after MS-DOS and the Basic
| | program's DGROUP segment and code
--- +-----------+ segment(s) are allocated.

| | | The stack is used to store temporary data,
| | Stack | such as variables that are passed to a
DGROUP | | subprogram procedure. The default stack
Up to |- - - - - -| size is 2K.
64K | | The DGROUP (default data segment) is used
| | (Near) | to store all static arrays, strings,
| | Data | simple variables, and the stack. DGROUP
--- +-----------+ can be up to 64K in size.
:
+-----------+
| Code | The code segments store the executable code.
| Segments | Each module can have up to 64K for its
+-----------+ code segment.
Low Memory

다음 그림 1, 2 및 3 런타임 시 코드 및 메모리에서 데이터 정렬을 더 자세히 설명합니다.

그림 1

첫 번째 그림 (아래)에 QB에 프로그램을 실행 하는 경우 런타임 메모리 맵을 보여 줍니다. EXE 버전 4.x 환경:
                   +-------------+
| Quick |
| Library |
+-------------+
|Communication| User-specified size
| buffers |
+-------------+
| | This area contains items, such as
| FAR heap | large/huge arrays and user code,
| | dynamic arrays.
+-------------+

User Data ------->Run-time heap| Files buffers, etc.
End DS:xxxx +-------------+
| String heap |
+-------------+
| User Program|
DGROUP | Data |
+-------------+
UP to | User Stack |
64K +-------------+
| Quick Lib |
| Data |
+-------------+
| QuickBasic |
User Data | Static |
Start DS:0 ------->| Data |
+-------------+
| QuickBasic | QB.EXE
Low Memory ------->| Code |
+-------------+
| MS-DOS | MS-DOS Operating System
+-------------+
0000:0000 ------->

위의 그림 1: QB의 메모리 맵을. EXE 4.x 환경

그림 2

별도 컴파일 (만들기 EXE 파일...) 메서드를 사용 하 여 런타임 모듈 BRUN4x.EXE를 사용할 때 나타나는 런타임 메모리 구조를 표시 하는 두 번째 그림 (아래):
                   +-------------+
| BRUN4x.EXE | Separately loaded run-time code
+-------------+
|Communication| User-specified size
| buffers |
+-------------+
| | This area holds less-frequently-
| | used items, such as dynamic
| FAR heap | arrays, the user environment
| | table.
| |
| |
+-------------+
User Data ------->Run-time heap|
End DS:xxxx +-------------+
| String heap |
+-------------+
| User Stack | Preset to 2K
+-------------+
| Named | Named COMMON areas
| COMMON |
DGROUP +-------------+

| BC_DATA | User program variables
Up to +-------------+
64K | BC_CONST | User program constants
+-------------+
| Blank COMMON|
+-------------+
| _DATA | QuickBasic run-time data areas,
User Data | CONST | used during user code execution
Start DS:0 ------->| _BSS |
+-------------+
| User Code | User program separately linked
Low Memory ------->| | with BRUN4x.LIB
+-------------+
| MS-DOS | MS-DOS Operating System
+-------------+
0000:0000 ------->

위의 그림 2: BRUN4x.EXE 런타임 모듈 메모리에 대 한. EXE

그림 3

스탠드-실행형 라이브러리 (BCOM4x.LIB) 옵션 사용 하면 별도 컴파일 (만들기 EXE 파일...) 메서드를 사용 하 여이 세 번째 그림 (아래) 런타임 메모리 맵이 보여 줍니다.
                   +-------------+
|Communication| User specified size
| buffers |
+-------------+
| | This area contains less frequently
| | used items, such as large
| FAR heap | numeric arrays, the user
| | environment table, dynamic
| | arrays.
| |
+-------------+

User Data ------->|Run-time heap| Files, buffers, etc.
End DS:xxxx +-------------+
| String heap |
+-------------+
| User Stack | Preset to 2K bytes
+-------------+
| Named | Named COMMON areas
| COMMON |
DGROUP +-------------+
| BC_DATA | User program variables
Up to +-------------+
64K | BC_CONST | User program constants
+-------------+
| Blank COMMON| Library and user definitions
+-------------+
| _DATA | QuickBasic run-time data areas,

User Data | CONST | used during user code execution
Start DS:0 ------->| _BSS |
+-------------+
|Run-time code| Run-time code linked into file
+-------------+
| User Code | User program separately linked
Low Memory ------->| | with BCOM4x.LIB
+-------------+
| MS-DOS | MS-DOS Operating System
+-------------+
0000:0000 ------->

위의 그림 3: 독립 실행형 (BCOM4x.LIB 라이브러리) 메모리에 대 한. EXE
속성

문서 ID: 45850 - 마지막 검토: 2017. 2. 7. - 수정: 1

피드백