㉠   어셈블리 언어의 개요

  1) 어셈블리 언어의 개념

    프로그래밍 언어는 표현하는 방식에 따라 고급 언어, 저급 언어, 기계어로 구분된다.
     

    고급 언어 (High level language) : FORTRAN, PASCAL, COBOL, C 언어 등

    저급 언어 (Low level language) : 어셈블리어

    기계어 (Machine language) : 기계 고유의 언어


    이러한 언어들은 사용상 여러 가지 특성을 가지므로 프로그램 작성자는 사용 목적에 따라 적절한 언어를 선택하여 사용한다.

  2) 기계어

    일반적으로 프로그래밍을 할 때 BASIC, FORTRAN, PASCAL, C 언어와 같은 고급 언어를 사용한다. 이러한 고급 언어를 사용하는 이유는 고급 언어의 체계가 쉽게 프로그램을 작성할 수 있도록 만들어져 있기 때문이다. 그러나 컴퓨터의 하드웨어가 고급 언어를 이해하고 실행할 수 없기 때문에, 하드웨어가 이해할 수 있는 기계어로 변환되어야 한다.

    고급 언어로 작성한 프로그램은 그림과 같이 프로그램 컴파일러에 의하여 컴파일 과정을 거쳐야 기계어로 실행될 수 있다.


    기계어는 일련의 0과 1로 표시되며 실행할 명령, 데이터, 기억 장소의 주소 등을 포함한다. 예를 들어, 변수명 A에 데이터 값 3을 저장하는 고급 언어의 치환문을 생각해 보자.

    A=3

    이란 문장을 기계어로 나타내면 다음과 같은 비트 형태로 표시될 수 있다.

    11000111 00000110 00000000 00000000 00000011 00000000

    저장 명령 A의 주소 데이터 값

    위의 기계어는 저장 명령, 데이터를 저장할 기억 장소의 주소, 저장할 데이터를 포함하며 이 기계어가 주기억장치에서 중앙 처리 장치 (CPU)로 불려져 나오면 중앙 처리 장치의 하드웨어 각 부분의 의미를 해독한 후, 제어 신호를 발생시켜 데이터를 지정된 기억 장소에 저장하게 된다.

    이처럼 기계어는 하드웨어가 직접 실행시킬 수 있는 형태로 구성되며 컴퓨터의 모든 하드웨어를 제어하기 위한 다양한 비트 형식을 가지고 있다.

  3) 어셈블리어

    기계어는 하드웨어를 제어하기 위하여 다양한 비트 형식을 가지고 있지만 프로그램을 기계어로 작성한다는 것은 매우 어려운 일이다. 무수히 많은 비트 형식을 외워야 할뿐만 아니라 기억 장소의 주소를 일일이 직접 지정한다는 것은 여간 불편한 일이 아니다. 이러한 프로그래밍 상의 비효율성을 극복하기 위하여 기계어의 비트 형식을 연상 코드 (Mnemonic code)로 나타낸 것이 어셈블리어이다. 연상 코드란 기계어의 비트 형식이 나타내는 의미를 심벌(Symbol)로 표현한 것으로 프로그램을 이해하거나 작성하기가 쉽다.

    예를 들어, 위에서 사용한 기계어를 어셈블리어로 나타내면 다음과 같다.

    MOV   A, 3

    이러한 표현에서 3이라는 데이터를 A라는 기억 장소에 저장하라는 의미로 쉽게 이해할 수 있다. 따라서 어셈블리어의 연상 코드는 기계어로 직접 변환이 가능하며 쉽게 프로그램을 작성할 수 있는 장점을 가진다.

    어셈블리어로 작성한 프로그램을 실행하기 위해서는 기계어로 변환하여야 하는데, 이것은 그림과 같이 어셈블러(Assembler)에 의하여 이루어지며 이 과정을 어셈블리(Assembly)라고 부른다. 어셈블리 과정은 컴파일 과정보다 빨리 수행되는데, 그 이유는 어셈블리어 체계가 기계어 체계와 유사하기 때문이다.

    일반적으로 어셈블리어로 프로그래밍을 하는 이유는 다음과 같이 요약할 수 있다.

    (1) 컴퓨터 하드웨어의 구성 요소들을 직접 억세스하려고 할 때
    (2) 컴파일러를 설계하거나 시스템 프로그램을 작성하려고 할 때
    (3) 빠른 수행이 필요한 프로그램을 작성하려고 할 때
    (4) 기억 장소를 적게 차지하거나 입출력 장치를 보다 효율적으로 사용하려고 할 때

    이러한 목적으로 어셈블리 프로그램을 작성할 때, 고급 언어와는 달리 어셈블리어의 명령어와 문법 체계 외에도 데이터의 표현 방식과 사용하려는 컴퓨터의 프로세서에 대한 기초 지식을 가지고 있어야 한다.

    8086 어셈블리 언어의 명령 형식의 형식을 예로 들어보면 다음과 같다.

    ◎ 8086 어셈블리 명령 형식

     

    MAIN:

    DJNZ

    B LOOP

    ; B레지스터를 1감소시킨 뒤, 0이 아니면 B로 분기

    Label 부

    Operation 부

    Operand 부

    Command 부

    ◈ Label 부

    ⑴ 생략 가능 (기호 번지 지정시 사용)
    ⑵ 8문자 이내의 영문자/숫자 사용
    ⑶ 예약어는 사용할 수 없다
    ⑷ 오퍼레이션부 다음부터 생략할 수 있다
    ⑸ 이름 중에 공백이 있으면 안된다
    ◈ Operation 부
    ⑴ 명령의 니모믹 및 어셈블러 디렉티브(Directive) 등을 쓴다
    ☞ 니모닉 : 어셈블리 언어에 예약되어 있는 명령어
    ☞ 디렉티브 : 프로그램 실행과 관계없이 어셈블러에게 정보를 제공해 주는 지시어
    ◈ Operand 부
    ⑴ 레지스터 이름, 정수, 라벨, 연산자, 주소 등을 쓴다
    ⑵ 숫자의 진수를 표시할 경우는 숫자 바로 뒤에 다음과 같은 문자를 쓴다
    ☞ B : 2진수, O : 8진수, D : 10진수, H : 16진수
    ☞ 문자를 생략하면 10진수로 자동 해석한다
    ⑶ 16진수 값을 적을 때 첫 번째 숫자가 영문자(A∼F)로 시작되면, Label과 구분하기 위해 앞쪽에 0을 붙여 사용한다
    ⑷ 문자열은 어포스토로피(')로 둘러싼다
    ⑸ 오퍼랜드부가 필요 없으면 생략 가능하다
    ◈ Command 부
    ⑴ 프로그램 설명(주석)에 사용된다
    ⑵ 생략 가능하다
    ⑶ 기재할 때는 세미콜론(;)으로 시작하여야 한다
    ⑷ 어셈블러는 Command부를 모두 무시하기 때문에 아무데나 사용하여도 된다