제 6 장 8086 어셈블러 설계
제 6 장 학습내용 어셈블러의 개요 레이블,외부기호,내부기호 개념 프로그램의 실행 과정 어셈블러,링커,로더의 역할 이중패스의 필요성 및 기능 어셈블러의 역할 패스1, 패스2의 기능 명령어의 상대주소와 기호표의 생성 프로그램의 적재와 어셈블러 지시어 패스1, 패스2의 알고리즘 패스1, 패스2 각각에 관련된 데이터베이스
어셈블러의 개요 어셈블리어 명령어의 번역 기계어와 일대일 대응으로 번역 작업과정이 컴파일러보다 간단 일반적으로 패스1과 패스2로 구성
프로그램의 실행과정 실행 적재모듈 주기억장치 원시 모듈 어셈블러 목적 모듈 목적모듈 어셈블러 원시 모듈 목적 모듈 링커 원시 *.asm *.obj 실행 적재모듈 로더
어셈블러와 링커/로더 원시프로그램이 커지면 여러 개의 원시모듈로 나누어 작성 프로그램 및 유지보수가 용이 링커: 여러 개의 목적모듈을 연결하여 적재모듈을 생성 로더: 적재모듈을 주기억장치에 적재
어셈블러와 링커/로더 어셈블러와 링커/로더를 분리한 이유 기억 장소의 낭비 시간 낭비 프로그램의 실행동안 어셈블러가 기억장소에 있어야 하므로 시간 낭비 번역된 목적 프로그램이 저장되어 있지 않으므로 실행시 마다 번역 과정을 수행
어셈블러의 입력과 출력 어셈블러는 링커와 로더가 필요로 하는 정보 제공 원시 모듈 어셈 블러 목적 어셈블러는 링커와 로더가 필요로 하는 정보 제공 링커: 외부참조 테이블: 다른 모듈에 정의된 기호를 참조하기 위한 수단 로더: 재배치시 변경할 주소 테이블
어셈블러,링커,로더의 역할 목적모듈 AA 원시모듈 AA 어셈 블러 원시모듈 BB 목적모듈 BB 어셈 블러 기억장치 적재모듈 (상대(목적코드)주소) 0 MOV ... 2 ....... ... MOV...... ......... . 11 원시모듈 BB 목적모듈 BB 어셈 블러 ADD...... ......... (상대(목적코드)주소) 0 ADD ... 2 ....... ... . 7 기억장치 물리 주소 적재모듈 100 MOV.... ... ADD.... (상대(목적코드)주소) 0 MOV ... 2 ....... ... 12 ADD ... 로더 . 19 102 링 커 112 ... 100번지부터 적재 119
외부기호와 내부기호 외부기호(external symbol) * 외부 모듈에서 정의된 기호나 프로그램 이름 내부기호(internal symbol) * 같은 모듈에서 정의된 기호
외부기호 PUBLIC symbol[, …] 여기 프로그램을 외부사용자가 연결하여 수행하여도 좋다. 내가 정의한 것을 남이 사용하도록 허용 EXTRN name:type[, …] 어떤 프로그램을 사용하고자 한다. 그 프로그램을 나의 프로그램과 연결시켜 프로그램을 완성하라. 남이 정의한 것을 내가 사용하도록 정의
외부기호 EXTRN name:type[, …] name : 데이터 세그먼트 내의 심볼 type : BYTE, WORD, DWORD.. name : procedure 이름 type : NEAR, FAR name : EQU, = 으로 정의된 상수 type : ABS
링커와 로더의 역할 링커의 역할 * 모듈들 간의 결합 * 외부기호의 주소값을 결정 로더의 역할 * 결합된 모듈의 적재 * 기호의 절대주소 결정
재배치의 개념 상대주소를 절대주소로 전환 재배치 정보는 어셈블러가 생성 로더는 재배치 정보 이용 재배치는 재배치 로더가 담당
이중패스의 필요성 전향참조의 경우 MOV AX, FOUR ADD AX, FIVE MOV SUM, AX ... FOUR DW 4 FIVE DW 5 SUM DW ?
이중패스 어셈블러의 기능 기호표 목적 프로그램 원시 프로 패스2 그램 패스1 링커 오류 및 기타 정보 명령어표 원시 프로그램 사본 패스2 패스1 링커 오류 및 기타 정보 원시프로그램 오류정보 등 명령어표
0000 MAIN SEGMENT ASSUME CS:MAIN, DS: MAIN 0000 8C C8 MOV AX,CS 0002 8E D8 MOV DS, AX 0004 A1 0012 mov ax, four 0007 03 06 0014 add ax, five 000B A3 0016 mov sum, ax 000E B4 4C mov ah, 4ch 0010 CD 21 int 21h 0012 0004 four dw 4 0014 0005 five dw 5 0016 0001 sum dw 1 0018 MAIN ENDS END
어셈블러의 역할 명령어 처리 * 기호표의 작성 어셈블러 지시어 처리 * 지시어표 지시대로 처리 * 명령어에 상응하는 기계코드 생성 * 기호를 기호값으로 대체 어셈블러 지시어 처리 * 지시어표 지시대로 처리
패스1의 기능 명령어표를 참조 명령어들의 상대주소 결정 기호의 재배치 여부 결정 각 기호표 작성
패스2의 기능 명령어 자체를 2진코드로 대체 명령어의 기호대신 기호표에서 찾은 값으로 대체
명령어의 상대주소 상대주소 2 4 6 8 10 원시 코드 MOV AX, FOUR ADD AX, FIVE MOV SUM, AX 2 4 6 8 10 원시 코드 MOV AX, FOUR ADD AX, FIVE MOV SUM, AX FOUR DW 4 FIVE DW 5 SUM DW ? END
기호표의 생성 기호 FOUR FIVE SUM 값(주소) 6 8 10 재배치 여부 1
번역된 코드의 형태 상대주소 2 4 6 8 10 번역된 코드(연상기호) MOV AX, 6 ADD AX, 8 MOV 10, AX 2 4 6 8 10 번역된 코드(연상기호) MOV AX, 6 ADD AX, 8 MOV 10, AX 4 5 -
기억장치에 적재된 형태 주기억장치 100 102 MOV AX, 106 104 106 ADD AX, 108 108 110 5
어셈블러지시어의 역할 어셈블러가 해야 할 역할 지정 FOUR DW 4 TEN EQU 10 상대주소 6에 4를 저장 번역되지 않음 TEN EQU 10 TEN의 값으로 10을 저장 10은 주소가 아니며 상수(재배치할 필요가 없음) TEN을 만나면 10으로 변환
패스1의 알고리즘 procedure pass 1 LC ← 0; repeat{ 다음 명령어를 읽음; if (END 명령어?) 패스1끝; if (기호가 있는가?) if (이미 기호표에 존재?) 이중기호이므로 오류표시;
패스1의 알고리즘 else{ 기호는 기호표에 기입; LC의 값을 기호표에 기입; } LC ← LC + 명령어의 길이: end procedure
패스2의 알고리즘 procedure pass 2 LC ← 0; repeat 다음 명령어를 읽음; if (END 명령어?) 어셈블 끝; if (명령어가 명령어표에 있는가?){ 명령어표에서 기계어코드를 찾음; 기호표에서 기호의 값을 찾음;
패스2의 알고리즘 명령어를 기계어코드로 완성 LC ← LC + 명령어의 길이; } else 정의되지 않은 명령어 오류표시; end procedure
어셈블러 지시어의 처리 if (어셈블러 지시어?) { if (EQU) 기호를 기호표에 기록; 지시어값을 기호값으로 대체; if (DW<값>) 주어진 값만큼 LC증가;
어셈블러 지시어의 처리 if (DW<?>) 확보할 크기 계산 후 LC증가; } else { 명령어표에서 명령어 길이 탐색; LC ← LC + 명령어의 길이:
패스1 순서도 패스1시작 위치계수기 LC←0 다음 명령어를 읽음 기호를 기호표에 기입 LC값을 예 기호값으로 기입 패스1끝 명령어:END 아니오 아니오 기호정의가 있는가? 예 아니오 예 이미 기호 표에 존재 이중으로 정의한 기호 오류표시 LC←LC+명령어의 길이 확장
패스1의 상세 흐름도 어느 종류? 예 어셈블러 지시어 아니오 EQU DW 값 DW ? 명령어표에서 명령어 길이를 찾음 기호를 기호표에 기입하고 이 지시어의 값을 기호의 값으로 한다 주어진 데이터의 크기만큼 LC를 증가시킴 확보해야 할 기억장소의 크기를 계산하여 LC를 증가시킴 LC←LC + 명령어의 길이
패스2 순서도 패스2시작 위치계수기 LC←0 다음 명령어를 읽음 예 명령어:END 패스2끝 아니오 정의되지 않은 명령어, 오류표시 명령어가 명령어표에 있는가? 아니오 예 명령어에서 기계어 코드를 찾음 명령어를 기계어 코드로 완성하여 출력 기호표에서 기호값을 찾음 LC←LC+명령어의 길이 확장
패스2의 상세 흐름도 어느 종류? 예 어셈블러 지시어 EQU 아니오 DW <값> DW ? 연상항에 주어진 명령어표에서 명령어 길이를 찾음 DW <값> DW ? 연상항에 주어진 상수값을 기계어 코드로 출력한다 확보해야 할 기억공간의 크기 결정 기호표에서 기호값을 찾음 명령어를 기계어 코드로 완성하여 출력한다 LC←LC+ 데이터 크기 LC←LC+ 확보해야 할 공간 크기 LC←LC+명령어의 길이
패스1에 관련된 데이터베이스 입력 원시프로그램, 위치계수기(변수) 어셈블러 지시어 & 명령어 표 출력 기호표, 오류정보, 윈시프로그램 사본
패스2에 관련된 데이터베이스 입력 원시프로그램,위치계수기(변수) 어셈블러지시어&명령어표, 기호표 출력 목적 프로그램, 오류정보
명령어표의 예 2진 코드 길 이 2 연상 코드 ADD MOV ... 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 d w mod reg r/w 2 1 0 0 0 1 0 d w mod reg r/w ...
단일패스 어셈블러 단순전향참조 JMP OVER의 처리 10 ADD AX, BX 12 JMP 0 14 MOV... ... 기호 값 확정표기 주소 OVER - 0 12 10 ADD AX, BX 12 JMP 0 14 MOV... ... 30 OVER MOV...
단일패스 어셈블러 다수전향참조처리 10 ADD AX, BX 12 JMP 0 END 14 MOV … 16 JMP 12 ... 기호 값 확정표기 주소 OVER - 0 20 10 ADD AX, BX 12 JMP 0 14 MOV … 16 JMP 12 ... 20 JMP 16 30 OVER MOV … END
제 6 장 요약 어셈블러의 개념 이해 레이블, 외부기호, 내부기호 이해 프로그램의 번역과 실행 이해 이중패스의 필요성 및 기능 이해 패스1과 패스2의 기능 이해 상대주소와 기호의 생성과정 이해 어셈블러지시어 이해 패스1과 패스2의 알고리즘 이해 패스1, 패스2의 순서도 이해 패스1과 패스2에 관련된 DB 이해 명령어표의 구성 이해 단일패스 어셈블러 이해