Lecture #10 8086 어셈블러 설계
학습내용 어셈블러의 개요 이중 패스 어셈블러의 필요성 및 기능 패스-1 & 패스-2의 알고리즘 어셈블러, 링커, 로더의 역할 이중 패스 어셈블러의 필요성 및 기능 어셈블러의 역할 패스1, 패스2의 기능 명령어의 상대주소와 기호표의 생성 패스-1 & 패스-2의 알고리즘 패스-1 & 패스-2와 관련된 데이터베이스 단일 패스 어셈블러의 처리과정
어셈블러의 개요 어셈블리 명령어의 기계어 코드 번역 일반적으로 이중 패스(패스1 & 패스2)로 구성 기계어와 일대일 대응으로 번역 작업과정이 컴파일러보다 간단 입력- 어셈블리 소스 프로그램 출력- 목적 코드 파일(Object Code File) 일반적으로 이중 패스(패스1 & 패스2)로 구성 어셈블리 프로그램에서 변수 및 상수에 대한 전향 참조(Forward Reference)를 허용 패스1 과정 – 변수 및 상수에 대한 심볼 테이블 구성 패스2 과정 – 어셈블리 명령어를 기계어 코드로 변환
프로그램의 작성 및 실행 과정 원시 모듈 목적 모듈 적재모듈 목적모듈 원시 모듈 목적 모듈 링커 원시 모듈 목적 모듈 컴파일러 어셈블러 원시 모듈 목적 모듈 적재모듈 목적모듈 컴파일러 어셈블러 원시 모듈 목적 모듈 링커 원시 모듈 컴파일러 어셈블러 목적 모듈 주기억장치 로더 실행
어셈블러의 역할 어셈블리 원시 프로그램 모듈을 입력으로 받아 독립적으로 번역하여 목적 프로그램 모듈을 생성 후처리(링커 & 로더)에 필요한 형식에 맞추어 목적 모듈을 생성 번역 과정 원시 프로그램내의 어셈블리 명령어를 기계어 코드로 변환 내부 참조 기호에 대해서는 주소 변환을 수행 다른 모듈의 기호에 대한 외부 참조(external reference)에 대해서는 링커의 링킹(linking) 처리를 위해 정보를 생성하여 치환
외부 참조 변수는 링킹 정보로 변환, 링커에 의해 주소로 변환 명령어와 기호(Symbol) 어셈블리 명령어는 기계어로 변환 MOV AX,FOUR ... FOUR DW 40 MAIN CALL CLRMEM CLRMEM PROC MOV AX,BX CLRMEM ENDP … ① 내부 참조 변수는 모듈 내의 상대 주소로 변환 … ② 외부 참조 변수는 링킹 정보로 변환, 링커에 의해 주소로 변환
링커와 로더의 역할 링커(Linker)의 역할 로더(Loader)의 역할 목적 모듈들을 결합하여 적재 모듈(Load Module)을 생성 적재 모듈 생성시에 여러 모듈들의 상대적인 위치를 결정 하여 배열 외부 기호의 상대적인 주소값을 결정하여 외부 참조 부분을 치환한다 생성된 적재 모듈은 재배치 가능(Relocatable) 로더(Loader)의 역할 실행을 위하여 적재 모듈을 메모리에 적재 프로그램의 상대 주소에 대해 절대 주소가 결정
재배치(Relocation)의 개념 프로그램의 주소 공간은 메모리에서 적재되는 위치에 따라 달라진다 프로그램내의 주소는 상대 주소를 이용하여 표현 프로그램을 적재하여 실행할 때에 상대주소를 절대주소로 전환하여 사용 재배치 정보는 어셈블러가 생성 로더는 재배치 정보이용 재배치는 재배치 로더(Relocation Loader)가 담당
어셈블러, 링커, 로더의 역할 로더 목적모듈 AA 원시모듈 AA 어셈 블러 MOV...... ......... 원시모듈 BB (상대주소)(목적코드) 0 MOV ... 2 ....... ... . 11 MOV...... ......... 원시모듈 BB 목적모듈 BB 어셈 블러 ADD...... ......... (상대주소)(목적코드) 0 ADD ... 2 ....... ... . 5 기억장치 물리주소 적재모듈 (상대주소)(목적코드) 0 MOV ... 2 ....... ... 12 ADD ... 100 MOV.... ... ADD.... 링 커 102 로더 112 ... 117
이중 패스 어셈블러 이중 패스 처리의 필요성 MOV AX,FOUR ADD AX,FIVE MOV SUM,AX ... 어셈블리 프로그램에서 변수 및 상수 그리고 프로시저에 대한 전향 참조(Forward Reference)를 허용 전향 참조 예: MOV AX,FOUR ADD AX,FIVE MOV SUM,AX ... FOUR DW 4 FIVE DW 5 SUM DW ?
이중 패스 어셈블러의 기능 기호표 리터럴테이블 목적 프로그램 원시 프로 그램 원 시 프로그램 사 본 패스-1 패스-2 링커 원 시 프로그램 사 본 패스-1 패스-2 링커 오류 및 기타 정보 원시프로그램 오류정보 등 명령어표
어셈블러의 동작 어셈블리 명령어 번역 어셈블러 지시어 처리 기호표(Symbol Table) 작성 어셈블리 명령어에 상응하는 기계어 코드 생성 기호를 주소값으로 변환 어셈블러 지시어 처리 지시어표(Assembler Directive Table) 지시대로 처리 e.g) DW, EQU 등
패스-1의 기능 명령어표(Instruction Table)를 참조하여 명령어와 데이터의 상대 주소를 결정 상대 주소를 추적하기 위해 위치 계수기(LC:Location Counter) 변수를 사용 기호표(Symbol Table) 작성 프로그램 내에서 사용한 기호와 이를 대치할 주소값을 가진 기호표를 작성 기호의 재배치 여부 결정하여 기호표 내에 명시
명령어의 상대주소 상대주소 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 LC 변수를 이용하여 상대 주소를 trace
기호표의 생성 기호 FOUR FIVE SUM 값(주소) 6 8 10 재배치 여부 1
패스-2의 기능 명령어표를 이용하여 명령어 자체를 2진 코드로 대체 기호의 전향 참조에 대해 기호표에서 찾은 주소값으로 대체 교재의 경우 연상코드 사용 기호의 전향 참조에 대해 기호표에서 찾은 주소값으로 대체 내부 참조 변수에 대해 모듈 내의 상대 주소로 변환 외부 참조 변수에 대해 링킹 정보로 변환 링커에 의해 상대 주소로 변환
번역된 코드의 형태 상대주소 번역된 코드(연상기호) MOV AX, [6] 2 ADD AX, [8] 4 MOV [10], AX 2 4 6 8 10 번역된 코드(연상기호) MOV AX, [6] ADD AX, [8] MOV [10], AX 4 5 -
기억장치에 적재된 형태 주기억장치 100 102 104 106 108 110 MOV AX, 106 ADD AX, 108 5
어셈블러 지시어의 역할 어셈블러가 번역과정에서 수행할 기능을 지정 예 1) FOUR DW 4 예 2) TEN EQU 10 상대주소 6에 4를 저장하고 번역되지는 않음 예 2) TEN EQU 10 TEN의 값으로 10을 저장, 10은 주소가 아니며 상수(재배치할 필요가 없음)
패스-1 과정의 알고리즘 (1) Procedure pass_1 { LC ← 0; repeat { 다음 명령어를 읽음; if (END 명령어?) 패스1끝; if (기호가 있는가?) { if (이미 기호표에 존재?) 이중 기호이므로 오류표시;
패스-1의 알고리즘 (2) else { 기호는 기호표에 기입; LC의 값을 기호표에 기입; } LC ← LC + 명령어의 길이: } until (EOF(source_file))
어셈블러 지시어의 처리 (1) if (어셈블러 지시어?) { if (EQU) { 기호를 기호표에 기록; 지시어값을 기호값으로 대체; } if (DW<값>) { 주어진 값만큼 LC증가;
어셈블러 지시어의 처리 (2) if (DW<?>) { 확보할 크기 계산 후 LC증가; } else { 명령어표에서 명령어 길이 탐색; LC ← LC + 명령어의 길이:
패스-1 순서도 패스1시작 위치계수기 LC←0 다음 명령어를 읽음 기호를 기호표에 기입 LC값을 예 기호값으로 기입 패스1끝 명령어:END 아니오 아니오 기호정의가 있는가? 예 아니오 예 이미기호 표에 존재 이중으로 정의한 기호 오류표시 LC←LC+명령어의 길이
패스-1 순서도 예 어셈블러 지시어 어느 종류? 아니오 EQU DW 값 DW ? 명령어표에서 명령어 길이를 찾음 기호를 기호표에 기입하고 이 지시어의 값을 기호의 값으로 한다 주어진 데이터의 크기만큼 LC를 증가시킴 확보해야 할 기억장소의 크기를 계산하여 LC를 증가시킴 LC←LC + 명령어의 길이
패스-2의 알고리즘 (1) Procedure pass_2 { LC ← 0; repeat { 다음 명령어를 읽음; if (END 명령어?) 어셈블 끝; if (명령어가 명령어표에 있는가?) { 명령어표에서 기계어코드를 찾음; 기호표에서 기호의 값을 찾음;
패스-2의 알고리즘 (2) 명령어를 기계어코드로 완성 LC ← LC + 명령어의 길이; } else 정의되지 않은 명령어 오류표시; } Until(EOF(source_file))
패스-2 순서도 패스2시작 위치계수기 LC←0 다음 명령어를 읽음 예 명령어:END 패스2끝 아니오 정의되지 않은 명령어, 오류표시 명령어가 명령어표에 있는가? 아니오 예 명령어에서 기계어 코드를 찾음 명령어를 기계어 코드로 완성하여 출력 기호표에서 기호값을 찾음 LC←LC+명령어의 길이
패스-2 순서도 어느 종류? 예 어셈블러 지시어 EQU 아니오 DW <값> DW ? 연상항에 주어진 확보해야 할 명령어표에서 명령어 길이를 찾음 DW <값> DW ? 연상항에 주어진 상수값을 기계어 코드로 출력한다 확보해야 할 기억공간의 크기 결정 기호표에서 기호값을 찾음 명령어를 기계어 코드로 완성하여 출력한다 LC←LC+ 데이터 크기 LC←LC+ 확보해야 할 공간 크기 LC←LC+명령어의 길이
패스-1 관련 데이터 구조 입력 출력 원시프로그램 기호표 위치계수기(변수) 리터럴표 어셈블러지시어표 오류정보 명령어표 윈시프로그램 사본
명령어표의 예 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 ...
패스-2 관련 데이터 구조 입력 출력 원시프로그램 위치계수기(변수) 어셈블러지시어표 명령어표 기호표 리터럴표 목적 프로그램
단일 패스 어셈블러 (1) 단일 패스를 이용한 단순전향참조 해결 어셈블리 명령어 번역과 기호에 대한 정보 수집을 동시에 수행 기호 위치에 후처리(Postprocessing)를 위한 표시 처리 기호표(Symbol Table)에 후처리 위치 정보를 저장 번역과정을 끝나면 기호표의 정보를 이용하여 후처리를 수행 기호 위치에 기호값, 즉 주소값을 대치 다수 전향 참조도 처리 가능
단일 패스 어셈블러 (2) 기호 값 확정표기 주소 10 ADD AX, BX OVER - 0 12 12 JMP OVER 기호 값 확정표기 주소 OVER - 0 12 10 ADD AX, BX 12 JMP OVER 14 MOV... ... 20 JMP OVER 30 OVER MOV... 10 ADD AX, BX 12 JMP 0 ...
단일 패스 어셈블러 (3) 기호 값 확정표기 주소 10 ADD AX, BX OVER - 0 20 12 JMP OVER ... 20 JMP 12 기호 값 확정표기 주소 OVER - 0 20 10 ADD AX, BX 12 JMP OVER 14 MOV... ... 20 JMP OVER 30 OVER MOV...
단일 패스 어셈블러 (4) 10 ADD AX, BX 기호 값 확정표기 주소 12 JMP OVER OVER - 0 20 14 MOV... ... 20 JMP 30 30 OVER MOV... 기호 값 확정표기 주소 OVER - 0 20 10 ADD AX, BX 12 JMP 0 ... 20 JMP 12 30 OVER MOV... 기호 값 확정표기 주소 OVER - 0 12
단일 패스 어셈블러 (5) 10 ADD AX, BX 기호 값 확정표기 주소 12 JMP 30 OVER - 0 12 14 MOV... ... 20 JMP 30 30 OVER MOV... 기호 값 확정표기 주소 OVER - 0 12 10 ADD AX, BX 12 JMP 0 ... 20 JMP 30 30 OVER MOV... 기호 값 확정표기 주소 OVER - 0 0