컴퓨터공학/시스템프로그래밍

시스템프로그래밍 10 - 2 이중 패스 어셈블러의 설계

Arkeiyou 2021. 10. 28. 13:11

용어체크

1. 기호

기호는 프로그램 내의 레이블로서 이용되고 주소를 나타내며, 내부 기호와 외부 기호로 구분된다.

2. 의사 코드

프로그램을 작성할 때 각 모듈이 작동하는 논리를 표현하기 위한 언어이다. 특정 프로그래밍 언어의 문법에 따라 쓰인 것이 아니라, 일반적인 언어로 코드를 흉내 내어 알고리즘을 써놓은 코드를 말한다. 의사 코드는 말 그대로 흉내만 내는 코드이기 때문에, 실제적인 프로그래밍 언어로 작성된 코드처럼 컴퓨터에서 실행할 수 없으며, 특정 언어로 프로그램을 작성하기 전에 알고리즘의 모델을 대략적으로 모델링 하는 데에 쓰인다.

3. 순서도

Flowchart로 다이어그램의 종류 중 하나로 여러 종류의 상자와 이를 이어주는 화살표를 이용해 명령의 순서를 보여주는 알고리즘 혹은 프로세스를 말한다.

 

학습내용
  • 이중 패스 어셈블러 과정
  • 이중 패스 어셈블러 설계 – 알고리즘
  • 이중 패스 어셈블러 설계 - 자료구조
학습목표
  • 이중 패스 어셈블러 과정을 설명할 수 있다.
  • 이중 패스 알고리즘을 설명할 수 있다.
  • 이중 패스 어셈블러의 자료구조를 설명할 수 있다.

 

 

1. 이중 패스 어셈블러 과정

 

 

이중 패스!? -> 어셈블러는 전향 참조를 채택하고 있기 때문에 어셈블러를 이중 패스로 만들어야 한다.

 

1) 어셈블 과정

 

* 패스 1 : 기호의 값을 결정하기 위해서 각 명령어들이 저장될 주소를 결정한다.

명령어는 차례대로 저장되기 때문에 각 명령어의 주소는 명령어의 길이에 따라 결정된다. 명령어의 2진(기계어)코드, 명령어 길이 등은 명령어 표에서 확인할 수 있다.

 

어셈블러로 컴파일할때 소스파일과 어셈블 결과를 출력된 기계어를 대응시킨 리스트 파일을 생성하게 된다. 기호 FOUR은 원시 코드에서 4가 저장된 위치를 나타내기 때문에 이 위치의 상대 주소 6이 FOUR의 값이 된다. 기호표에 있는 값은 적재될 때 재배치되어야 하기 때문에 재배치 여부를 1로 표기한다. 명령어 상대 주소 표

 

 

* 패스 2 : 패스 1에서 생성된 명령어 상대 주소 표기호 표를 이용하여 명령어를 번역한다. 각 명령어를 번역할 때 연산항에 기호가 나타나면 기호 표를 참조하여 해당 값(=상대 주소)을 연산항에 기입한다.

 

적재 시 주소 : 각 명령어에 주어진 주소들은 모두가 상대 주소로 표기된다(0번지 부터 적재된다고 가정). 적재할 때 모든 상대 주소는 절대 주소로 변경된다.

 

주의사항 : 재배치 작업은 링커와 로더에 의해 진행되는데, 어셈블러는 링커와 로더에게 어느 기호의 값을 재배치할 것인지를 알려 주어야 한다. 재배치가 필요한 경우 기호 표에 재배치 여부를 1로 표기하면 된다. 또한 어셈블리 지시어는 목적 프로그램 생성 시 기계어로 번역되지 않는다. 

예_
FOUR DW 4 -> 상대 주소의 위치에 4만 저장함
TEN EQU 10 -> 여기에서 10은 주소가 아닌 상수이기 때문에 프로그램 적재 시 재배치가 필요 없다. 코드의 모든 TEN은 10으로 변경하고, 기호 표에 기록될때 재배치 여부를 0으로 표기한다.

 

 

 

 

 

2. 이중 패스 어셈블러 설계 - 알고리즘

 

 

1) 어셈블러의 역할

 

* 어셈블리 명령어 처리, 어셈블리 지시어 처리 -> 기계어로 바꿔준다(목적 프로그램 생성)

 

* 어셈블리 명령어 처리란? : 

기호 표 작성 - 사용되는 기호명과 기호의 값(상대 주소 또는 상수)을 정리

명령어에 대응하는 기계 코드 생성 - 명령어에 해당하는 2진 기계어 코드를 명령어 표에서 찾아 목적 코드로 변경

기호를 기호의 값으로 대체 - 명령어의 연산항에 표기된 기호를 기호 표를 참조하여 기호의 값(상대 주소 또는 상수)으로 변경

 

* 어셈블리 지시어 처리란? :

지시어 표 - 보통 지시어 처리는 지시어에 해당되는 서브루틴을 호출하여 처리하게 된다. 예를 들어 DW(데이터 저장), END(어셈블 작업 종료) 등이 있다.

 

* 패스 1의 역할 :

명령어 표를 참조 - 명령어의 형태와 크기 참조

명령어들의 상대 주소 결정 - 원시 프로그램의 각 명령어나 데이터들의 상대 주소를 결정. 위치 계수기(LC : Location Counter)라는 변수를 이용하여 변수를 증가시키면서 상대주소를 계산

기호 표 작성 - 기호 표를 만들어 각 기호의 값(상대 주소 또는 상수)을 기록

기호의 재배치 여부 결정 : 재배치 여부 1 또는 0으로 기록

 

* 패스 2의 역할 :

명렁어 자체를 2진 코드로 대체 - 명령어 표에서 각 명령어의 2진 코드를 찾아 기계어 코드로 변환

명령어의 기호를 기호 표에 있는 값으로 대체 - 기호가 등장하면 패스 1에서 생성한 기호 표를 참조하여 해당 값(상대 주소 또는 상수)으로 변환

 

* 예외 사항 : 어셈블러에 따라서, 패스 1에서 기호 표를 만드는 것 뿐만 아니라, 명령어의 기계어 코드까지 변환하기도 한다. 이 경우, 번역된 기계어 코드에서 기호 참조(전향 참조)부분을 미결정 상태로 둔다. 그런 후에 패스 2에서 기호 값을 찾아 기록하는 방식인 것이다. 

 

 

 

2) 어셈블러의 알고리즘

 

패스 1과 패스 2의 역할

 

패스 1 : 명령어 표를 참조(명령어의 크기와 형태), 명령어들의 상대 주소 결정, 기호 표 작성, 기호의 재배치 여부 결정

패스 2 : 명령어 자체를 2진 코드로 대체하고 명령어의 기호를 기호 표에 있는 값으로 대체한다.

 

* 패스 1의 알고리즘

패스 1의 의사 코드(Pseudo-Code)

procedure pass 1
     LC <- 0;
     repeat
          원시 프로그램의 다음 명령어를 읽음;
          if (END 명령어?) 패스 1 끝;
          if (기호가 있는가)
               if (이미 기호 표에 존재)
                    이중으로 정의된 기호이므로 오류 표시;
               else {
                    기호는 기호 표에 기입;
                    위치 계수기 LC의 값을 기호의 값으로 기호 표에 기입;
                    }
               LC <- LC + 명령어의 길이;
      end procedure

패스 1의 순서도(Flow Chart)

패스 1의 추가 고려사항

명령어에는 어셈블리 명령어와 어셈블리 지시어가 있다. 패스 1 알고리즘은 어셈블리 지시어 구분을 위해 코드를 세분화할 필요가 있다. 어셈블리 지시어는 기계어로 변환되지 않는다. 다만, 상수를 정의하거나 주소 지정에 사용되는 경우 데이터의 크기에 따라 LC(위치 계수기)의 증가분이 달라질 수 있다. 따라서, "LC ← LC+명령어의 길이" 부분을 세분화한다. 

 

 

* 패스 2의 알고리즘

패스 2의 의사 코드(Pseudo-Code)

procedure pass 2
     LC <- 0;
     repeat
         원시 프로그램의 다음 명령어를 읽음;
         if (END 명령어?) 어셈블 끝;
         if (명령어가 명령어 표에 있는가) {
             명령어 표에서 명령어에 해당하는 기계어 코드를 찾음;
             기호 표에서 기호 값을 찾음;
             명령어를 기계어 코드로 완성하여 출력
         }
         else
             정의되지 않은 명령어 오류 표시;
         LC <- LC + 명령어의 길이;
     end procedure

패스 2의 순서도(Flow Chart)

패스 2의 추가 고려 사항

패스 2 역시, 어셈블리 지시어에 대한 처리 부분이 필요하다. LC <- LC+명령어의 길이 부분을 세분화

패스 2에서 세부화된 부분의 의사 코드
========================================
     if (어셈블리 지시어) {
         if (DW <값>) {
             연산항에 주어진 상수 값을 기계어 코드로 출력;
             LC <- LC + 데이터 크기
         }
         if (DW) {
             확보해야 할 기억 공간 크기 결정;
             LC <- LC + 확보할 기억 공간 크기;
         }
         if (EQU)
             할일 없음;
     }
     else {
         명령어 표에서 기계어 코드와 명령어 길이를 찾음;
         기호 표에서 기호 값 찾음;
         명령어를 기게어 코드로 완성하여 출력;
         LC <- LC + 명령어;
     }

 

 

 

 

 

3. 이중 패스 어셈블러 설계 - 자료구조

 

 

1) 이중 패스 관련 데이터베이스

 

* 패스 1 관련 데이터 베이스

 원시 프로그램(입력) : 프로그래머가 작성한 원시 프로그램

 명령어 표(입력) : 어셈블리 언어에 정의된 명령어들을 수록

 어셈블리 지시어 표(입력) : 어셈블러가 작업을 할 때 필요한 작업 내용을 명시한 지시어 등을 수록

 기호 표(출력) : 프로그램에 나타난 기호와 정의된 기호의 값을 알기 위해 사용되는 변수

 위치 계수기(변수) : 명령어의 주소를 헤아리기 위한 변수

 

* 패스 2 관련 데이터 베이스

 원시 프로그램(입력)

 명령어 표(입력)

 어셈블리 지시어 표(입력)

 기호 표(입력)

 목적 프로그램(출력) : 번역된 기계어 코드

 위치 계수기LC(변수)

 

 

 

2) 자료 구조

 

 

3) 명령어 표

명령어 표의 구성

니모닉 코드 - 2진 코드

2진 코드 중에서 0 또는 1로 된 부분은 연산 코드를 나타내고, 문자로 표시된 부분은 명령어 형식을 나타낸다. (d, w, mod, reg, r/m 등)

 

 

4) 어셈블리 지시어 표

어셈블리 지시어 표의 구성

지시어 - 지시 내용

지시어 : 니모닉 형태의 지시어 표현. 패스 1과 패스 2에서 지시어를 검색하는 데 사용함

지시 내용 : 각 지시어의 역할을 표현

 

 

5) 기호 표

기호 표의 구성

재배치 : 로더가 프로그램을 주기억장치에 적재할때, 주소 재배치를 해야 하는 기호인지 아닌지를 표현한다. 기호가 주소를 나타내는 경우 재배치가 필요하므로 1로 표현하고, 기호가 상수를 나타내는 경우 재배치가 불필요하므로 0으로 표현한다. 

 


컴퓨터 프로그램 작성 시 프로그램의 순서를 작성하는 순서도의 종류로는 어떤 것들이 있는가?

순서도의 종류로는 시스템 순서도와 프로그램 순서도가 있습니다. 시스템 순서도는 어떤 작업을 하는지 알려주는 순서도로 자료가 정보로 변환되는 과정을 컴퓨터가 처리하는 과정과 데이터의 흐름을 중심으로 도식화한 것입니다. 프로그램 순서도는 작업을 어떤 식으로 하는지 표시해주는 순서도로 처리 단위 하나하나 단위로 작성하게 되며 순서도의 설명의 세밀도에 따라 개략 순서도와 상세 순서도로 나뉘다. 프로그램을 작성할 때 일반적으로 쓰는 순서도입니다. 순서도는 여러 분야에서 프로세스나 문제의 분석, 디자인, 설계, 문서 작성이나 관리 등으로 활용되고 있습니다.


Quiz 01어셈블러를 이중 패스로 구성한 이유는 기호의 전향 참조 때문이다. 단일 패스를 이용하여 기호의 전향 참조를 해결하기 위해서는 기호의 위치를 모두 기억시켜야 한다. 모두 기억해야 하기 때문에 메모리가 많이 필요하다. 또한 기호의 값이 결정되면 전향 참조가 발생했던 장소를 찾아 값을 치환해주어야 한다.

  • 1 O
  • 2 X

정답 :1

해설 :이중 패스와 단일 패스에 대해 잘 설명되었다.

 

 

 

Quiz 02이중 패스 어셈블러의 패스 1의 처리에서 명령어나 데이터들이 위치가 포함된 장소를 무엇이라 하는가?

  • 1 위치 계수기 LC
  • 2 인덱스 레지스터
  • 3 재배치 레지스터
  • 4 플래그 레지스터

정답 :1

해설 :위치 계수기에 대한 설명이다.

 

 

 

Quiz 03다음 중 이중 패스 어셈블러에서 패스 2의 입력 정보가 아닌 것은?

  • 1 실인수표
  • 2 기호표
  • 3 명령어표
  • 4 리터럴표

정답 :1

해설 :패스 2 관련 입력 정보로는 원시 프로그램, 명령어표, 어셈블리 지시어표(리터럴표), 기호표이다.


이중 패스 어셈블러 과정

  • 패스 1은 각 기호의 값을 결정하기 위해서는 각 명령어들이 저장될 주소를 결정한다. 명령어 상대 주소표와 기호표를 생성한다.
  • 패스 2는 패스 1에서 생성된 명령어 상대 주소표와 기호표를 이용하여 명령어를 번역한다. 각 명령어를 번역할 때 연산항에 기호가 나타나면 기호표를 참조하여 해당 값(상대주소)을 연산항에 기입한다. 적재할 때 모든 상대 주소는 절대 주소로 변경된다.
  • 주의 사항은 재배치 작업은 링커와 로더에 의해 진행되며, 어셈블러는 링커와 로더에게 어느 기호의 값을 재배치 할 것인지를 알려주어야 한다. 재배치가 필요한 경우에는 기호표에 “재배치 여부”를 1로 표기해야 한다. 또한 어셈블리 지시어는 목적 프로그램 생성시 기계어로 번역되지 않는다.

 

이중 패스 어셈블러 설계 - 알고리즘

  • 어셈블러의 역할은 어셈블리 명령어 처리와 어셈블리 지시어 처리이다.
  • 어셈블리 명령어 처리의 역할은 기호표 작성과 명령어에 대응하는 기계 코드를 생성하고, 기호를 기호의 값으로 대체한다.
  • 어셈블리 지시어 처리의 역할은 지시어 표로 보통 지시어 처리는 지시어에 해당되는 서브루틴을 호출하여 처리한다.
  • 패스 1의 역할은 명령어 표 참조, 명령어들의 상대 주소 결정, 기호표 작성, 기호의 재배치 여부를 결정한다.
  • 패스 2의 역할은 명령어 자체를 2진 코드로 대체하고, 명령어의 기호를 기호표에 있는 값으로 대체한다.
  • 예외 사항으로는 어셈블러에 따라서 패스1에서 기호표를 만드는 것 뿐만 아니라, 명령어의 기계어 코드까지 변환하기도 한다.

 

이중 패스 어셈블러 설계 - 자료구조

  • 패스 1 관련 데이터 베이스는 원시 프로그램(입력), 명령어표(입력), 어셈블리 지시어 표(입력), 기호표(출력), 위치 계수기(변수)이다.
  • 패스 2 관련 데이터 베이스는 원시 프로그램9입력), 명령어표(입력), 어셈블리 지시어 표(입력), 목적 프로그램(출력), 위치 계수기 LC(변수)이다.
  • 명령어 표의 구성으로 니모닉 코드는 MOV,ADD와 같이 어셈블러에서 표현되는 어셈블리 명령어의 형태이며, 2진 코드는 니모닉 코드와 대체 가능한 기계어 코드로, 패스2에서 목적 프로그램 생성 시 이 기계어 코드를 출력한다. 명령어 길이는 명령어가 차지하게 되는 기억 공간의 크기를 바이트 단위로 표기로, 패스 1에서 기호의 상대 주소를 계산하기 위해 사용된다.
  • 어셈블리 지시어 표의 구성으로 지시어는 니모닉 형태의 지시어 표현, 패스 1과 패스 2에서 지시어를 검색하는데 사용한다.
  • 기호표의 구성(패스 1에서 생성)에서 기호는 원시 프로그램에서 사용된 모든 기호를 정리하고, 패스 2에서 기호를 검색하는데 사용한다. 값은 주소를 나타내는 기호인 경우 상대 주소가 표현하며 패스 2에서 기호의 값을 변환하는데 사용한다.
  • 재배치는 로더가 프로그램을 주기억장치에 적재할 때 주소 재배치를 해야 하는 기호인지 아닌지를 표현한다. 1이면 재배치가 필요하며 0이면 재배치가 불필요하다.