본문 바로가기

04번. IT 힌트얻기/▶ 이론

[Basic-1] 2. 어셈블리어


■  어셈블리어 ( assembly language )의 의미와 유래

초창기의 컴퓨터는 진공관과 전선의 배선을 통해서 만들어진 것이라 프로그램도 배선을 변경시켜야 가능했습니다.
수 천 개의 전선을 바꾸어가면서 프로그램을 하는 일은 사실상 불가능에 가까운 매우 힘들고 지루한 일입니다.
그러나 폰노이만 방식의 컴퓨터 이후 프로그래머는 메모리의 값을 이용한 프로그램이 가능해졌고, 프로그램 속도와 수정 속도가 빨라졌습니다.

그러나 여전히 0과 1의 이진수로 프로그램을 하는 것은 마찬가지였기 때문에 프로그램 작업은 여전히 힘들었습니다. 
사람들은 이진수의 패턴을 이용한 프로그램을 좀더 편하게 하기 위하여 새로운 형식의 프로그램 방법을 도입합니다.
그것은 몇 가지 비트 패턴을 하나의 명령어로 대신할 수 있는 비트 패턴 명령어를 사용하는 방법입니다.
예를 들어 번지 사이를 이동하기 위한 비트 패턴을 0과 1로 매번 기록하는 것보다는 move나 jump 등의 명령을 이용하여 프로그램을 짜는 것입니다. 물론 move나 jump명령은 사람이 이해할 수 있는 낱말이며 이진수를 사용하는 컴퓨터는 이해할 수 없습니다. 그래서 어셈블러 (assembler)라고 부르는 프로그램을 먼저 만들어야 했습니다.

어셈블러라는 프로그램은 프로그래머가 move 1 이라는 명령을 내리면 이진수 패턴으로 바꾸어주는 일을 합니다.
즉 move, jump 등의 이해하기 쉬운 명령어(mnemonics)를 이진수로 바꾸는 프로그램이나 장치가 어셈블러입니다.
그리고 이런 축약어로 이루어진 명령을 이용한 컴퓨터 언어를 어셈블리어 (assembly language)라고 부릅니다.

■ 어셈블리어의 특징

어셈블리어는 흔히 하드웨어와 소프트웨어의 가장 밑바닥에 잇는 언어라고 부릅니다. 그래서 기계어와 거의 같은 수준에 있는 언어라고 말합니다. 언어를 제어 단계로 구분할 경우에는 저급언어(Low level language)와 고급언어(High-level language)로 구분하는데 어셈블리어는 저급언어 중에도 가장 밑바닥의 언어입니다.

'어셈블리어의 의미와 유래'에서 설명한 것처럼 어셈블리어는 어셈블러(assembler)라는 통역기(=해석기)에 의해 기계어로 변환됩니다. 따라서 어셈블리어는 기계와 바로 대화가 가능한 언어라고 보시면 됩니다.

기계와 바로 통신이 가능하다는 점은 어셈블리어의 가장 큰 특징입니다. 이런 특징 때문에 어셈블리어는 다른 고급 언어와 차별되는 특징이 몇가지 있습니다.

(1) 명령 실행 속도가 가장 빠릅니다.

기계에 바로 명령을 내리는 상황이나 마찬가지이기 때문에 어떤 언어보다도 빠르게 기계를 제어할 수 있습니다.
다른 언어는 명령을 해석하는 속도가 필요하기 때문에 명령 수행 속도가 느립니다.

(2) 매우 세밀하게 프로그램을 해주어야 합니다.

어셈블리어는 최소한의 명령으로 이루어진 명령으로 이진수 패턴을 사용하는 기계어와 가장 유사한 언어입니다. 때문에 명령을 내릴 때 매우 세밀하게 명령을 내리게 됩니다.

예를 들어 고급언어를 사용할 경우에는 프로그래머가 프로그램을 짤 때 'A자를 써라.' '밥을 먹어가'하는 정도의 명령어를 내리면 됩니다. 좀 더 세밀하게 명령을 내린다고 해도 '연필을 잡고 힌색 종이에 A자를 써라.' '오른손으로 수저를 잡고 밥상 위의 그릇에 있는 밥을 떠먹어라' 정도의 명령을 내립니다.

그렇지만 어셈블리어는 몸이 움직이는 모든 동작과 위치를 지정해주면서 명령을 내립니다. 그 까닭은 어셈블리어의 명령어(instruction)는 기계어 명령과 거의 일대일로 대응을 할 정도로 세밀하기 때문입니다. 고급 언어는 한 줄의 명령이 수 줄에서 수 십 줄의 기계어로 변환됩니다.

이는 마치 앞이 안보이는 사람에게 작업을 지시할 때의 경우로 비유할 수 있습니다. 가끔 눈을 가리고 어떤 행위를 옆사람이 지시하는 놀이를 할 때가 있습니다. 이때 사람들은 다음과 같이 지시합니다.

'앞으로 세 걸음 거러. 거기서 오른쪽으로 두 걸음 걸. 그리고 오른쪽 앞으로 30cm정도 내밀어, 오른손을 아래로 내리면 연필이 있어. 연필을 잡고 오른손을 들어, 다시 왼쪽으로 한 걸음 움직여. 오른손을 15cm 정도 가슴 쪽으로 움직여. 연필을 든 오른손을 밑으로 내리면 종이에 닿아. 종이에 닿은 상태에서 가슴 안 쪽으로 사선을 그어. 다시 오른손을 15cm 앞으로 내밀고 종이에 연필을 대. 이번에는 오른쪽으로 사선을 그어. 다시 오른손을 10cm 내밀고 왼쪽으로 5cm 이동시켜. 연필을 종이에 대고 왼쪽으로 오른쪽으로 10cm 정도 선을 그어.'

어셈블리어로는 이처럼 매우 세밀하게 지시해야 A자가 화면에 써집니다. 때문에 고급언어로는 한 줄에 불과한 명령을 어셈블리어로 작성하려면 몇 줄에서 몇 십줄이 필요합니다.

(3) 어셈블리어는 하드웨어 특성을 탑니다.

어셈블리어는 하드웨어를 사실상 직접 제어하는 형태이기 때문에 하드웨어의 구조에 따라서 프로그램을 달리 해야 합니다.
고급언어로는 'A자를 출력하라'는 명령만 내리면 어떤 컴퓨터에서도 A자를 출력합니다. 그렇지만 어셈블리어는 '3칸 이동하여 ?값을 넣어주고, 다시 ?번지로 이동하여 ? 값을 ?로 전송하고..' 등의 형태로 프로그램을 하기 때문에 하드웨어에 따라서 결과가 달라집니다. CPU 마다 사용하는 번지의 수와 위치가 달라지기 때문에 어셈블리어로 짠 프로그램은 특정 하드웨어만 제대로 동작하는 문제가 있습니다.

이런 특징 때문에 어셈블리어는 배우기도 까다롭고 프로그래밍 하기도 어렵습니다.
우선 프로그램 방식이 C나 자바 등의 고급언어처럼 사람의 말을 사용하는 것이 아니고 기계어에 가까운 말을 사용하므로 사고 방식이 기계적인 사고 방식으로 바뀌어야 합니다. 또한 어셈블리어를 배웠다 하더라도 하드웨어에 따라서 프로그램 방법이 달라지기 때문에 하드웨어별 프로그램 기법을 다시 배워야 합니다. 이런 이유로 어셈블리어는 고급 언어에 익숙한 프로그래머가 볼 때 매우 배우기 어려운 언어에 속합니다.

■ 어셈블리어의 장단점과 용도

(1) 어셈블리어의 장점

1. 프로그램의 실행 속도가 매우 빠릅니다.
- 이는 기계에게 바로 명령을 내리기 때문입니다. 어떤 고급 언어로도 어셈블리어로 만든 프로그램보다 빠르게 실행할 수 없습니다.

2. 프로그램의 크기가 매우 작습니다.
- 최소한의 명령으로 프로그램을 짜게 되므로 프로그램의 크기가 매우 작교 효율적이 됩니다. 가장 작지만 가장 효율적이고 정확한 프로그램을 만들게 됩니다.

3. 어떤 프로그램이라도 만들 수 있습니다.
- 하드웨어를 직접 제어할 수 있는 언어이기 때문에 어떤 명령도 수행할 수 있고, 어떤 하드웨어와 소프트웨어도 제어할 수 있습니다. 그래서 어떤 프로그램이라도 만들 수 있습니다.

4. 어떤 기계에서도 사용이 가능합니다.
- 기계어를 사용하는 것과 마찬가지이므로 컴퓨터는 물론이고 프로그램을 이용하여 제어하는 거의 모든 하드웨어에서 사용이 가능합니다.

(2) 어셈블리어의 단점

1. 배우기 어렵습니다.
- 어셈블리어는 배우기 어렵습니다. 또한 기계적인 사고 방식을 가져야 하므로 어셈블리어를 배우기 전에 하드웨어의 원리에 대해서도 잘 알고 있어야 합니다. 이 말은 하드웨어를 잘 모르는 상태에서 어셈블리어를 배우는 일은 어렵다는 말과 같습니다.
 고급 언어로 프로그램을 짤 때는 하드웨어 지식이 전혀 없어도 가능하지만 어셈블리어로 프로그램을 짤 때는 하드웨어 지식이 뛰어나야 가능합니다.

2. 큰 프로그램을 만들기 어렵습니다.
- 아무리 고수라 하더라도 세밀한 제어가 필요한 어셈블리어로 큰 프로그램을 만드는 일은 어렵습니다. 이는 통나무로 집을 짓는 경우와 나무젓가락으로 집을 짓는 경우로 비교할 수 있습니다.

3. 프로그램 짤 때 시간이 오래 걸리고 벌레 잡기가 어렵습니다.
- 고급 언어로 한 줄이면 끝날 프로그램도 어셈블리어로는 꽤 복잡하게 짜야 합니다. 때문에 프로그램이 시간이 오래 걸립니다. 또한 에러가 났을 때 에러를 찾는 일도 프로그래머가 직접 해야 하므로 에러 수정이 힘듭니다.

4. 제작된 프로그램이 하드웨어별로 특성을 탑니다.
- 모든 하드웨어에서 사용 가능한 프로그램을 짤 수 있는 반면 그 하드웨어에서만 사용할 수 있는 프로그램이 됩니다.


(3) 어셈블리어의 용도

1. 하드웨어 디바이스 드라이버 (Hardware device driver)
- 보통 '드라이버' 파일이라고 말하는 파일을 만들 때는 대부분 어셈블리어로 작성합니다. 프린터나 그래픽카드, 마우스와 같은 각종 장치의 드라이버 파일은 크기가 작으면서 실행 속도는 빨라야 합니다. 또한 하드웨어를 제어하는 파일이므로 하드웨어를 가장 효과적으로 제어할 수 있는 어셈블리어로 작성하는 것이 좋습니다. 그래서 각종 드라이버 파일은 대부분 어셈블리어로 작성합니다.

2. 일반 프로그램의 특정 기능 최적화 (Optimization)
- 게임이나 기타 프로그램을 만들때 100% 고급언어로만 작성할 경우 속도가 느려서 프로그램이 제 역할을 하지 못하는 경우가 많습니다. 또한 하드웨어를 좀더 정밀하게 직접 제어해야 하는 경우가 있는데 이때 윈도의 API를 사용할 경우에는 정밀한 제어가 힘듭니다. 그래서 속도가 필요하거나 하드웨어를 좀더 정밀하게 직접 제어해야 하는 부분에서는 어셈블리어로 프로그램을 작성합니다. 이렇게 작성한 어셈블리어 프로그램을 고급 언어로 만든 프로그램과 링크시켜서 사용하는 것이 보편적입니다.

3. 각종 전자 장비의 프로그래밍
- 컴퓨터가 아닌 각종 전자 장비들은 대부분 어셈블리어를 사용합니다. 임베디드 시스템 (Embedded system) 이라고 부르는 각종 장비로는 휴대폰, 전화기, TV, 냉장고, VCR과 같은 가전 제품에서부터 엘리베이터, 공작기계, 공장자동화, 생산용로봇, 현급지급기와 같은 산업용 장비, 각종 전자 장비의 롬칩에 내장하는 BIOS 프로그램 등이 있습니다.
 한 마디로 거의 모든 전자 장비나 프로그램이 들어가는 롬 칩은 대부분 어셈블리어로 작성한다고 보면 됩니다. 물론 스티커 사진기나 최신형 현금지급기처럼 PC를 이요한 장비는 포트란이나 C언어 등의 고급언어를 사용하기도 합니다. 그렇지만 이들 장비에 수 백 개 씩 장창된 각종 칩은 대부분 어셈블리어로 작성합니다. PC 부품 역시 주기판의 각종 부품과 슬롯에 장착하는 각종 인터페이스 카드, 기타 주변 기기에 내장된 롬 칩 프로그램이 대부분 어셈블리어로 작성됩니다