강좌 첫화면으로 최근 글 보기(Post)
갈래별로 보기 categories




  1.1 초보자를 위한 어셈블리어 이해 돕기



1. 어셈블리어 이야기

1.1 초보자를 위한 어셈블리어 이해 돕기

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

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

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

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

1.1.2. 어셈블리어의 특징

어셈블리어는 흔히 하드웨어와 소프트웨어의 가장 밑바닥에 있는 언어라고 부릅니다. 그래서 기계어와 거의 같은 수준에 있는 언어라고 말합니다. 언어를 제어 단계로 구분할 경우에는 저급언어(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.3. 어셈블리어의 장단점과 용도

어셈블리어의 특징상 어셈블리어로 짠 프로그램은 몇 가지 장점을 가집니다.

(1) 어셈블리어의 장점

1. 프로그램의 실행 속도가 매우 빠릅니다.

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

2. 프로그램의 크기가 매우 작습니다.

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

3. 어떤 프로그램이라도 만들 수 있습니다.

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

4. 어떤 기계에서도 사용이 가능합니다.

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

(2) 어셈블리어의 단점

1. 배우기 어렵습니다.

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

2. 큰 프로그램을 만들기 어렵습니다.

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

3. 프로그램 짤 때 시간이 오래 걸리고 벌레 잡기가 어렵습니다.

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

4. 제작된 프로그램이 하드웨어별로 특성을 탑니다.

모든 하드웨어에서 사용 가능한 프로그램을 짤 수 있는 반면 그 하드웨어서만 사용할 수 있는 프로그램이 됩니다.

어셈블리어의 이런 장단 점 때문에 어셈블리어를 사용하는 용도는 점차 특화되고 있습니다. 애플 시절이나 도스 시절만 해도 어지간한 컴퓨터 프로그램이나 게임은 어셈블리어로 작성했습니다. 그렇지만 프로그램의 덩치가 커지는 요즘 와서는 어셈블리어로 윈도98용 프로그램이나 게임을 만드는 경우가 거의 없습니다. 요즘은 대부분 고급 언어로 프로그램을 만듭니다.

(3) 어셈블리어의 용도

그렇다면 윈도98 시절인 요즘에는 어셈블리어를 배울 필요가 없을까요? 어셈블리어를 배워도 쓸모가 없을까요? 아닙니다. 어셈블리어는 시대에 상관 없이 배워두면 가장 유용한 언어입니다. 어셈블리어는 윈도 시대인 지금도 매우 유용하게 사용하고 있으며, 각종 전자기기가 발달할수록 사용처가 더욱 넓어지고 있습니다.

현재 어셈블리어를 배운 사람이 어셈블리어로 프로그램을 짜는 경우는 크게 세 가지로 구분할 수 있습니다.

1. 하드웨어 디바이스 드라이버 (Hardware device driver)

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

2. 일반 프로그램의 특정 기능 최적화(Optimization)

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

3. 각종 전자 장비의 프로그래밍

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

1.1.4. 취업과 어셈블리어의 관계

앞서 살펴본 것처럼 어셈블리어의 용도는 무궁무진합니다. 비주얼베이직이나 비주얼C++을 배운 사람은 윈도98용 게임이나 윈도98용 프로그램만 개발할 수 있습니다. 따라서 비주얼베이직을 배워서 취업할 수 있는 직장은 매우 극소수로 한정됩니다. 윈도용 게임이나 프로그램을 작성하는 업체는 국내에 많지 않으며 더구나 비주얼베이직으로 게임이나 프로그램을 개발하는 업체는 더욱 적습니다.

그렇지만 어셈블리어를 배운다면 거의 모든 소프트웨어 개발업체 취업이 가능합니다. 어떤 프로그램을 만들더라도 프로그램의 최적화를 위해서 어셈블리어로 프로그램을 보완하는 것이 필요하기 때문입니다. 또한 모든 하드웨어 장비를 생산하는 업체에 취업이 가능합니다. 공작기계나 그래픽카드, MP3 플레이어, 휴대폰, 전기 밥통 생산 업체에서도 장비 안에 내장되는 각종 롬칩의 프로그램을 어셈블리어로 하기 때문입니다.

또한 비주얼베이직은 유행을 타는 언어에 해당합니다. 이미 마이크로소프트사는 비주얼베이직 지원을 포기한 상태입니다. 따라서 앞으로 비주얼베이직으로 윈도XP용 프로그램을 작성하는 일은 어렵게 되었습니다. 최신 기능을 지원하기 위해서는 최신 기능을 지원하는 컴파일러 프로그램이 필요한데 비주얼베이직은 이미 컴파일러가 단종된 언어이기 때문입니다. 물론 비주얼C++, 델파이, 펄, PHP 등의 언어도 유행을 탑니다. 이들 언어는 운영체제의 변화에 따라서 기능의 변화가 이루어지기 때문입니다. 따라서 비주얼베이직이나 비주얼C++을 배운 사람은 계속해서 새로운 언어를 배워야 하는 부담을 가집니다. 어느 시기가 되면 비주얼베이직이나 델파이로 프로그램을 짜는 회사가 없어지기 때문입니다.

반면 어셈블리어를 배운 사람은 시기에 상관 없이 어셈블리어로 프로그램을 짤 수 있습니다. 운영체제는 물론이고 하드웨어의 종류도 가리지 않고 어셈블리어를 사용할 수 있기 때문에 한 번 배워두면 계속 사용 가능한 언어입니다. 비주얼베이직 프로그래머는 비주얼베이직을 이용한 윈도98용 프로그램 개발이 시들해지면 갈 데가 없습니다. 요즘 상황이 여기에 해당하죠. 반면 어셈블리어 프로그래머는 취업할 데가 많습니다. 꼭 컴퓨터 프로그램 개발 업체만 고집할 필요가 없는 것이죠. 바코드 장비 업체나 각종 자판기 제작 업체에도 취업이 가능합니다. 이들 회사도 어셈블리어 프로그래머가 필요하거든요.

따라서 어셈블리어는 배웠을 때 취업에 가장 유리한 프로그램입니다. 만약 취업을 위해서 컴퓨터 언어를 배우고자 한다면 비주얼베이직이나 델파이 같은 유행에 민감한 언어를 배우지 말고 어셈블리어를 배우기 바랍니다.

물론 어셈블리어는 배우기가 어렵습니다. 대신 그만큼 프로그래머의 희소성이 높고 취업 분야가 다양하다는 장점이 있습니다. 또한 처음 배울 때만 힘들지 일단 배우면 유행을 타지 않는다는 점도 장점입니다.

일단 어셈블리어를 제대로 사용할 줄 안다면 프로그래머 중에서도 최고 레벨로 분류됩니다. 한 마디로 프로그래머가 부러워하는 프로그래머에 속합니다. 그리고 대부분의 기업도 어셈블리어를 할 줄 아는 프로그래머라는 어떤 언어를 배운 프로그래머보다 먼저 채용하고자 합니다. 그만큼 어셈블리 프로그래머는 최고 수준의 고급 인력이라는 뜻입니다.

따라서 프로그래머로 취업하고자 한다면 어셈블리어만 확실하게 알면 됩니다. 여기에 고급 언어로 C++ 정도만 다룰 줄 안다면 어떤 업체에도 취업이 가능합니다. 컴퓨터 프로그램 관련 업체가 아닌 다른 분야의 업체에도 취업이 가능합니다. 이 때문에 저는 취업을 위한 언어로 어셈블리어와 C++을 가장 권하는 것입니다.



Tags

첫줄로(go top, go first line) 문화원첫화면으로(go dal site home) 강좌차림으로(go Chair) 사이트맵으로(go sitemap)




total chairpost