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

시스템프로그래밍 10 - 1 어셈블러 개요

Arkeiyou 2021. 10. 25. 00:50

용어체크

1. 어셈블러

어셈블리언어로 작성된 원시 프로그램을 기계어로 번역하는 프로그램이다. 어셈블리언어는 대부분의 명령어가 기계어와 일대일 대응된다.

2. 링커

두 개 이상의 목적 프로그램을 합쳐서 실행 가능한 한 개의 프로그램으로 만드는 작업을 하는 프로그램으로 적재 모듈을 만들 때, 프로그램을 적재하기 전 각 모듈들의 상대 위치만을 결정해 준다. 연결기(linker)라 한다.

3. 로더

컴퓨터에 프로그램을 읽어 넣기 위한 프로그램 루틴으로 운영체제가 결정해 주는 주소에서부터 적재 모듈을 적재해 준다.

 

학습내용
  • 어셈블러의 역할
  • 어셈블러의 입력과 출력
  • 이중 패스 어셈블러 필요성
학습목표
  • 어셈블러의 개념을 이해하고 프로그램 작성과 실행 단계를 설명할 수 있다.
  • 어셈블러의 입출력에 대해 설명할 수 있다.
  • 어셈블러 이중 패스의 필요성 및 기능을 설명할 수 있다.

 

 

1. 어셈블러의 역할

 

 

1) 기계어를 코드로 변환해주는 프로그램

 

인터프리터 : 원시 프로그램을 줄 단위로 입력받아 바로 해석하고 실행

BASIC, LISP, PROLOG, R, Python

 

컴파일러 : 원시 프로그램을 일괄적으로 번역하여 목적 프로그램인 실행 파일을 생성

COBOL, FORTRAN, ALGOL, PASCAL

C, TC, GCC, C++

Visual BASIC, Delphi, Java 등

 

 

2) 어셈블리어 작성과 실행 단계

 

어셈블러의 역할

① 어셈블리어로 쓰여진 원시 프로그램을 입력으로 받아 목적 프로그램을 생성

② 링커와 로더가 필요로 하는 형식에 따라 정보를 제공한다.

 

 

 

 

2. 어셈블러의 입력과 출력

 

 

1) 어셈블러

 

어셈블러의 입력

원시 프로그램(어셈블리어로 쓰여진)

보조기억장치에 저장

 

어셈블러의 출력

목적프로그램

보조기억장치에 출력되어 저장

 

 

2) 프로그램의 연결 구조

 

주 프로그램

명령어의 연산항 지정 방식( = 주소 지정 방식)

값 즉시 지정 방식

직접 주소 지정 방식

간접 주소 지정 방식

일반적으로 상대 주소를 많이 사용한다

 

부 프로그램

명령어 ENDP는 부 프로그램이 끝났음을 나타냄

부 프로그램이 실행이 끝나면 주 프로그램이 계속하여 실행됨

 

상대 주소를 나타내는 기호(또는 표지 기호)는 이 프로그램 어딘가에 정의되어 있어야만 한다. 

 

* 외부 참조 *

어셈블러는 각 모듈들을 독립적으로 어셈블함

각 모듈은 주기억작치의 0번지부터 적재되는 것으로 가정하고 어셈블함

임시로 만들어진 주소는 상대 주소로서 실제 적재(Load)되면, 이 모듈이 적재되기 시작하는 주소를 더하여 실제 적재 주소를 알 수 있음

 

기호의 주소

 

기호의 정의가 같은 모듈에 있는 경우

내부 기호

어셈블 할 때 기호가 가리키는 주소를 알 수 있음

 

기호의 정의가 다른 모듈(또는 부 프로그램)에 있는 경우

외부 기호

어셈블할 때 기호가 가리키는 주소를 알 수 없음

 

 

외부 참조는 외부에서 정의된 기호 또는 모듈의 이름을 이용하는 것을 의미한다. 어셈블러는 각 모듈을 독립적으로 어셈블하기 때문에 외부 기호가 가리키는 주소를 결정할 수 없다.

 

외부 참조에서 링커와 로더의 역할

 

링커 : 적재 모듈을 만들 때, 프로그램을 적재하기 전 각 모듈들의 상대 위치만을 결정함. 프로그램이 기억장치의 주소 0번지부터 적재된다고 가정하고 기호 값을 결정한다. 

로더 : 운영체제가 결정해주는 주소에서부터 적재 모듈을 적재한다. 이때, 비로소 프로그램의 모든 기호가 실제 기억장치의 절대 주소로 바뀌게 된다.

 

재배치

실제 주소를 결정할 때, 프로그램 내에 있는 모든 상대 주소(데이터의 값 또는 명령어의 연산항이 있는 주소)의 값이 바뀌는 것을 말함. 로더는 이와 같이 재배치되어야 할 주소가 어디 있는지 알아야 함(어셈블러가 제공). 어셈블러는 번역된 목적 코드 외에 재배치가 필요한 주소들을 나타내는 정보도 만듦.

 

 

 

 

3. 이중 패스 어셈블러 필요성

 

 

1) 기호 참조 방식

 

전향 참조(Forward Reference) : 어떤 기호가 정의되지 않은 상태에서 기호를 사용

후향 참조(Backward Reference) : 어떤 기호가 정의된 후에 기호를 사용

 

프로그램을 번역할 때는 명령어 하나씩 읽으며 2진수로 된 2진 코드로 번역하게 됨.

 

어셈블리어는 전향 참조 방식을 허용한다. 원시 프로그램을 한 번에 목적 프로그램으로 번역할 수 없기 때문이다. 따라서 이중 패스 과정을 통해서 어셈블된다. 패스 1 : 각 기호의 값만을 결정. 패스 2 : 결정된 각 기호의 값을 이용하여 번역을 완성. 

 

기호 참조 방식의 필요성 : 어셈블리어는 전향 참조 방식을 허용

즉 전향 참조는 이중 패스로 해야만 번역을 완성할 수 있기 때문에 필요하다. 

 

 

 


컴퓨터 시스템에서 프로그램이 실행되기 위해서 필요한 것은 어떤 것이 있을까?

컴퓨터 시스템에서 실행 가능한 프로그램을 만드는 시스템 소프트웨어로는 인터프리터, 컴파일러, 어셈블러와 같이 기계어로 번역해주는 프로그램이 필요합니다. 번역된 프로그램은 링커와 로더에 의하여 실행할 수 있게 됩니다.


Quiz 01어셈블러의 입력은 어셈블리어로 쓰여진 원시 프로그램으로 주기억장치에 저장된다. 어셈블러의 출력은 목적 프로그램으로 보조 기억장치에 출력되어 저장된다.

  • 1 O
  • 2 X

정답 :2

해설 :어셈블리어의 원시 프로그램도 보조 기억장치에 저장된다.

 

 

 

Quiz 02다음 설명 중 어셈블러의 기능에 대해 잘못 설명된 것은?

  • 1 원시 프로그램 내의 어셈블리 명령어를 기계어 코드로 변환시켜준다.
  • 2 다른 모듈의 기호에 대한 외부 참조에 대해서는 링커의 링킹 처리를 위해 정보를 생성하여 치환한다.
  • 3 원시 프로그램을 컴파일하여 기계어 코드로 변환하는 작업을 해준다.
  • 4 내부 참조 기호에 대해서는 주소 변환을 수행한다.

정답 :3

해설 :원시 프로그램을 컴파일 하는 것은 컴파일러에 대한 설명이다.

 

 

 

Quiz 03다음 빈칸에 들어갈 내용으로 알맞은 것은?
외부에 정의된 기호 또는 모듈의 이름을 이용하는 것을 ( )라고 하고, 이러한 현상을 해결하여 모듈의 이름 또는 기호가 가리키는 주소값을 결정하는 것은 ( )이다.

  • 1 내부 참조, 링커
  • 2 후향 참조, 로더
  • 3 전향 참조, 어셈블러
  • 4 외부 참조, 링커

정답 :2

해설 :어셈블러는 각 모듈을 독립적으로 어셈블한다. 이중 패스에 의하여 후향 참조의 경우 기호가 정의된 후에 모듈을 이용하고 모듈의 이름 또는 기호가 가리키는 주소값을 결정하는 것은 로더이다.


어셈블러의 역할

  • 인터프리터는 원시 프로그램을 줄 단위로 입력 받아 바로 해석하고 실행해 주는 프로그램으로 문장이 입력되면 문장들의 기능을 정의하고 그 기능대로 수행한다. 대표 언어로는 BASIC, LSIP, PROLOG, R, Python 등이 있다.
  • 컴파일러는 원시 프로그램을 일괄적으로 번역하여 목적 프로그램인 실행 파일을 생성해 주는 프로그램이다. 대표 언어로는 COBOL, FORTRAN, ALGOL, C, C++, Visual Basic 등이 있다.
  • 어셈블러는 어셈블리언어를 기계어로 번역하는 프로그램으로 어셈블리어는 대부분의 명령어가 기계어와 일대일 대응한다.
  • 어셈블러의 역할은 어셈블리어로 쓰여진 원시 프로그램을 입력으로 받아 목적 프로그램을 생성하고 링커와 로더가 필요로 하는 형식에 따라 정보를 제공해야 한다.

 

어셈블러의 입력과 출력

  • 어셈블러는 주기억장치에 적재되어 실행되는 하나의 프로그램이다.
  • 어셈블러의 입력은 원시 프로그램(어셈블리어로 쓰여진)으로 보조 기억장치에 저장된다.
  • 어셈블러의 출력은 목적 프로그램, 보조 기억장치에 출력되어 저장된다.
  • 프로그램의 실행 순서는 명령어 포인터(IP)에 기록된 명령어의 주소에 의해서 조절한다. 부 프로그램을 호출하는 것도 이 부 프로그램이 저장된 주소를 IP에 기록하는 것으로 해결된다. 이때의 주소는 부 프로그램(또는 서브루킨)의 이름(기호)을 대신 사용하며, 표지 기호(Label)를 상대 주소로 이용한다.
  • 명령어의 연산항 지정 방식(주소 지정 방식)은 값 즉시 지정방식, 직접 주소 지정방식, 간접 주소 지정방식이 있다.
  • 외부 참조란 기호의 주소(내부 기호), 기호의 정의가 다른 모듈에 있는 경우(외부 기호) 각 모듈을 독립적으로 어셈블 하기 때문에 외부 참조한다.
    • 링커는 적재 모듈을 만들 때 프로그램을 적재하기 전 각 모듈들의 상대 위치만을 결정한다.
    • 로더는 운영체제가 결정해 주는 주소에서부터 적재 모듈을 적재한다.
    • 재배치는 실제 주소를 결정할 때, 프로그램 내에 있는 모든 상대 주소의 값이 바뀌는 것을 말한다.

 

이중 패스 어셈블러 필요성

  • 전향 참조는 어떤 기호가 정의되지 않은 상태에서 기호를 사용한다.
  • 후향 참조는 어떤 기호가 정의 된 후에 기호를 사용한다.
  • 어셈블리어는 전향 참조 방식을 허용한다. 원시 프로그램을 목적 프로그램으로 번역할 수 없다.
  • 이중 패스 과정에서 패스 1은 각 기호의 값만을 결정하고, 패스 2는 결정된 각 기호의 값을 이용하여 번역을 완성한다.
  • 필요성으로 전향 참조는 이중 패스로 해야 번역을 완성할 수 있기 때문에 이중 패스 어셈블을 한다.