제 2 장 어셈블러(Assemblers) 2.1 기본 어셈블러 기능 2.1.1 단순 SIC 어셈블러 어셈블러 지시자(assembler directives) START: 프로그램 이름과 시작주소 END: 프로그램 끝, 선택적으로 최초 실행 명령어 지정 BYTE: 문자, 16진수(hexadecimal) 상수 생성, 필요한 만큼의 바이트 차지 WORD: 한 워드 정수 상수 생성 RESB: 지정된 수만큼의 바이트들 예약 RESW: 지정된 수 만큼의 워드들 예약 p45 예 인덱스 레지스터: ,X 로 표시 주석(comments)은 “.”로 시작 서브루틴 RDREC, WRREC RD, WR: 한 문자씩 전송 각 레코드의 끝: null 문자(16진수 00) 버퍼 길이: 4096 바이트, 레코드의 4096 바이트만 복사 길이 0인 레코드: 복사될 파일의 끝 파일의 끝 만나면: EOF(End of File) 출력 후 RSUB 수행하고 종료 2.1.1 단순 SIC 어셈블러 어셈블러의 작업들: 목적코드(object code)로의 번역 작업들 1. 연상 연산 코드(mnemonic operation codes)를 해당 기계어의 연산자(opcode) 값으로 전환: p496~498 참조 2. 심볼 연산을 해당 기계 주소(machine address)로 전환 3. 기계 명령어를 적절한 형식으로 구성 4. 원시 프로그램에 있는 데이터 상수를 내부 기계 표현(internal machine representation)으로 전환: p501부록 B 참조 5. 목적 프로그램과 어셈블리 리스트를 작성 주소 번역 문제 어셈블러의 2번 작업 시 p45 프로그램의 RETADR, RDREC, LENGTH, ZERO 등 변수 및 상수의 주소를 모르므로 번역 불가능 2 패스 어셈블러 필요 패스-1: 레이블 정의, 주소 배정 패스-2: 실제 번역 어셈블러 지시자(assembler directives) 또는 의사 명령어(pseudo instructions) 처리 기계어로 번역되지 않고 어셈블러에 명령만 예: START, END, BYTE, WORD, RESB, RESW 등 지시자 시스템 프로그래밍
2.1.2 어셈블러 알고리즘과 자료구조 자료구조 SYMTAB(Symbol Table, 심볼 테이블) 생성된 목적 코드는 출력장치에 기록되고 실행위해 나중에 메모리에 적재됨 목적 프로그램 구성 및 형식 헤더 레코드 열(바이트에 해당) 1: H (Header) 열 2-7: 프로그램 이름 열 8-13: 목적 프로그램 시작 주소(16진수) 열 14-19: 바이트로 표시된 목적 프로그램 길이 텍스트 레코드 열 1: T (Text) 열 2-7: 이 레코드 안의 목적코드 시작주소 열 8-9: 이 레코드 안의 목적 코드의 바이트 길이 열 10-69: 16진수로 나타낸 목적 코드(목적 코드 한 바이트 당 2개의 열) 끝 레코드 열 1: E (END, 목적 프로그램의 끝을 선언) 열 2-7: 목적 프로그램의 첫번 실행 명령어 주소 2 패스 어셈블러의 일반적인 기능 패스 1(심볼들의 정의) 1. 모든 문장의 주소 배정 2. 패스 2가 사용할 모든 레이블이 주소 배정 3. BYTE, RESW 등 몇 가지 어셈블러 지시자들 처리 패스 2(명령어 번역 및 목적 프로그램 생성) 1. 명령어를 번역(연산 코드 번환 및 주소 조사) 2. BYTE, WORD 등의 데이터 값 생성 3. 패스 1에서 처리되지 않은 어셈블러 지시자 처리 4. 목적 프로그램과 어셈블러 리스트 출력 2.1.2 어셈블러 알고리즘과 자료구조 자료구조 OPTAB(Operation Code table, 연산 코드 테이블) 연상 명령어와 해당 기계어 및 경우에 따라 명령 형식과 길이를 저장 P496~498 같은 표에서 연상 명령어를 찾아 기계어로 번역 패스 1: 원시 명령 코드를 찾고 명령어 길이 확인하는데 이용 패스 2: 원시 명령어를 기계어로 번역하는데 이용 주로 범용 정적 해시 테이블(static hash table)로 구성(DS in C 참조) SYMTAB(Symbol Table, 심볼 테이블) 각 레이블들의 이름과 값(주소), 오류 상태(같은 기억 장소에 중복 정의 등), 레이블이 붙여진 데이터 영역 또는 명령어의 종류 및 길이를 저장 패스 1: 레이블과 LOCCTR에 의해 배정된 주소 입력 패스 2: 피연산자 심볼의 값을 찾아 명령어에 삽입 주로 동적 해시 테이블 구성 삽입과 검색이 효율적이어야 non-random 레이블 사용 가능성 있어 소수(prime number)로 테이블 크기 나누어야 시스템 프로그래밍
2.2 기계 종속적인 어셈블러 특성 SIC 확장형이 어셈블러 설계에 미치는 영향: p55 Fig.2.5 알고리즘 @: 간접 주소지정 방식 #: 즉시 주소지정 방식 메모리 참조 주소지정 방식 프로그램 계수기 상대 기준 상대(어셈블리 지시자 BASE 이용) +연산자: 확장 명령어 형식 레지스터-레지스터 명령 사용으로 메모리 참조 줄임: COMPR, TIXR 즉시 주소지정 방식(#)으로 메모리 참조 줄임 간접 주소 방식(@)의 사용으로 추가적인 명령어 피함: @RETADR CLEAR 등 새로운 명령어 추가되나 전반적 실행은 빠름 LOCCTR(Location Counter, 위치 계수기) 주소 배정에 이용 START 문의 시작 주소로 초기화 패스 1은 패스 2의 입력이 되는 중간 파일(intermediate file)에 전달 정보 기록 원시 프로그램 위치 계수기(LOCCTR) 값 오류 플래그 테이블 탐색 시간 줄이기 위해 각 연산과 심볼의 OPTAB과 SYMTAB 포인터 알고리즘 패스 1: p53 Fig.2.4(a): 표준 SIC 경우 패스 2: p54 Fig.2.4(b) ): 표준 SIC 경우 시스템 프로그래밍
2.2 1 명령어 형식과 주소지정 방식(Instruction Format and Addressing Modes) 재배치 가능한 프로그램: p 58 Fig.2.6 START 문 주소가 0 OPTAB 이용하여 opcode 변환(pass 2) SYMTAB 이용하여 레지스터 이름을 번호로 변환(pass 2) 레지스터-메모리 명령 프로그램 상대 변위: 0~4095 베이스 상대: -2048~2047 변위가 너무 큰 경우: 4 바이트 확장 명령어 형식(e=1) 사용해야 (예)15 0006 +JSUB RDREC 4B101036 0010 1011 0001 0000 0001 0000 0011 0110 ni xbpe +opcode 표시 없으면 PC 상대 시도 PC = 000A 변위 (= 1016)가 out of range(12비트) 베이스 상대 시도 에러 PC 상대와 베이스 상대 (예) 10 0000 FIRST STL RETADR 17202D 0001 0111 0010 0000 0010 1101 ni xbpe PC = 3 변위 = 30 - 3 = 2D opcode = 0001 0100 + 0000 0011 (예) 40 0017 J CLOOP 3F2FEC CLOOP 주소 = 0006 PC = 0001A 변위 = 6 - 1A = -14 = FEC(2의 보수) 0000 0001 0100 -> 1111 1110 1011 + 1 = 1111 1110 1100 차이점 PC 상대: 값을 어셈블러가 알고 있음 베이스 상대: 값을 프로그래머가 알려주어야 LDB #LENGTH: LENGTH의 주소값을 레지스터 B에 로드 BASE LENGTH: 베이스 레지스터가 LENGTH의 주소를 가짐(어셈블러 지시자) … NO BASE(어셈블러 지시자) (예) 160 104E STCH BUFFER,X 57C003 0101 0111 1100 0000 0000 0011 B = 0033 BUFFER = 0036 변위 = 0036 - 0033 = 3 x=b = 1 시스템 프로그래밍
(예) 175 STX LENGTH PC 상대 시도 변위(=0033-1059=-1026=EFDA)가 out of range 베이스 상대: 134000 0001 0011 0100 0000 0000 0000 ni xbpe (예) 20 LDA LENGTH 변위(=0033-000D=0026) OK 즉시 주소지정 (예) 55 0020 LDA #3 010003 0000 0001 0000 0000 0000 0011 (예) 133 103C +LDT #4096 75101000 0111 0101 0001 0000 0001 0000 0000 0000 4096: out of range(12 비트) -> 확장형 피연산자가 20 비트보다 크면 즉시 불가능 (예) 12 0003 LDB #LENGTH 69202D 0110 1001 0010 0000 0010 1101 피연산자는 LENGTH의 주소 PC = 0006 변위 = 0033 - 0006 = 02D 간접 주소지정 (예) 70 J @RETADR 3E2003 0011 1110 0010 0000 0000 0011 ni xbpe PC 상대 + 간접 주소지정 PC = 002D 변위 = 0030 - 002D = 003 2.2.2 프로그램 재배치 절대(absolute) 프로그램과 재배치(relocatable) 프로그램 프로그래밍 등의 경우 메모리 여유가 있을 때마다 프로그램을 로드 프로그램 로드 시간까지 프로그램 시작 주소를 알 수 없음: load-time binding 재배치 주소(relocatiable) 생성 (cf.) 절대 주소 생성: compile-time binding (예) 55 0020 LDA THREE 00102D 0000 0001 0000 0000 0000 0011 재배치 가능한 프로그램(relocatable program): 로드시 수정이 필요한 주소 부분에 대한 정보를 포함한 목적 프로그램 시스템 프로그래밍
재배치 로더에 대한 명령어 (예) p58 프로그램, p65 Fig.2.8 참조 목적 코드 생성시 피연산자의 주소를 프로그램 시작 위치에 대한 상대적인 주소로 삽입 로더에 실제 프로그램 시작주소 더하도록 명령(단순 주소들에 대하여) 로더에 대한 명령어 목 적 프로그램의 일부 수정 레코드(modification record) 열 1: M 열 2-7: 수정이 필요한 주소 필드의 프로그램 시작위치에 대한 상대적 주소(16진수) 열 8-9: 반바이트(16진수)로 표현된 수정될 주소 필드의 길이 주소 필드 길이가 20 비트인 경우 5 반바이트로 홀수개의 반바이트 시작위치: 시작주소의 바이트의 중간 반바이트로부터 시작함 약속(SIC/XE 구조에 종속적) 다른 기계에서는 반바이트 접근이 부적절할 수 있음 (예) p58 프로그램, p65 Fig.2.8 참조 15 0006 CLOOP +JSUB RDREC 4B101036 수정 레코드: M00000705 01036 + 프로그램 로드 주소 35 0013 +JSUB WRREC 4B10105D 수정 레코드: M00001405 0105D + 프로그램 로드 주소 65 0026 +JSUB WRREC 4B10105D 수정 레코드: M00002705 나머지 명령어들은 PC 상대주소, 베이스 상대주소, 즉시 주소들이므로 수정이 필요 없음 PC 상대 10 0000 FIRST STL RETADR 17202D 0001 0111 0010 0000 0010 1101 ni xbpe PC = 3 변위 = 30 - 3 = 2D opcode = 0001 0100 + 0000 0011 PC 상대 주소이므로 수정 필요없음 베이스 상대 LENGTH와 BUFFER 사이의 거리는 항상 3 바이트 베이스 레지스터는 LDB #LENGTH로 자동 설정 직접 주소(direct address)만 로드시 수정 필요, 직접 주소는 반드시 확장 형식(4 바이트) 간접 주소(indirect address)는 로드시 수정 필요 없음 p65 목적코드 참조, p45 SIC 프로그램 수정할 것 시스템 프로그래밍
2.3 기계 독립적인 어셈블러의 특성(Machine-Independent Assembler Features) 2.3.1 리터럴(Literals) 리터럴 편리하게 상수를 정의 특수 기호 사용 (예) 45 001A ENDFIL LDA =C’EOF 032010 215 1062 WLOOP TD =X’05’ E32011 리터럴 번역 방법 즉시 피연산자(immediate operand): 기계어 명령어의 일부로 번역 리터럴: 어셈블러가 다른 메모리 주소(리터럴 저장소)에 상수로서 명시된 값을 생성 리터럴 풀(literal pool) END 문장 다음: default 다른 위치에: LTORG 지시자로 LTORG: 이전의 LTORG 이후 현 LTORG 사이에 사용된 모든 리터럴들 저장 LTORG 사용 이유 리터럴 피연산자를 사용하는 명령어 근처에 위치시키고 싶을 때 (예) =‘EOF’가 END 다음에 있으면 1073번지 PC 상대 주소 쓰기에는 변위가 너무 커짐 -> 확장 형식 사용해야 리터럴 중복 식별가능 한 카피만 저장 리터럴 정의 문자열 비교 생성된 데이터 값 비교: 더 효율적 (예) =C’EOF 와 =X’454F46’는 동일 위치 계수기(LOCCTR)의 현재 값을 참조하는 리터럴: * 프로그램 안에서의 위치에 따라 값이 바뀌는 리터럴 (예) LDB = * BASE * 이름 같지만 리터럴 풀에 모두 나타나야 함 시스템 프로그래밍
2.3.2 기호 정의문(Symbol-Defining Statements) 지시자 EQU(equate) symbol EQU 값 리터럴 테이블(LITTAB) 리터럴 이름, 피연산자 값과 길이, 리터럴 풀에서의 주소 주로 해시 테이블 패스 1 리터럴 나타나면 데이블에 등록(주소 미정) LTORG 또는 END 나타나면 주소 없는 리터럴의 주소 등록 리터럴 크기만큼 위치 계수기 증가 패스 2 리터럴 피연산자 마다 LITTAB에서 주소 알아냄 리터럴이 위치 계수기 값 등 프로그램 내부의 주소 값이면 수정 레코드 생성 p67 Fig.2.9, 2.10 프로그램으로 확인할 것 2.3.2 기호 정의문(Symbol-Defining Statements) 지시자 EQU(equate) 사용자 정의 기호 symbol EQU 값 (예) p55 Fig.2.5 133행 +LDT #4096 MAXLEN EQU 4096 +LDT #MAXLEN SYMTAB에 저장 레지스터에 연상 이름 정의 (예) A EQU 0 X EQU 1 L EQU 2 범용 레지스터 정의 (예) BASE EQU R1 COUNT EQU R2 INDEX EQU R3 효과: 프로그램의 readability 향상 시스템 프로그래밍
보통의 어셈블러에서는 전방 참조(forward-reference) 불가 지시자 ORG ORG 값 위치계수기(LOCCTR)을 ‘값’으로 설정 ‘값’ 없으면 LOCCTR 원래값으로 복귀 (예) 저장 공간 예약 STAB RESB 1100 레이블 정의 SYMBOL EQU STAB VALUE EQU STAB+6 FLAGS EQU STAB + 9 테이블 구조 정의 ORG STAB SYMBOL RESB 6 VALUE RESW 6 FLAGS RESB 2 ORG STAB + 1100; 테이블의 이용 LDA VALUE, X 보통의 어셈블러에서는 전방 참조(forward-reference) 불가 (예) ALPHA EQU BETA BETA EQU DELTA DELTA RESW 1 해결 방법: 다중 패스 어셈블러(Multi-Pass Assemblers) 2.3.3 수식(Expressions) 프로그램 안의 주소 값들 시작 주소에 상대적(relative) 절대적(absolute) 항(terms)이나 수식(expressions)의 값들 상대적 레이블(lables), 위치 계수기 값 참조(references to the location counter value) EQU 절대적 상수(constant) SYMBOL VALUE FLAGS STAB (100항목) 시스템 프로그래밍
수식(expressions)의 분류와 규칙 절대 수식(absolute expressions) 절대항들과 서로 부호가 다른 상대항들의 쌍들 포함 가능 상대 수식(relative expressions) 하나의 양의 부호 상대항을 제외한 모든 상대항들이 쌍을 이룸 상대항은 곱셈, 나눗셈 연산에 이용될 수 없음 규칙의 배경 S: 프로그램 시작 주소 r: 상대적 위치 (S + r1) - (S + r2) = r1 - r2 (예) 107 MAXLEN EQU BUFEND - BUFFER LOC 에 계산 결과인 절대값 1000(16진수) 규칙 위반하면 오류 수식의 유형 파악위해 심볼테이블(SYMTAB)에 절대/상대 유형 표시 (예) Symbol Type Value ETADR R 0030 BUFFER R 0036 BUFEND R 1036 MAXLEN A 1000 2.3.4 프로그램 블록(Program Blocks) 원시와 목적 프로그램을 유연하게 다루기(flexible handling) 위하여 프로그램을 독립적인 부분들로 나눔 프로그램 블록(program section): 하나의 목적 프로그램 안에서 재정리(rearrage) 가능한 프로그램 세그먼트 제어 섹션(control section): 독립적인 목적 프로그램 단위로 번역될 수 있는 프로그램 세그먼트 프로그램 블록 정의 방법 지시자 USE: 원시 프로그램의 부분이 어느 블록에 속하는지 표시 (예) p79 Fig.2.11 15~70 : 이름 없는 디폴트 블록 92 USE CDATA: CDATA 블록의 시작 103 USE CBLKS: CBLKS 블록의 시작 123 USE: 디폴트 블록의 시작 183 USE CDATA: CDATA 블록의 시작 208 USE: 디폴트 블록의 시작 252 USE CDATA: CDATA 블록의 시작 시스템 프로그래밍
어셈블러의 다중 프로그램 블록 처리 (예) p81 Fig.2.12 (예) p83 Fig.2.13 목적 프로그램 블록들을 (논리적으로) 재정리하여 하나로 모음 목적 프로그램안에서 블록들에 주소 배정 패스 1 블록 별로 독립적인 위치 계수기 사용 처음에 0 다른 블록 시작될 때 저장 레이블들은 블록에서의 상대적인 주소로 배정 받음 SYMTAB 저장 시 블록 이름 또는 번호 기록 각 블록의 최종 값은 블록의 길이 각 블록의 시작주소 배정 가능 블록정보 테이블 생성 Block name Block number Address Length (default) 0 0000 0066 CDATA 1 0066 000B CBLKS 2 0071 1000 패스 2 심볼의 주소 = 블록 시작 주소(블록정보 테이블) + 심볼의 블록 시작으로부터의 상대적 위치(심볼 테이블) (예) p81 Fig.2.12 107 MAXLEN 블록 번호 없음 = 절대 심볼 20 0006 0 LDA LENGTH 032060 0000 0011 0010 0000 0110 0000 ni xbpe LENGTH 주소 = 0003 + 0066 = 0069 PC = 0009 0069- 0006 = 0060 (예) p83 Fig.2.13 목적 프로그램 92 USE CDATA, 183 USE CBLKS 만나면 새 텍스트 레코드 준비 디폴트 블록은 0000 부터 0065 CDATA는 0066 부터 0070 LTORG는 006D 부터 CBLKS는 0071부터 1071 p84 Fig.2.14 참조 다중 프로그램 블록 이용의 효과 버퍼 영역이 프로그램 끝으로 주소 지정 복잡성이 감소 확장형 명령 불필요(15, 35, 65행) 베이스 레지스터 사용 불필요 리터럴 주소 지정 복잡성 감소 LTORG 문을 CDATA 블록에 포함시켜 BUFFER 앞에서 지정 시스템 프로그래밍
2.3.5 제어 섹션과 프로그램 링크(Control Sections and Program Linking) 제어 섹션: 독립적인 목적 프로그램 단위로 번역될 수 있는 프로그램 세그먼트 지시자 CSECT 로 정의 독립적으로 적재되고 재배치 됨 서브루틴, 논리적 분해 제어 섹션들의 링크 필요 제어 섹션들 사이의 외부 참조(external reference) 필요 지시자 EXTDEF: 다른 섹션이 참조하도록 외부 정의(external definition) 지시자 EXTREF: 다른 섹션의 심볼을 외부 참조 (예) p86 Fig.2.15 3 제어 섹션: 1 주 프로그램, 2 서브루틴 15 0003 CLOOP +JSUB RDREC 4B100000 0100 1011 0001 0000 0000 0000 0000 0000 ni xbpe 어셈블러는 RDREC가 어디로 적재될 지 모르므로 주소에 0 삽입 주소의 여유위해 확장 명령어 160 0017 +STCH BUFFER, X 57900000 0101 0111 1001 0000 0000 0000 0000 0000 ni xbpe 190 0028 MAXLEN WORD BUFEND-BUFFER 000000 로더가 값 산츌 107 행과 비교: EQU 지시자에 의해 어셈블러가 계산 로더가 외부 심볼들의 값을 삽입할 수 있도록 관련 정보 알려 주어야 정의 레코드(Define Record): EXTDEF 열 1: D 열 2-7: 현 제어 섹션에 정의된 외부 심볼 이름 열 8-13: 심볼의 현 제어섹션에서의 상대 주소 열 14-73: 다른 심볼들에 대하여 1-13 반복 참조 레코드(Refer Record): EXTREF 열 1: R 열 2-7: 현 제어 섹션에서 참조하는 외부 심볼 이름 열 8-73: 다른 외부 참조 심볼들의 이름 시스템 프로그래밍
2.4 어셈블러 설계 선택사항(Assembler Design Options) 수정 레코드(Modification Record) 열 1: M 열 2-7: 현 제어 색션 시작 주소로 부터의 수정될 필드의 시작 주소 열 8-9: 수정될 필드의 반바이트 단위의 길이(16 진수) 열 10: 수정 플래그(+ 또는 -) 열 11-16: 필드에서 더하거나 빼야하는 값에 해당하는 외부 심볼 Fig.2.17 중 M00000405+RDREC M00002806+BUFFER M00002806-BUFEND Fig.2.8 중 M00000705+COPY 여러 제어 섹션을 가진 프로그래에서의 수식 취급 수식에 외부 참조 있으면 어셈블 단계에서 오류 검출 불가능 로더가 수식 검사 및 오류 검출 2.4 어셈블러 설계 선택사항(Assembler Design Options) 2.4.1 단일 패스 어셈블러(One-Pass Assembler) 전방 참조(foreword reference)를 미리 정의하도록 -> 그러나 모든 전방 점프 제거 어려움 단일 패스 어셈블러 유형 유형 1: 메모리에 즉시 실행코드 생성 적재실행 어셈블러(load-and-go assembler): 로더 필요 없음 개발 및 검사 지향 시스템에 유용 번역 작업 부하가 크므로 효율이 문제 목적 프로그램 생성 및 재적재 불필요 전방 참조 수월 전방참조 심볼과 전방참조하는 명령어의 피연산자 주소를 테이블에 표시 심볼 만나면 해당 주소를 데이블과 참조 명령어에 기입 (예) Fig. 2.19 (a), (b) 48---- 30---- 종료후 심볼 테이블에 *표시된 심볼 있으면 오류 없으면 실행위해 END의 피연산자 심볼 위치로 점프 절대 프로그램이어야 함 시스템 프로그래밍
2.4.1 다중 패스 어셈블러(Multi-Pass Assembler) 전방참조 문제 유형 2: 목적 프로그램 생성 적재실행 어셈블러 경우처럼 전방참조를 심볼 테이블에 표시 심볼 나타나면 로더가 주소 수정할 수 있도록 텍스트 레코드 생성: p97 Fig.2.20 참조 (예) T00201C022024 2.4.1 다중 패스 어셈블러(Multi-Pass Assembler) 전방참조 문제 EQU, ORG의 오른쪽 심볼들은 먼저 정의되어야 (예) ALPHA EQU BETA BETA EQU DELTA DELTA RESW 1 전방 참조 해결: 다중 패스 어셈블러 심볼테이블에 전방참조하는 심볼 및 종속성(계산식) 저장 심볼테이블에 전방참조되는 심볼과 그 값에 종속된 심볼을 ‘*’ 플래그와 함께 저장 심볼테이블에 대한 추가적인 패스 수행 후에 패스 2 수행: p99 Fig.2.21 EQU 경우 참조(ORG 경우와 비교) 2.5 구현 예(Implementation Examples) 2.5.1 MASM Assembler Microsoft MASM: Pentium, x86 x86 구조 메모리는 세그먼트들로 구성됨 CODE: 레지스터 CS로 접근 DATA: 레지스터 DS, ES, FS, GS로 접근 CONST STACK: 레지스터 SS로 접근 로더가 레지스터 세트 CS에 END 문의 프로그램 이름으로 시작되는 세그먼트 표시하도록 세트 데이터 세그먼트 참조는 DS가 default 변경은 ASSUME 지시자로 ASSUME ES:DATASEG2 DATASEG2에 있는 모든 레이블은 레지스터 ES 사용하여 에셈블됨 DS, ES, FS, GS 들은 프로그램에서 사용되기 전에 미리 적재되어야(프로그래머에 의해) MOV AX, DATASEG2 MOV ES, AX 시스템 프로그래밍
JUMP 세그먼트 관리 목적 프로그램 2.5.2 SPARC Assembler SunOS SPARC near jump: 같은 코드 세그먼트안 현재의 CS 이용하여 어셈블 2-3 바이트 명령(간격이128 바이트보다 크거나 작은 경우에 따라) far jump: 다른 코드 세그먼트로 명령의 접두부(prefix)에 표시된 다른 세그먼트 레지스터 이용하여 어셈블 5 바이트 명령 전방 참조(foreward reference) 문제 JMP TARGET: near jump가 default 3 바이트 예약 JMP FAR PTR TARGET: 프로그래머가 경고 5 바이트 예약 빠트리면 오류 또는 다시 패스 1 JMP SHORT TARGET: 간격이 128 바이트 이내인 경우 표시 2 바이트 예약 피연산자(operand) 길이 레지스터 메모리 즉시: 1-4 바이트 명령어 길이 달라짐 pass 1이 SIC 보다 복잡해짐 OPTAB도 더 복잡해짐 세그먼트 관리 하나의 세그먼트가 여러 장소에 분리되어 있을 수 있음 SEGMENT 지시자의 이름이 같음 SIC/XE의 프로그램 블록 개념과 유사 세그먼트 사이의 참조 PUBLIC: SIC/XE의 EXTDEF와 유사 EXTRN: SIC/XE의 EXTREF와 유사 목적 프로그램 여러 포맷으로 생성이 가능 여러 OS 상에서 쉽게 수행 가능 타이밍 리스팅(각 명령을 수행위해 필요한 클록 사이클 수 명시) 코드의 임계 부분 최적화 시도 가능 2.5.2 SPARC Assembler SunOS SPARC 프로그램이 섹션(sections)으로 나뉨 .TEXT: 실행가능한 명령들 .DATA: 초기화된 입출력 데이터 .RODATA: 읽기 전용 데이터 .BSS: 초기화 되지 않은 데이터 영역 ‘executable’, ‘writable’ 속성 정의 가능 시스템 프로그래밍
지연 분기(delayed branch) (1.5.1절 참조) 섹션 관리 목적 파일(object file) 프로그램 세그먼트의 번역된 버전 재배치 및 링크 연산 리스트 링크 시 다른 세그먼트들 사이의 참조 해결 재배치와 링크를 위한 심볼 테이블 전역 변수, 약 변수, 섹션 이름 지연 분기(delayed branch) (1.5.1절 참조) Sparc 기계에 종속적인 특이한 기능 분기 명령 바로 다음 명령을 분기전에 실행함 (예) CMP %L0, 10 BLE LOOP ADD %L2, %L3, %L4 … delay slot delay slot을 NOP(no-operation)으로 처리 하기도 (예) LOOP: ADD %L2, %L3, %L4 … CMP %L0, 10 NOP … delay slot 섹션 관리 프로그램 상에서 어셈블러 지시자 이용하여 섹션 사이 자유로이 이동(switch)할 수 있음 각 섹션마다 위치계수기(location counter) SIC의 프로그램 블록 개념과 유사 섹션 사이의 참조는 링커가 담당(SIC의 경우는 어셈블러가 담당) 심볼 처리 심볼은 기본적으로(default) 지역(local)에서만 이용 독립적으로 어셈블된 섹션 사이를 연결하는 심볼은 전역 심볼(global symbol) 이나 약 심볼(weak symbol)로 선언해야 함 전역 심볼은 SIC의 EXTDEF, EXTREF 기능을 결합한 것 약 심볼은 전역 심볼로 override 될 수 있고 정의되지 않은 채로 링크될 수 있음 시스템 프로그래밍
Power PC , POWER 구조(architecture) 기준 상대 주소 지정 폐지 분기(annulled branches): Delay slot에 ADD 문 있을 경우 마지막 루프에서는 delay slot(ADD 문) 수행 않도록 분기가 일어날 때만 delay slot 수행 LOOP: … CMP %L0, 10 BLE,A LOOP ADD %L2, %L3, %L4 delay slot 관련 오류 delay slot에 레이블이 있는 경우 세그먼트가 분기문으로 끝나는 경우(delay slot이 없는 경우) 2.5.3 AIX Assembler Power PC , POWER 구조(architecture) .MACHINE 지시자: 어셈블러가 명령어 세트 오류 조사 목적 프로그램의 각 명령어 마다 처리 가능 구조(Power PC, POWER) 플래그 기준 상대 주소 지정 기준 레지스터로는 GPR0 제외한 모든 범용 레지스터 이용 가능 한 프로그램 안 여러 기준 레지스터 가능 (예) .USING LENGTH,1 .USING BUFFER,4 … .DROP 4 기준 레지스터 테이블(base register table) 유지 메모리 참조하는 피연산자마다 기준 레지스터 테이블 조사하여 가장 작은 변위(displacement)되는 기준 레지스터 선정 명시적으로 기준 레지스터 및 변위 지정 가능: L 2, 8(4): GPR4의 주소로부터 8 바이트 다음 GPR4가 테이블이나 데이터 레코드의 시작 주소일 때 테이블이나 데이터 레코드 안의 특정 위치 참조에 좋음 .USING 문이나 기준 레지스터 테이블 참조 필요 없음 시스템 프로그래밍
제어 섹션(control sections) .CSECT 지시자로 각 섹션은 데이터의 종류를 설명하는 기억장소 사상 클래스(storage mapping class) 가짐 PR(excutable instructions): .TEXT RO(read-only data): .TEXT RW(read/write data): .DATA BS(uninitialized read/write data): .BSS SIC의 제어 섹션과 프로그램 블록을 결합한 특성 가짐 한 섹션은 프로그램의 여러 부분을 포함할 수 있음 에셈블러가 여러 프로그램 부분들을 하나의 섹션으로 모음 어셈블된 섹션은 독립된 단위로 로더나 링키지 에디터에 의해 다루어짐 더미 섹션(dummy section) 실제 목적 프로그램의 부분이 되지 못하며 단지 섹션안의 레이블 만을 정의 레이블들은 테이블이나 레코드의 심볼들 공통 블록(common blocks) 초기화되지 않은 BS로 어셈블된 프로그램들이 공유 가능 제어 섹션들의 연결(linking)은 SIC에서 처럼 .GLOBL: 심볼을 링커에게 알림, EXTDEF와 유사 .EXTERN: 심볼이 다른 원시 모듈에 있음을 링커에게 알림, EXTREF와 유사 수식(expression)도 SIC에서 처럼 제어 섹션들 연결 방법(a method for linking control sections) TOC(table of contents) 이용: 지시자로 생성, 섹션이름은 .DATA 제어 섹션들의 주소 전역 심볼들의 주소 자주 쓰이는 데이터 항목들의 주소 프로그램 로드 시 재배치와 연결을 위해 TOC 만 참조하면 됨 목적 프로그램의 섹션 이름 .TEXT: excutable instructions, read-only data, debugging tables .DATA: read/write data, TOC .BSS: uninitialized data 2-패스 어셈블러 SIC와 유사하나 패스-1에서 오류 없어 패스-2 진행할 때 원시 프로그램 다시 읽어서 어셈블 LOCCTR 다시 계산 패스-1에서의 경고 메시지는 사라지고 패스-2에서의 경고 메시지만 리스팅 시스템 프로그래밍