2.3.2 기호 정의문 EQU 프로그래머 기호 정의하고 그 값 지정 기호 정의 기호 값 예 기호 EQU 값 SYMTAB에 입력, 기호에 지정된 값을 배정 기호 값 상수, 수식 예 +LDT #4096 MAXLEN EQU 4096 ( SYMTAB MAXLEN, 4096 ) +LDT #MAXLEN ( MAXLEN에 대한 값을 피연산자로 사용) 시스템 프로그래밍
2.3.2 기호 정의문 EQU의 다른 사용(레지스터 이름) 어셈블러의 명령어(RMO) 가정 가정: RMO 0, 1(가능), RMO A, X(불가능) EQU의 사용 : 위의 불가능한 가정이 가능하게 됨(SYMTAB 이용) A EQU 0 X EQU 1 L EQU 2 . 다른 예 BASE EQU R1 COUNT EQU R2 INDEX EQU R3 시스템 프로그래밍
2.3.2 기호 정의문 ORG ORG 사용 예 STAB RESB 1100 어셈블러 위치계수기 값의 재설정 값은 상수 또는 수식 레이블 정의에 유용하게 사용될 수 있음 ORG 사용 예 기호 테이블( STAB 100 항목) EQU 문의 사용 STAB RESB 1100 SYMBOL EQU STAB VALUE EQU STAB + 6 FLAGS EQU STAB + 9 SYMBOL VALUE FLAGS 6 3 2 시스템 프로그래밍
2.3.2 기호 정의문 ORG의 사용 어셈블러 지시자(EQU, ORG)의 제약 STAB RESB 1100 ORG STAB (LOCCTR 재설정) SYMBOL RESB 6 VALUE RESW 1 FLAGS RESB 2 ORG STAB + 1100 (LOCCTR의 복귀) 어셈블러 지시자(EQU, ORG)의 제약 오른쪽의 기호는 이전에 프로그램에서 먼저 나타나야 함 ALPHA RESW 1 BETA EQU ALPHA 시스템 프로그래밍
2.3.2 기호 정의문 전방 참조(forward reference) ALPHA EQU BETA BETA EQU DELTA DELTA EQU 1 위의 문장은 보통 2중 패스 어셈블러에 의해서는 해결될 수 없음 시스템 프로그래밍
2.3.3 수식 수식 대부분의 어셈블러에서 허용 단일 피연산자의 주소나 값을 생성 산술 연산(+, -, *, /) 특수항(*) 160 BUFEND EQU * 절대 수식(absolute expressions) 절대항으로 이루어진 경우 상대항의 쌍이 다른 부호를 갖을 경우 상대값을 갖는 경우는 곱셈과 나눗셈 불가 107 MAXLEN EQU BUFEND-BUFFER 상대 수식(relative expressions) 한 개의 상대항을 제외한 모든 항이 쌍을 이루어야 함 곱셈과 나눗셈 연산은 불가 시스템 프로그래밍
2.3.3 수식 수식의 유형 기호 유형 값 RETADR R 0030 BUFFER 0036 BUFEND 1036 MAXLEN A 수식의 유형 결정을 위해 기호와 유형의 파악 SYMTAB에 저장(기호 이름, 플래그, 값) 기호 유형 값 RETADR R 0030 BUFFER 0036 BUFEND 1036 MAXLEN A 1000 시스템 프로그래밍
2.3.4 프로그램 블록 프로그램 블록 프로그램 블록의 예(그림 2.11) 원시 프로그램과 목적 프로그램의 유연성 지원 독립적인 프로그램의 부분 생성 독자성의 유지 로더에 의해 개별적으로 다루어짐 프로그램 블록의 예(그림 2.11) 3개의 블록 이름없는 블록(default 블록) : 실행 가능한 명령어 CDATA 블록 : 길이가 몇 개의 워드, 작은 데이터 영역 CBLKS 블록 : 메모리의 커다란 영역 USE 지시자 사용 독립적인 블록의 명시(92행:USE CDATA, 123행:USE CBLKS) USE (183행) : default 블록의 다시 시작 시스템 프로그래밍
2.3.4 프로그램 블록 패스1 패스 2 각 프로그램 블록 : 독립적인 계수기 사용 논리적 코드의 재배열 프로그램 블록 시작시 계수기 0으로 초기화 각 레이블은 프로그램 블록으로부터 상대적 주소 배정 패스 1의 끝 : 위치 계수기의 값(블록의 길이) 패스 2 코드 생성 목적 프로그램의 시작 위치부터의 상대 주소가 필요 SYMTAB에서 발견 블록 이름 블록 번호 주소 길이 Default 0000 0066 CDATA 1 000B CBLKS 2 0071 1000 시스템 프로그래밍
2.3.4 프로그램 블록 20 0006 0 LDA LENGTH 032060 목표 주소(TA) PC의 값 : 0009 0003(CDATA로부터의 상대 주소) + 0066(CDATA의 시작주소) = 0069 PC의 값 : 0009 변위(disp) = TA-(PC) = 0069-0009 = 0060 프로그램의 복잡성 해결 형식 4의 사용 배제 35 000F 0 JSUB WRREC 4B203B 004D(default로부터의 상대 주소)+0000(default의 시작주소) = 004D PC의 값 : 0012 변위(disp) = TA-(PC) = 004D-0012 = 003B 시스템 프로그래밍
2.3.4 프로그램 블록 프로그램의 복잡성 해결 리터럴의 위치 지정 문제의 해결 CDATA에 위치 시킴 큰 데이터 영역 보다 확실히 앞에 위치 시킴 시스템 프로그래밍
메모리에 로드된 프로그램 원시프로그램 목적프로그램 5 0000 Default(1) Default(1) Default(1) 70 0027 Default(2) Default(2) 95 CDATA(1) 100 004D CDATA(2) 105 CBLKS(1) Default(3) 125 0066 Default(3) CDATA(1) Default(2) 006C CDATA(2) CDATA(3) 180 006D CDATA(3) 185 CDATA(2) 0071 210 Default(3) CBLKS(1) 245 253 CDATA(3) 시스템 프로그래밍
2.3.5 제어 섹션과 프로그램 링크 제어 섹션(Control Section) 외부 참조(External Reference) 어셈블러 후 독자성을 유지하는 프로그램의 일부분 각 제어 섹션은 독립적으로 로드, 재배치 함께 링크할 수 있는 방법 필요 외부 참조(External Reference) 제어 섹션들 사이의 참조 어셈블러 : 외부 참조에 대한 정보 생성 예제 프로그램(그림 2.15) 첫번째 제어 섹션 : COPY(5행,시작), CSECT(109행) 전이 끝 두번째 제어 섹션 : RDREC(109행), CSECT(193행) 세번째 제어 섹션 : WRREC(193행), END(255행)까지 각 제어 세션은 독립적인 위치 계수기를 갖음 각 제어 섹션은 동시에 어셈블될 필요는 없음 외부 참조(external reference) EXTDEF(external definition) : 현 섹션 정의, 다른 섹션 사용 EXTREF(external reference) : 현 섹션에서 다른 섹션의 것을 참조 시스템 프로그래밍
2.3.5 제어 섹션과 프로그램 링크 opcode n i x b p e address 0101 01 1 1 1 1 외부 참조의 예 15 0003 CLOOP +JSUB RDREC 4B100000 160 0017 +STCH BUFFER,X 57900000 RDREC를 포함하는 제어섹션의 메모리 위치(?) 피연산자 0 로더에 의해 로드될 때 적합한 주소 삽입 상대 주소 지정 방식 불가 확장명령어(형식 4) 사용 160행 opcode n i x b p e address 0101 01 1 1 1 1 0000 0000 0000 0000 0000 5 7 9 시스템 프로그래밍
2.3.5 제어 섹션과 프로그램 링크 107 1000 MAXLEN EQU BUFEND-BUFFER 190 0028 MAXLEN WORD BUFEND-BUFFER 000000 190행 외부 참조(BUFEND, BUFFER)를 포함하는 수식 어셈블러 : 0을 저장 로더 : 프로그램 로드시 BUFEND 값을 더하고 BUFFER 값을 뺌 107행 외부 참조가 아님 어셈블러에 의해 계산될 수 있음 외부 참조의 기호는 SYMTAB에 의해 저장 시스템 프로그래밍
2.3.5 제어 섹션과 프로그램 링크 목적 프로그램의 수정 목적 : 어셈블러가 로더에게 외부 참보 정보를 전달 정의 레코드(Define Record) 열 1 D 열 2-7 현 제어 섹션에서 정의된 외부 기호 이름 열 8-13 현 제어 섹션에서 이 기호의 상대 주소 열 14-73 열 2-13의 반복 참조 레코드(Refer Record) 열 1 R 열 2-7 현 제어 섹션에서 참조되는 외부 기호 이름 열 8-73 다른 외부 참조 기호 이름 수정 레코드(Modification Record) 열 1 M 열 2-7 제어 섹션에서의 수정될 필드의 상대적 시작 위치 열 8-9 하프-바이트로 표현된 수정될 필드의 길이 열 10 수정 플래그(+ 또는 -) 열 11-16 값을 더하거나 뺄 외부 기호 이름 시스템 프로그래밍
2.3.5 제어 섹션과 프로그램 링크 15 0003 CLOOP +JSUB RDREC 4B100000 15행 65행 35행 H COPY 000000 001033 D BUFFER 000033 BUFEND 001033 LENGTH 00002D R RDREC WRREC T 000000 1D 172027 4B100000 032023 290000 332007 4B100000 3F2FEC …… T 00001D 0D 010003 0F200A 4B100000 3E2000 T 000030 03 454F46 15행 65행 35행 P113참조 M 000004 05 +RDREC M 000011 05 +WRREC M 000024 05 +WRREC E 000000 시스템 프로그래밍
190 0028 MAXLEN WORD BUFEND-BUFFER 000000 2.3.5 제어 섹션과 프로그램 링크 190 0028 MAXLEN WORD BUFEND-BUFFER 000000 H RDREC 000000 00002B R BUFFER LENGTH BUFEND T 000000 1D B410 B400 B440 77201F E3201B 332FFA DB201B A004 332009 57900000 b850 T 00001D 0E 3B2FE9 13100000 4F0000 F1 000000 M 000018 05 +BUFFER M 000021 05 +LENGTH M 000028 06 +BUFEND 190행 M 000028 06 -BUFFER E 시스템 프로그래밍
2.4 어셈블러 설계 선택사항 2.4.1절 2.4.2절 1패스 어셈블러 구조와 논리 다중 패스 어셈블러 전방 참조의 허용(이중 패스의 확장) 시스템 프로그래밍
2.4.1 단일 패스 어셈블러 단일 패스 단일 패스의 두가지 유형 전방 참조 문제의 해결 목적 프로그램을 직접 메모리에 생성 데이터 항목 참조 전에 미리 정의 기억 장소 예약문을 프로그램의 앞 쪽에 위치 완전 제거 불가 : 루프 벗어나는 경우 여전히 사용 단일 패스의 두가지 유형 목적 프로그램을 직접 메모리에 생성 보통 목적 프로그램 예제 프로그램(그림 2.18) 시스템 프로그래밍
2.4.1 단일 패스 어셈블러 적재 실행(load-and-go) 어셈블러 목적 프로그램의 생성 : 전방 참조 취급이 수월 즉시 실행을 위해 목적 프로그램을 메모리에 생성 로더가 필요 없음 목적 프로그램의 로드의 번거로움을 피할 수 있음 단일 패스는 추가적인 패스의 부담을 덜어 줌 목적 프로그램의 생성 : 전방 참조 취급이 수월 원시 프로그램의 읽는 순서대로 목적 코드 명령어 생성 전방 참조 기호 : 주소 필드는 결정 않고 남겨 둠 피연산자의 기호를 SYMTAB에 기입 정의되지 않았음을 표시(플래그) 기로 정의문을 만나면 적절한 주소를 명령어에 삽입 시스템 프로그래밍
적재 실행(load-and-go) 어셈블러 메모리 주소 내용 기호 값 1000 454F4600 00030000 00xxxxxx xxxxxxxx LENGTH 100C RDREC * 2013 1010 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx THREE 1003 …… ZERO 1006 WRREC * 201F 2000 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxx14 EOF 1000 2010 1009 48-- -- 00100C 281006 30 -- -- 48-- ENDFIL * 201C RETADR 1009 2020 -- 3C2012 BUFFER 100F CLOOP 2012 FIRST 200F …… …… 시스템 프로그래밍
메모리 주소 내용 기호 값 1000 100C 203D 1010 1003 …… 1006 * 201F 00030000 00xxxxxx xxxxxxxx LENGTH 100C RDREC 203D 1010 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx THREE 1003 …… ZERO 1006 WRREC * 201F 2000 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxx14 EOF 1000 2010 1009 4820 3D 00100C 281006 30 20 24 48-- ENDFIL 2024 2031 RETADR 1009 2020 -- 3C2012 0010000C 100F0010 030C100C BUFFER 100F 2030 48-- -- 08 10094C00 00F10010 00041006 CLOOP 2012 2040 001006E0 20393020 43D82039 281006 30 FIRST 200F 2050 -- -- 5490 0F MAXLEN 203A INPUT 2039 …… EXIT * 2050 RLOOP 2043 …… …… 시스템 프로그래밍
2.4.1 단일 패스 어셈블러 목적 프로그램 생성(단일 패스 어셈블러) 외부 저장 장치가 속도가 느리거나 사용이 불편할 경우 전방 참조 문제 : 로더에 의해 해결 H COPY 001000 00107A T 001000 09 454F46 000003 000000 T 00200F 15 141009 480000 00100C 281006 300000 480000 3C2012 T 00201C 02 2024 T 002024 19 001000 0C100F 001003 0C100C 480000 081009 4C0000 F1 001000 T 002013 02 203D T 00203D 1E 041006 001006 E02039 302043 D82039 281006 300000 54900F …… T 002050 02 205B T 00205B 07 10100C 4C0000 05 …… E 000000 시스템 프로그래밍
2.4.2 다중 패스 어셈블러 이중 패스 어셈블러의 어려움 다중 패스 어셈블러 ALPHA EQU BETA BETA EQU DELTA DELTA EQU 1 다중 패스 어셈블러 기호 정의 처리 위한 패스만큼 허용 프로그램 전체에서 패스를 두 번 이상 수행할 필요는 없음 시스템 프로그래밍
2.4.2 다중 패스 어셈블러 다중 패스 어셈블러 실행 예(그림 2.21) HALFSZ EQU MAXLEN/2 MAXLEN EQU BUFEND-BUFFER PEVBT EQU BUFFER-1 BUFFER RESB 4096 BUFEND EQU * 1번 문장의 패스 1 수행 결과의 기호 테이블 수식 내 정의되지 않은 기호가 하나 있음을 표시 HALFSZ &1 MAXLEN/2 수식 정의 값 정의되지 않은 기호 저장 MAXLEN * HALFSZ 종속되는 기호 리스트 시스템 프로그래밍
2.4.2 다중 패스 어셈블러 2번 문장의 패스 1 수행 결과의 기호 테이블 MAXLEN EQU BUFEND-BUFFER * MAXLEN HALFSZ &1 MAXLEN/2 MAXLEN &2 BUFEND-BUFFER HALFSZ BUFFER * MAXLEN 시스템 프로그래밍
2.4.2 다중 패스 어셈블러 PEVBT EQU BUFFER-1 3번 문장의 패스 1 수행 결과의 기호 테이블 BUFEND * MAXLEN HALFSZ &1 MAXLEN/2 PREVBT &1 BUFFER-1 MAXLEN &2 BUFEND-BUFFER HALFSZ BUFFER * MAXLEN PREVBT 시스템 프로그래밍
2.4.2 다중 패스 어셈블러 4번 문장의 패스 1에서의 주소 배정이 1034(16진수) 1034 BUFFER RESB 4096 BUFEND * MAXLEN HALFSZ &1 MAXLEN/2 PREVBT 1033 MAXLEN &1 BUFEND-BUFFER HALFSZ BUFFER 1034 시스템 프로그래밍
2.4.2 다중 패스 어셈블러 2034 BUFEND EQU * 5번 문장의 패스 1에서의 주소 배정이 2034(16진수) HALFSZ 800 PREVBT 1033 MAXLEN 1000 BUFFER 1034 시스템 프로그래밍