OS/360 객체 파일 형식
OS/360 Object File FormatOS/360 객체 파일 형식은 IBM DOS/360, OS/360 및 VM/370,[1] Univac VS/[2]9 및 Fujitsu BS2000[3] 메인프레임 운영 체제의 표준 객체 모듈 파일 형식입니다.1990년대에 이 형식은 MVS 운영 체제의 XSD 유형 레코드와 함께 확장되어 C 프로그래밍 언어로 [4]더 긴 모듈 이름을 지원하게 되었습니다.이 형식은 여전히 z/VSE 운영 체제(DOS/360 운영 체제 후속 버전)에서 사용됩니다.반대로 MVS 운영 체제(OS/360 운영 체제 후속 버전) 및 z/VM 운영 체제(VM/370 운영 체제 후속 버전)에서는 GOFF 파일 형식으로 대체되었습니다.MVS 및 z/VM 로더는 여전히 이 이전 형식을 처리하기 때문에 일부 컴파일러는 새로운 GOFF [5]형식 대신 이 형식을 계속 생성하도록 선택했습니다.
사용하다
이 형식은 컴파일된 응용 프로그램의 객체 코드를 설명하는데, 링크 에디터에 공급하여 실행 가능한 프로그램으로 만들거나 객체 모듈 로더를 통해 직접 실행할 수 있습니다.어셈블러 또는 프로그래밍 언어 컴파일러에 의해 생성됩니다.이 문서의 나머지 부분에서는 언어 컴파일러와 어셈블러의 차이에 명시적인 이유가 필요하지 않는 한, "컴파일"이라는 용어는 "어셈블러"를 포함하며, "컴파일러"는 "어셈블러"를 포함합니다.
약점
이 형식은 1964년 경에 처음 개발된 시기에 적합한 것으로 간주되었습니다.시간이 지남에 따라, 그것은 많은 약점들을 가지고 있었는데, 그 중 하나가 바로 그것이다.
- 8바이트의 긴 이름만 지원합니다(일반적으로 이름은 대문자만 사용하며 이름의 특정 기호로 제한된다는 규칙이 있습니다).다음 설명을 참조하십시오.
- 정렬을 지정할 수 없습니다.
- 순수 데이터이며 실행할 수 없는 모듈은 지정할 수 없습니다.
- (단순히 읽기 전용이 아닌) 재진입 모듈은 지정할 수 없습니다.
- 는 서브루틴(인수를 통해서만 데이터를 처리하는 루틴)과 함수(반환값을 통해 데이터를 반환하는 루틴)를 구분할 수 없습니다.
- (단순히 재진입하는 것이 아니라) 이동 가능하도록 설계된 모듈은 지정할 수 없습니다.
- 주소 상수는 테이블(변경되지 않음) 또는 동적 레코드의 가상 메서드에 대한 액세스와 반대로 포인터(데이터 구조에 대한 액세스 등)로 식별할 수 없습니다.
- 속성을 외부 참조에 할당할 수 없습니다(기준은 코드 대 데이터에 대한 참조).
- 절차 또는 함수가 인수 유형을 확인 또는 검증하거나 외부 구조를 검증할 수 있는 수단이 없습니다.
- 객체를 선언하는 수단이 없습니다.여기서 구조의 일부는 데이터이고 일부는 코드(객체의 데이터에 대해 동작하는 코드)입니다.
- SYM 심볼 표는 제공할 수 있는 정보가 제한됩니다.
이러한 약점 및 기타 약점으로 인해 이 형식이 GOFF 모듈 파일 형식으로 대체되었습니다.그러나 당시 사용되던 프로그래밍 언어의 요구에는 만족스러웠기 때문에 매우 만족스러웠고 구현도 간단했습니다(특히 당시 기계는 8K의 메모리를 적게 가지고 있었고 64K의 메모리를 가지고 여러 개의 동시 또는 연속 작업을 수행했으며 실제로 유용한 작업을 수행했습니다).단순한 프로그램(객체 방향과 가상 메서드와 같은 개념은 처음 개발되었을 때보다 수십 년 후에나 가능)을 사용할 수 있습니다.또한 포맷은 변경되지 않은 오래된 프로그램이나 소스 코드를 사용할 수 없고 오브젝트 파일만 남아 있는 프로그램에서 계속 사용해도 충분합니다.
GOFF 파일 형식은 이 형식을 대체했을 뿐이며(및 언어 컴파일러 또는 어셈블러에게 더 많은 정보를 제공), 형식은 여전히 유효하며 계속 사용될 수 있으며 권장되지 않습니다.이 포맷은 만들기가 쉽고 간단하다는 장점이 있습니다.또한 컴파일러는 최대 8글자의 대문자 모듈 이름, 코드와 데이터의 크기가 2^24(16MB)를 넘지 않는 응용 프로그램, 즉 80바이트 고정 포맷 바이너리를 쓸 수 있는 모든 프로그래밍 언어를 의미합니다.파일(기본적으로 COBOL이나 FORTRAN을 포함한 모든 파일)을 사용하여 이 객체 포맷용 컴파일러를 만들 수 있습니다.실제로 호주 원자력 위원회의 Pascal 8000 컴파일러 for IBM 360/370은 1978~1980년에 자체 호스팅 컴파일러로 작성된 자체 객체 파일을 중간 단계로 사용하지 않고 직접 생성했습니다.
레코드 타입
6가지 레코드 타입이 있습니다.
- ESD 레코드는 메인 프로그램, 서브루틴, 함수, 더미 섹션, Fortran Common 및 다른 모듈이 호출할 수 있는 모듈 또는 루틴을 정의합니다.컴파일러의 이 실행에서 컴파일된 프로그램 또는 프로그램세그먼트 및 프로그램에 의해 사용되는 외부 루틴(C의 exit(), Fortran의 CALL EXIT, Pascal의 new() 및 dispose() 등)을 정의하기 위해 사용됩니다.ESD 레코드는 ESD 기호를 참조하기 전에 실행해야 합니다.
- TXT 레코드에는 모듈에 의해 유지되는 기계 명령 또는 데이터가 포함됩니다.
- RLD 레코드는 주소 재배치에 사용됩니다.예를 들어 모듈 내부에 500바이트가 있는 주소를 참조하는 프로그램은 내부적으로 500으로 주소를 저장하지만 모듈이 메모리에 로드되면 반드시 다른 위치에 배치되므로 RLD 레코드는 링크 에디터 또는 로더에 변경할 주소를 알려줍니다.또한 모듈이 외부 기호를 참조할 때 일반적으로 기호 값을 0으로 설정한 다음 로더 또는 링크 편집기가 주소를 올바른 값으로 변경할 수 있도록 해당 기호의 RLD 항목을 포함합니다.
- 데이터 유형(문자 또는 숫자) 및 항목의 크기와 같은 기호에 대한 추가 정보를 제공할 수 있도록 SYM 레코드가 추가되었습니다.
- XSD 레코드는 절차 및 함수 등의 공개기호에 대해 ESD 레코드에 제공된 정보보다 더 많은 정보를 제공하고 프로시저 또는 함수 이름의 크기를 8자 이상으로 확장하기 위해 추가되었습니다.
- END 레코드는 모듈의 끝을 나타내고 선택적으로 프로그램의 실행을 시작하는 위치를 나타냅니다.
포맷
모든 레코드의 길이는 정확히 80바이트입니다.미사용 필드는 공백으로 입력해야 합니다.모든 레코드의 첫 번째 바이트는 항상 이진수 값 02입니다.다음 3바이트는 항상 레코드 타입입니다.문자 값은 EBCDIC에 있습니다.각 레코드의 나머지 필드는 레코드 유형에 따라 달라집니다.관례상 모듈이 어셈블리 언어 프로그램의 TITLE 스테이트먼트에서 이름이 붙여진 경우(또는 언어 컴파일러가 모듈에 이름을 붙이기로 결정한 경우), 그 이름은 각 레코드의 위치 73~80에 왼쪽 자리맞추기로 나타납니다.이름이 8자 미만이거나 이름이 지정되지 않은 경우 시퀀스 번호(문자, 0으로 정렬됨)l)가 각 레코드의 나머지 부분에 표시됩니다.실제로 시퀀스 번호 필드는 공백이거나 언어 번역자가 원하는 모든 것을 포함할 수 있으며 기본적으로 주석 필드입니다.
어셈블러(또는 C, COBOL, Fortran, Pascal, PL/I 또는 RPG III와 같은 고급 언어의 경우 컴파일러)는 각 서브루틴, 함수 또는 프로그램, Fortran 프로그램의 경우 공통 블록에 대해 ESD 레코드를 생성합니다.ESD 레코드의 추가 ESD 엔트리는 ENTRY 문(모듈의 에일리어스 또는 모듈의 대체 엔트리 포인트), 컴파일 또는 조립된 모듈의 일부로 포함된 Fortran 이름 또는 빈 COMMON 블록 및 모듈에 의해 호출된 외부 서브루틴 및 함수의 이름에 대해 생성됩니다.
퍼블릭 심볼 타입에는 ESDID 엔트리와 LDID 엔트리의 2종류가 있습니다.ESDID 엔트리는 CSECTS 및 DDECTS(프로그램, 절차 및 함수, 기록 또는 구조 선언)이며 LDID 엔트리는 ENTRI 문(CSECT 또는 DSECT에 대한 대체 또는 에일리어스 엔트리 포인트)입니다.ESDID 번호부여 공간은 LDID 번호부여공간과는 분리되어 있기 때문에 ESDID와 LDID의 2개의 다른 이름부호가 모두 0001의 바이너리 값을 가질 수 있습니다.
프로그램의 실행 가능한 오브젝트 코드와 데이터는 TXT 레코드에 저장됩니다.다른 서브루틴, 함수 또는 COMMON 블록에 대한 콜은 RLD 레코드를 통해 해결됩니다.이 레코드는 서브루틴 또는 함수의 완전한 주소를 결정하기 위해 TXT 레코드에 저장되어 있는 주소를 변경합니다.선택적으로 언어는 객체 이름, 데이터 유형 정보 또는 디버깅 기호와 같은 기호 참조 정보를 SYM 레코드를 통해 제공할 수 있습니다. 그러면 END 문은 객체 모듈 파일의 끝과 이 파일이 시작되는 서브루틴, 함수 또는 프로그램의 선택적 시작 주소를 나타냅니다.루틴의 주소는 첫 번째 루틴의 첫 번째 바이트가 아닙니다(일부 루틴은 실제 코드 앞에 데이터를 포함할 수 없거나 조립되거나 컴파일된 첫 번째 루틴이 "메인" 프로그램 또는 "프라이머리" 모듈이 아닙니다).보고된 바와 같이, 몇몇 사람들은 오래된 어셈블러의 작업 방식 때문에 (ca 1968–1975년) 프로그램 코드 앞에 데이터를 "위"로 하면 컴파일 속도가 빨라지고 어셈블러가 명령을 알아차리기 시작하면 훨씬 느려지기 때문에 프로그래머들은 데이터와 상수를 넣는 루틴을 작성하게 된다.st, 다음으로 프로그램 코드를 포함합니다.프로그램을 조립하는 데 지금처럼 몇 초가 아니라 30분에서 한 시간이 걸릴 수 있다면 이는 큰 차이였다.
모듈명과 심볼명은 모두 대문자로 표기되어 있으며 이름 필드의 첫 번째 문자는 문자 또는 기호@,# 또는 $이며 이름의 후속 문자는 이들 문자와 숫자0 ~ 9로 구성되어 있는 것에 주의해 주십시오.단, 오래된 소프트웨어는 obje를 올바르게 처리하거나 처리하지 않을 수 있습니다.ct 모듈파일에는 소문자 ID가 사용되었습니다.어셈블리 이외의 대부분의 프로그래밍 언어에서는 @ 또는 #를 포함하는 이름을 가진 모듈을 호출할 수 없습니다(특히 Fortran, 런타임라이브러리에 #가 포함된 이름이 있기 때문에 프로그래머가 선택한 이름과 충돌하지 않습니다).따라서 대부분의 프로그램, 서브루틴 또는 함수는 첫 번째 문자에 대해서만 문자를 사용하도록 작성되었습니다.이름이 1자를 초과할 경우 두 번째 ~ 여덟 번째 문자에는 문자와 숫자만 사용합니다.대부분의 비어셈블러 언어는 이름에 $를 처리할 수 없지만, 예외는 $가 들어간 서브루틴 이름을 인식할 수 있는 Fortran입니다.(#@ 또는 $를 사용하지 않는 이 선택은 어셈블러로 작성된 "메인" 프로그램이나 이러한 식별자를 사용할 수 있는 언어에는 적용되지 않습니다.프로그램 로더는 모듈의 이름을 신경 쓰지 않습니다.또한 서브루틴으로 사용하도록 작성된 모듈은 1978년 이전 버전인 Fortran으로 일반적으로 6자 이하로 제한되어 있으며, 서브루틴 또는 6자 이상의 모듈도 사용할 수 없습니다.COBOL 컴파일러는 일반적으로 프로그램의 PROGRAM-ID 또는 외부 모듈에 대한 CALL 문에 대시 문자가 나타나면 대시 문자를 폐기합니다.
1990년대에 새로운 레코드 타입인 XSD 레코드가 추가되어 이 오브젝트모듈 포맷의 사용을 확장하여 8자 이상의 모듈명을 포함하도록 하고 C 프로그래밍 언어에 따라 대소문자를 혼재시킬 수 있게 되었습니다.
일반적인 레이아웃
프리픽스(바이트 1) | 유형(바이트 2 ~4) | 목적 | 주소(바이트 6 ~8)(사용하는 경우) | 정보 크기(바이트 17+)(바이트 11~12) | 플래그 비트(XSD 레코드) 또는 공백(바이트 13~14) | 바이너리 ESDID (바이트 15 ~16) | 데이터. | 식별(바이트 73 ~80) | |
---|---|---|---|---|---|---|---|---|---|
(바이트 17~64) | (65~72바이트) | ||||||||
02 | 정전기 | 모듈 타입 | 공백 | 바이트 17~64로 사용되는 크기 | 공백 | 첫 번째 비LD 모듈 기호의 바이너리 ESDID(바이트 17~64) 또는 이 레코드의 모든 기호가 LD인 경우 공백 | 1 ~ 3 의 16 바이트 모듈 기호(아래 참조) | 공백 | 갑판 ID, 시퀀스 번호, 또는 둘 다 |
TXT | 프로그램 또는 데이터 | 이 레코드의 바이트 17 ~72의 상대적인 데이터 주소 | 바이트 17 ~72에서 사용되는 크기 | 공백 | ESDID | 1~56바이트의 데이터("데이터"는 프로그램 명령, 프로그램 데이터 또는 둘 다일 수 있습니다. | |||
RLD | 재배치 가능한 정보 | 공백 | 바이트 17 ~72에서 사용되는 크기 | 공백 | 공백 | 1~13의 가변 길이 재배치 엔트리(아래 표 참조) | |||
시스템 | 기호 테이블 정보 | 공백 | 바이트 17 ~72에서 사용되는 크기 | 공백 | 공백 | 가변 길이 기호 데이터(아래 표 참조) | |||
XSD | 확장 기호 정보 | 공백 | 바이트 17 ~72에서 사용되는 크기 | 플래그 비트(아래 표 참조) | XSD가 LD용이면 LDID 식별자, 그렇지 않으면 ESDID | XSD 데이터(아래 표 참조) | |||
끝. | 모듈의 끝 | 입력 주소(지정된 경우) 또는 공백 | 공백 | 공백 | 입력 주소 또는 공백의 ESDID | 종료 데이터(아래 표 참조) |
ESD 레코드
들판 | 크기 | 메모들 | ||
---|---|---|---|---|
이름. | 8 | 프로그램, 기능, 서브루틴 또는 포트란 공통 블록을 식별합니다(PC 또는 공백 공통 또는 이름 없는 블록 데이터의 경우 공백입니다). | ||
유형 | 1 | 가치 (16진수) | 모듈 유형 | 모듈이란 |
00 | SD | START, CSECT, DSECT(더미 섹션, TXT 레코드는 없습니다) 또는 Fortran 명명 BLOCK DATA 모듈 | ||
01 | LD | ENTY(이미 식별된 CSECT 내의 라벨 정의) | ||
02 | 음.정말 | EXTN(외부 참조) | ||
04 | PC | 개인 코드(이름 또는 이름이 없는 Fortran 이름 없는 BLOCK DATA 모듈, 이 모듈은 다른 프로그램에서 함수 또는 서브루틴으로 호출할 수 없음) | ||
05 | CM | Fortran 이름 지정 또는 공백 COMMON(사이즈만 제공. CM 레코드에 TXT 레코드는 포함되지 않음) | ||
06 | XD(PR) | 외부 더미 섹션 또는 유사 레지스터 | ||
0A | WX | WXTRN(Weak Extern - 모듈이 작동하기 위해 존재할 필요가 없는 외부 루틴) | ||
0D | SD | 쿼드 얼라인먼트 START 또는 CPECT | ||
0E | PC | 쿼드 얼라인드 개인 코드 | ||
0F | CM | 쿼드 얼라인드 공통(크기만 제공.공통에는 TXT 레코드가 없습니다) | ||
주소. | 3 | 이 모듈의 이진 시작 주소, 모듈 내 LD 기호 주소 | ||
플래그 | 1 | |||
XD의 2진수 위치 맞추기 ER, LD 또는 WX의 경우 공백. SD, CM, 또는 PC 의 경우는, 다음을 사용합니다. | ||||
비트 | 가치 | 목적 | ||
0-1 | 사용하지 않음 | |||
2 | 0 | RMODE 값으로 비트5 사용 | ||
1 | RMODE 64비트 | |||
3 | 0 | AMODE에 비트6 ~ 7 사용 | ||
1 | AMODE 64비트 | |||
4 | 0 | 모듈은 읽기/쓰기입니다. | ||
1 | RSECT(모듈은 읽기 전용이며 자체 수정되지 않음) | |||
5 | 0 | RMODE 24비트 | ||
1 | RMODE 31비트 또는 RMODE ANY | |||
6–7 | 00 | AMODE 24비트 | ||
01 | AMODE 24비트 | |||
10 | AMODE 31비트 | |||
11 | 아모드(AMODE(임의) | |||
크기 | 3 | PC, CM 또는 SD의 바이너리 길이, 공백 뒤에 2바이트의 LDID(및 ESDID 번호는 LDID 번호와 별개, ESDID 번호는 0001로 지정할 수 있으며 번호 0001로 LDID와 다른 식별자, ER, XD, PR 또는 WX의 경우 공백).모듈이 얼마나 오래 걸릴지 모르는 SD 레코드를 작성하는 프로그램 컴파일러는 이 필드를 공백으로 두고 END 레코드에서 이 모듈의 길이를 지정할 수 있습니다. |
RLD 재배치 엔트리
RLD 레코드의 첫 번째 재배치 엔트리는 8바이트여야 합니다.어떤 엔트리의 플래그 필드에 비트7이 설정되어 있고, 그 뒤의 엔트리가 이 엔트리와 같은 [Regocation]값과 [Position]값을 사용하고 있으며, 그 엔트리에 4바이트가 있는 경우 플래그와 주소 필드만 있습니다.그 엔트리의 플래그 필드에 비트7이 설정되어 있는 경우, 그 엔트리의 플래그 비트가 설정되어 있지 않은 경우, 그 엔트리의 다음 엔트리(이 레코드에 추가 엔트리가 있는 경우)는 풀8 바이트를 사용합니다. 예를 들어 basura라는 이름의 C 프로그램이 exit() 함수를 호출한다고 가정합니다. | ||||
들판 | 크기 | 메모들 | ||
---|---|---|---|---|
재배치 | 2 | 재배치할 기호의 이진 ESDID. 외부 기호(출구)입니다. | ||
위치 | 2 | 재배치되는 바이너리 ESDID. 위의 재배치 기호를 참조하는 모듈입니다(기본값). | ||
플래그 | 1 | |||
비트 | 의미. | |||
0 | 예약필 | |||
1 | 1인 경우 비트 4~5의 일정한 길이 값에 4를 추가합니다. | |||
2-3 | 가치 | 주소 상수 유형 | ||
0 | A - 외부 주소, 데이터 테이블 또는 외부 모듈일 수 있습니다. | |||
1 | V | |||
2 | Q | |||
3 | CXD | |||
4-5 | 주소 상수 길이 - 1 | |||
6 | 재배치 방향(더하기 위해 0, 빼기 위해 1) 감산은 일반적으로 A형 주소 상수에 대해서만 사용됩니다. | |||
7 | 1의 경우 이 RLD 레코드의 이 값 뒤에 있는 엔트리의 [Position]및 [Relocation]값 필드는 이 값과 동일하며, 그 엔트리의 길이는 4바이트에 불과합니다.RLD 레코드의 마지막 엔트리는 이 비트를 클리어해야 합니다.이 기능은 하나의 특정 케이스에 적합합니다.아마도 가장 일반적인 케이스는 프로그램 자체로의 재배치를 실시하는 경우입니다.위치하는 주소의 ESID와 주소가 저장되는 장소는 동일하기 때문에 모듈의 다른 부분에 대한 주소 참조를 마킹하기 위해 사용됩니다. | |||
주소. | 3 | 재배치할 위치 항목 모듈의 절대 주소입니다. |
SYM 레코드
기호 정보의 경우 엔트리가 차례로 패킹되고 항상 처음 두 개의 필드만 표시됩니다.조직의 비트4가 1인 경우 이름 필드는 생략됩니다.데이터 이외의 항목에 대해서는 이후의 필드도 생략됩니다(조직의 비트0은 0).데이터 항목(조직의 비트0은 1)의 경우 데이터 유형 및 길이 필드만 항상 표시되며, 길이 필드는 데이터 유형에 따라 1 또는 2바이트가 될 수 있습니다. | |||||
들판 | 바이트 번호 | 크기 | 메모들 | ||
---|---|---|---|---|---|
조직 | 1 | 1 | |||
비트 | 가치 | 의미. | |||
0 | 0 | 비데이터형 | |||
1 | 데이터형 | ||||
(데이터형이 아닌 경우) | |||||
1-3 | 000 | 공간 | |||
001 | 제어 섹션 | ||||
010 | 더미 제어 섹션 | ||||
011 | 흔한 | ||||
100 | 기계 명령 | ||||
101 | CCW | ||||
(데이터 타입의 경우) | |||||
1 | 0 | 다중성 없음 | |||
1 | Multipicity(M 필드의 존재를 나타냅니다) | ||||
2 | 0 | 독립적(패킹되거나 구역화된 10진수 아님) | |||
1 | 클러스터(밀폐 또는 구역 분할된 10진수) | ||||
3 | 0 | 스케일링 없음 | |||
1 | 스케일링(S 필드의 존재를 나타냅니다) | ||||
데이터형과 비데이터형 모두 | |||||
4 | 0 | 이름 있음 | |||
1 | 이름 없음 | ||||
5-7 | 이름 길이 - 1 | ||||
주소. | 2 | 3 | Csect 시작으로부터의 간격띄우기 | ||
이름. | 0-8 | 바이트 1의 비트4가 1일 경우 이 필드는 존재하지 않으며, 그렇지 않을 경우 1~8바이트입니다. | |||
다음 필드는 데이터 항목에 대해서만 표시됩니다(바이트 1의 비트 0은 1) | |||||
데이터형 | 1 | 16진수 값 | |||
00 | 문자(C - 유형, 2바이트 길이) | ||||
04 | 16진수(X - 유형, 2바이트 길이) | ||||
08 | 이진수(B - 유형, 2바이트 길이) | ||||
10 | F타입, 32비트 정수(1바이트 길이, 통상은 4) | ||||
14 | H형, 16비트 정수(1바이트 길이, 통상은 2) | ||||
18 | E타입, 32비트(단정도) 부동소수점(1바이트 길이, 통상은 4바이트) | ||||
1C | D타입, 64비트(이중 정밀도) 부동소수점(1바이트 길이, 통상은 8바이트) | ||||
20 | A 타입 또는 Q 타입의 32비트주소 또는 값(1바이트 길이, 통상은 4) | ||||
24 | Y형, 16비트 주소 또는 값(1바이트 길이, 통상은 2) | ||||
28 | S타입(1바이트 길이) | ||||
2C | V형, 32비트 외부 기호(1바이트 길이, 일반적으로 4바이트) | ||||
30 | P형 가변 길이 패킹 10진수(1바이트 길이) | ||||
34 | Z 타입, 가변 길이 10진수(1바이트 길이) | ||||
38 | L형(1바이트 길이) | ||||
길이 | 1 또는 2 | 길이 - 1, 문자, 16진수 또는 이진수 타입의 경우 2바이트(1~32,768바이트), 기타 모든 타입의 경우 1바이트(1~256바이트) | |||
다중성 | 0 또는 3 | M 필드, 3바이트 반복 횟수 또는 이 필드가 존재하지 않는 경우 추정값 1(반복되지 않음) | |||
규모. | 0 또는 2 | S 필드, 2바이트 스케일 값(F, H, E, D, L, P 및 Z 유형 데이터에만 해당) 또는 이 필드가 존재하지 않는 경우 스케일은 0으로 간주됩니다(조직의 비트 3은 0). |
XSD 레코드
XSD 레코드 유형은 MVS가 C 컴파일러에 대해 더 긴 모듈 이름을 지원할 수 있도록 1990년대에 추가되었습니다. | |||||
들판 | 바이트 번호 | 크기 | 메모들 | ||
---|---|---|---|---|---|
플래그 바이트 1 | 13 | 1 | 비트 1~6은 XPLINK에 사용되며 비트7은 AMODE 64에 사용됩니다.이것들은 모두 바인더에 의해 사용되지 않습니다.비트 8은 항상 0입니다. | ||
플래그 바이트 2 | 14 | 1 | 조금 | 의미. | |
1 | 이름에는 여러 정의가 있을 수 있습니다. | ||||
2 | 이름이 뒤죽박죽이다 | ||||
3 | 내부 링크 | ||||
4 | 템플릿 | ||||
5 | 콘캣 | ||||
6 | Import 또는 내보내기에 적합한 이름 | ||||
7 | 이름이 함수인 경우 1 | ||||
8 | 이름이 매핑된 경우 1(예: #subma map) | ||||
길이 | 17-20 | 4 | 이름 길이 | ||
오프셋 | 21-24 | 4 | 이름의 첫 번째 바이트 또는 이름의 하위 문자열 오프셋(1의 원본) | ||
유형 | 25 | 1 | 가치 (16진수) | 모듈 유형 | 모듈이란 |
00 | SD | START, CSECT, DSECT(더미 섹션, TXT 레코드는 없습니다) 또는 Fortran 명명 BLOCK DATA 모듈 | |||
01 | LD | ENTY(이미 식별된 CSECT 내의 라벨 정의) | |||
02 | 음.정말 | EXTN(외부 참조) | |||
04 | PC | 개인 코드(이름 또는 이름이 없는 Fortran 이름 없는 BLOCK DATA 모듈, 이 모듈은 다른 프로그램에서 함수 또는 서브루틴으로 호출할 수 없음) | |||
05 | CM | Fortran 이름 지정 또는 공백 COMMON(사이즈만 제공. CM 레코드에 TXT 레코드는 포함되지 않음) | |||
06 | XD(PR) | 외부 더미 섹션 또는 유사 레지스터 | |||
0A | WX | WXTRN(Weak Extern - 모듈이 작동하기 위해 존재할 필요가 없는 외부 루틴) | |||
0B | UR | ||||
주소. | 26-28 | 3 | 심볼의 24비트 주소 | ||
사양 | 29 | 1 | 모듈 유형에 따라 다름(바이트 25 값) | ||
모듈 타입 | 가치 | 의미. | |||
LD ER CM의 특수한 순서 또는 WX | 공백 | 사용하지 않음 | |||
홍보 | 얼라인먼트 팩터 | ||||
00 | 바이트 얼라인먼트 | ||||
01 | 하프워드 얼라인먼트 | ||||
03 | 단어 정렬 | ||||
07 | 이중 단어 정렬 | ||||
SD 또는 PC | 비트 1-2 | 사용하지 않음 | |||
비트 3 | 1인 경우 RMODE 64, 그렇지 않은 경우 비트6 값을 사용합니다. | ||||
비트 4 | 1의 경우 AMODE 64, 그렇지 않은 경우 비트7 및 8의 값을 사용합니다. | ||||
비트 5 | 1(RSECT인 경우) | ||||
비트 6 | 0=RMODE 24, 1=RMODE 31, (비트 3이 1이면 무시됨) | ||||
비트 7-8 | 00 또는 01=AMODE 24, 10=AMODE 31, 11=AMODE any(비트 4가 1인 경우 무시됨) | ||||
길이 또는 식별자 | 30-32 | 3 | 가치 | 의미. | |
영 | END 레코드에 SD, PC, CM 타입의 길이가 지정되어 있는 경우 | ||||
길이 | 유형 SD, PC, CM의 경우 제어 섹션 길이, 유형 PR의 경우 의사 레지스터 길이 | ||||
식별자 | LD 유형의 이름을 포함하는 SD 항목의 식별자 | ||||
공백 | 유형이 ER 또는 WX인 경우 | ||||
이름. | 33-72 | 다르다 | 이름 또는 하위 문자열 |
종료 레코드
모듈은 END 레코드의 데이터로 종료됩니다.이것이 모듈의 마지막 기록이어야 합니다.오브젝트 데크(파일에 함께 배치된 모듈의 그룹)에는 여러 모듈이 함께 표시될 수 있지만 각 모듈은 ESD 레코드로 시작하여 END 레코드로 끝납니다. | |||
들판 | 바이트 번호 | 크기 | 메모들 |
---|---|---|---|
ESDID 시작 | 15-16 | 2 | 타입 1 END 레코드의 경우(바이트 33 참조), 이 모듈의 시작점의 바이너리 ESDID(지정되어 있는 경우), 타입 2 END 레코드의 경우 공백.이 모듈의 시작 ESDID는 외부 기호일 수 있습니다.이를 통해 모듈이 자체 대신 런타임 라이브러리 또는 시작 코드를 자동으로 시작할 수 있습니다.(언어 컴파일러는 항상 같은 이름을 컴파일한 프로그램의 메인 프로그램을 할당하거나 사용자의 프로그램을 시작할 준비가 되었을 때 제어권을 이전할 수 있는 표준 이름을 가진 SD 또는 LD 엔트리를 만듭니다.) |
시작명 | 17-24 | 8 | 타입 2 END 레코드의 경우(바이트 33 참조), 이 모듈의 시작점 이름(지정된 경우), 타입 1 END 레코드의 경우 공백 또는 지정되지 않은 경우 공백 |
모듈 크기 | 29-32 | 4 | ESD 레코드의 SD 엔트리에 지정되지 않은 경우 모듈의 바이너리 길이(바이트 단위)입니다.지정되지 않은 경우 바이트 29는 0이고 공백입니다.이를 통해 컴파일러는 기본적으로 "원패스"가 되어 컴파일된 오브젝트 파일에 오브젝트 코드를 쓸 수 있습니다.그리고 컴파일된 후 모듈의 크기를 나타냅니다.프로그램의 크기를 실제로 알 수 있습니다. |
END 형식 또는 IDR 수 | 33 | 1 | EBCDIC 숫자 문자 '1', '2' 또는 공백. END 레코드의 형식 유형을 나타냅니다.어셈블러의 일부 버전은 이 레코드에 Identifier(IDR; 식별자) 레코드의 수(바이트 34 ~52 또는 존재하는 경우 53 ~71)를 나타내기 위해 이 바이트를 사용합니다.공백은 1개의 레코드가 존재하거나 존재하지 않거나 타입1 어셈블러 레코드임을 나타내는 데 사용할 수 있습니다.식별자 필드는 기본적으로 주석 필드이므로 모든 항목(특히 Order Number 필드)에 사용할 수도 있고 공백일 수도 있습니다. |
바이트 34~52는 IDR 레코드라고 통칭됩니다.바이트 53~71은 세컨더리 IDR 레코드라고 불립니다.둘 중 하나 또는 둘 다 공백일 수 있습니다.또한 숫자를 포함하는 다른 정보 필드와 달리 IDR의 값은 모두 텍스트이며 이진수로 표현되지 않습니다. | |||
주문 번호 | 34-43 | 9 | 어셈블러의 주문 번호 또는 컴파일러의 식별자는 문자 또는 숫자를 포함할 수 있습니다. |
버전 | 44-45 | 2 | 어셈블러 또는 컴파일러의 2자리 버전 번호 |
리비전 | 46-47 | 2 | 어셈블러 또는 컴파일러의 2자리 리비전 번호 |
실행 년도 | 48-49 | 2 | 이 어셈블리가 실행되었거나 프로그램이 컴파일된 해의 마지막 두 자리(예: 1980년 또는 2080년)입니다.포맷이 개발되었을 때, 00와 63보다 큰 숫자는 20세기(1964-2000)에, 0과 64보다 작은 숫자는 모두 21세기(2001-2063년)에 있을 것입니다. |
실행일 | 50-52 | 3 | 이 어셈블리가 실행되거나 프로그램이 컴파일된 3자리 날짜(1월 1일 001, 2월 1일 032 등)059(항상 2월 28일을 의미함) 이후의 숫자는 원래 프로그램이 윤년에 컴파일 또는 조립되었는지 여부에 따라 해당 날짜의 하루 또는 다음날이 될 수 있습니다. 060은 윤년의 경우 2월 29일 또는 다른 해의 경우 3월 1일입니다.365년은 윤년이냐 아니냐에 따라 12월 30일 또는 31일이 된다.366은 항상 윤년 12월 31일에 조립되거나 컴파일된 모듈을 의미합니다. |
추가 식별자 | 53-71 | 18 | 포함된 경우 기본적으로 33-52와 형식이 같거나 공백입니다. |
레퍼런스
- ^ OS/VS - VM/370 Assembler Programmer's Guide, GC33-4021-4, 제5판, IBM, San Jose, CA (1982년 9월) http://www.textfiles.com/bitsavers/pdf/ibm/370/asm/GC33-4021-4_OS_VS_VM_370_Assembler_Programmers_Guide_Sep82.pdf
- ^ VS/9 어셈블러 레퍼런스 매뉴얼: Univac 90/60, 90/70 및 90/80 시리즈 메인프레임 컴퓨터용 프로그래밍 가이드, Spirry Univac, Cnamonson, NJ, 1978
- ^ ASSEMBLYH 레퍼런스 매뉴얼, U5223-J-Z125-3-7600, 후지쯔 테크놀로지 솔루션 GmbH, 2010년 6월, http://manuals.ts.fujitsu.com/file/957/assh_bs.pdf (2013년 8월 7일 취득)
- ^ z/OS & z/VM & z/VSE 프로그래머 가이드, 부록 C용 고급 어셈블러.릴리스 6, SC26-4941-05, IBM, 캘리포니아 새너제이, 2008년 7월 http://publibfp.boulder.ibm.com/cgi-bin/bookmgr/download/asmp1020.pdf (2010년 3월 27일 취득)
- ^ IBM z/VSE 시스템 제어문: 버전 5 릴리스 1, SC34-2637-00, IBM, 1984, 2011.
- OS/MVS 프로그램 관리: Advanced Facilities, SA22-7644-07, 제8판, IBM, Pougkeepsie, NY, 제8판, 2007년 9월 http://publibz.boulder.ibm.com/epubs/pdf/iea2b270.pdf (2013년 8월 9일 취득)
- John R. Ehrman, Linked Editor 작동 방식: 객체/로드 모듈, Link Editor, Loaders 및 IBM 실리콘 밸리(Santa Teresa) Laboratory, San Jose, 1994, 2001(Retrieve, 2013년 7월 29일)에 대한 튜토리얼