티스토리 뷰

IT

어셈블리 언어란 무엇인가

siren911 2016. 9. 11. 16:30

어셈블리 언어는 컴퓨터의 하드웨어와 소프트웨어에 대한 여러 가지 궁금증을 풀어줄 수 있는 언어입니다. 컴퓨터 하드웨어와 이를 운영하는 소프트웨어가 서로 어떠한 관계 속에서 작동되는지, 그리고 응용 프로그램과 운영체제 소프트웨어 간의 상호작용은 어떻게 이루어지는지에 대한 의문들은 어셈블리 언어를 공부함으로써 해소될 수 있습니다. 하나의 컴퓨터와 그 안에 내장된 소프트웨어를 응용 프로그램, 고급언어(HLL), 운영체제, 어셈블리 언어(ASM), 기계어(ML)과 같은 계층적 단계들로 살펴보는 것이 컴퓨터를 당장 이해하는 데 많은 도움이 됩니다. 대부분의 프로그래머들이 사용하는 고급언어는 다수의 기계어로 변환됩니다. 어셈블리 언어와 기계어 단계에서의 각 명령어는 컴퓨터 중앙처리장치에 의해 곧바로 인식 처리됩니다. 어셈블리 언어는 저급언어입니다.




 

어셈블리 언어는 운영체제 시스템을 사용하거나 컴퓨터 하드웨어를 직접 제어하는 데 주로 사용됩니다. 그리고 프로그램 실행을 더 빠르게 하기 위해 응용 프로그램의 중요 부분을 최적화하는 데도 어셈블리 언어가 사용됩니다. 어셈블리 언어 프로그램이 컴퓨터 내에서 어떻게 작동되는지를 더욱 잘 이해하기 위해서는 컴퓨터의 구조와 운영체제에 대한 공부도 병행해야 합니다.

 

어셈블리 언어는 문장 하나 하나가 컴퓨터 고유의 기계어와 일대일로 대응되는 기계 고유의 프로그램 언어입니다. 따라서 특정 프로세서나 각종 프로세서에 따른 어셈블리 언어들이 다양한 형태로 제공되는데, 이는 컴퓨터의 기계 명령어 집합과 하드웨어 구조가 서로 잘 조화되도록 어셈블리 언어 명령어들이 설계되었기 때문입니다. IBM-PC 어셈블리 언어는 인텔 프로세서들, 즉 8086, 8088, 80286, 80386, 80486, 그리고 펜티엄에 의해 인식되는 명령어들을 말합니다.




 

어셈블러는 어셈블리 언어로 작성되 소스코드를 기계어로 변화하는 프로그램입니다. 어셈블러는 줄 번호, 메모리 주소, 소스코드 문장들, 그리고 프로그램에서 사용된 상수들과 변수들의 교차 참조 리스팅(cross-reference listing)을 포함하는 소스 리스팅 파일을 선택적으로 생성할 수 있습니다. 함께 사용되는 프로그램으로서 링커가 있는데, 이 링커는 어셈블러가 생성한 파일들을 결합하여 하나의 실행 파일을 만듭니다. 또 다른 프로그램으로서 디버거가 있는데, 프로그래머는 이 디버거에 의해 프로그램 실행을 추적하거나 메모리 내용을 조사할 수 있습니다. 인텔 프로세서들에서 사용될 수 있는 어셈블러들로서 MASM(Microsoft Assembler), TASM(Borland Turbo Assembler), 그리고 ASM86이 널리 사용되고 있습니다. 어셈블리 언어는 구조적, 기능적 측면에서 기계어와 가깝기 때문에 저급언어라고 합니다. 각각의 어셈블러 언어 명령어는 하나의 기계 명령어에 해당합니다. 반면에 Pascal, BASIC, C, 그리고 C++ 같은 고급언어의 문장은 다수의 기계 명령어들로 번역됩니다.

 

흔히 어셈블리 언어를 공부하는 이유는 다양합니다. 사용중인 컴퓨터에 대해 단지 더 많이 알고 싶어서이거나, 또는 컴퓨터 언어로부터 기계 코드가 어떻게 생성되는지 알고 싶어서입니다. 어셈블리 언어는 기계어와 밀접한 관계를 가지고 있어, 컴퓨터의 하드웨어와 소프트웨어에 직접 연계되어 컴퓨터의 모든 것을 보여줍니다.

 

또한 실용성을 의식하여 어셈블리 언어를 배우고 싶어할 수도 있습니다. 고급언어로 프로그램을 작성하는 일은 매우 어렵거나 불가능한 경우도 있는데, 예를 들면 컴퓨터의 운영체제에 직접 접근하는 것이 그런 경우입니다. 컴퓨터 게임 응용 프로그램은 비디오 컨트롤러나 사운드카드에 직접 접근해야 할지도 모릅니다. 프린터나 직렬 I/O 장치를 컴퓨터에 접속시키는 프로그램이 필요할지도 모르고, 프로그램의 실행속도를 높이기 위해 Visual Basic 프로그램이 어셈블리 언어로 작성된 DLL 프로시저들을 호출할 수도 있습니다. 어셈블리 언어는 코드 크기가 줄어들고 실행 속도를 대폭 향상시킬 수 있기 때문에 아주 다양한 영역에서 효율적으로 사용될 수 있습니다.

 

어셈블리 언어 프로그램들은 고급언어가 갖는 제한들을 쉽게 피해갈 수 있습니다. 예를 들어, 파스칼 언어는 문자 값이 정수형 변수에 할당되는 것을 허용하지 않습니다. 이 규칙을 어겨야만 할 특정 이유가 없는 한 그 규칙은 문제가 되지 않습니다. 경험이 풍부한 프로그래머는 이 제한을 피해가는 방법을 찾을 수 있는데, 그럴 경우 프로그램이 다른 컴퓨터 시스템에 이식될 수 없게 되거나 프로그램을 읽고 이해하는데 많은 어려움이 따를 수도 있습니다. 이와 대조적으로 어셈블리 언어는 제한이나 규칙이 거의 없습니다. 거의 모든 것이 프로그래머의 손에 달려 있습니다. 그런 자유가 있는 반면, 어셈블리 프로그램 작성에는 복잡한 세부사항들을 고려해야 한다는 점이 단점으로 지적되고 있습니다.

 

아마도 가장 중요한 점은 어셈블리 언어가 컴퓨터 구조, 운영체제, 자료 표현, 그리고 하드웨어 장치들을 공부하는 데 매우 유용한 도구로 사용될 수 있다는 것입니다. 거의 대부분 대학의 컴퓨터 교과과정은 컴퓨터 구조 과목을 먼저 이수하고, 그 다음으로 운영체제에 관한 과목을 이수하도록 하고 있습니다. 특별한 프로그램을 작성하거나 문제점들을 밝혀내고자 하는 경우에는 어셈블리 언어들이 유용하게 사용될 수 있습니다.

 

여기에 소개되는 첫번째 어셈블리 언어 프로그램은 아마도 대수롭지 않아 보일 것입니다. 비교적 간단한 일을 수행하는 데도 얼마나 많은 작업이 필요한지에 대해서는 대체로 이해가 부족한 편입니다. 어셈블리 언어는 사소한 사향에까지 세심한 주의를 요합니다. 초창기의 컴퓨터들은 메모리 크기가 적은데다 빠르지도 않아, 대부분의 응용 프로그램들이 부분적 혹은 전체적인 면에서 어셈블리 언어로 작성되었습니다. 컴퓨터 성능이 개선되어 감에 따라 프로그램들은 대체로 길어지고 복잡해졌습니다. 이같은 상황에서 프로그래머들에 대한 지원 수단으로서 구조화 기능을 갖는 C, FORTRAN, 그리고 COBOL 등의 고급언어가 사용되고 있습니다. 최근에는 C++ 같은 객체지향 언어로 수백만의 소스코드 라인을 포함하는 복잡한 프로그램도 작성할수 있게 되었습니다.

 

현재는 어셈블리 언어로만 작성된 응용 프로그램은 거의 없는데, 그 이유는 프로그램 작성과 유지보수에 너무 많은 시간이 들기 때문입니다. 응용 프로그램의 일부가 고속으로 처리되어야 하거나 컴퓨터 하드웨어를 직접 제어해야 하는 경우에 어셈블리 언어가 사용됩니다. 어셈블리 언어는 내장형 시스템 프로그램을 작성할 때도 사용되는데, 이 프로그램은 하드웨어 장치 안의 PROM 메모리에 내장됩니다.

 

C 프로그래밍 언어는 구조화하는 고급언어의 특성과 세부사항을 다루는 저급언어의 특성을 절충하여 만든 특이한 언어입니다. 하드웨어의 직접 제어는 가능하지만 이식성이 전혀 없습니다. 대부분의 C 컴파일러들은 어셈블리 언어 소스코드를 생성하는 기능을 갖고 있는데, 프로그래머는 실행 코드로 만들기 전에 이미 생성된 코드를 사용하기에 더 적합하도록 변환할 수 있으며 또 개선할 수도 있습니다.

 

프로그래머들은 C와 어셈블리 언어를 병용하여 내장형 시스템 프로그램들을 개발하기도 하는데, 구체적인 예로 컴퓨터 카트리지 게임이나 자동차에 내장되는 소형 제어기, 통신 장비, 온도조절 장치, 산업용 로봇, 경비 시스템, 그리고 자동 금전출납기 등이 개발되고 있습니다.

 

프로그래머들은 종종 어셈블리 언어로 서브루틴을 작성하며, 이를 고급언어 프로그램에서 호출합니다. 서브루틴은 인터페이스 서브루틴이라 일컬어지기도 하는데, 이는 서브루틴이 컴퓨터 하드웨어를 직접 제어하는 편리한 방법을 제공하기 때문입니다. 컴퓨터 게임을 예로 들면, 최상의 성능을 위해 비디오 디스플레이 어댑터와 사운카드의 하드웨어 포트들을 직접 제어해아 하는 경우입니다.

 

장치 드라이버라고 불리는 어셈블리 언어 서브루틴도 운영체제에서 호출되는데, 이는 모든 응용 프로그램에 시스템 서비스를 제공하기 위한 것입니다. 이를테면 파일로부터 일부 데이터를 읽어야 할 때, 운영체제는 장치 드라이버 서브루틴을 호출합니다.

 

어셈블리 언어 프로그래머들은 무엇보다도 자신들이 다루어야 할 데이터에 대해 정확히 알아야 합니다. 데이터의 구체적인 표현 방법에 대한 상세한 이해가 없으면 중대한 실수를 초래할 가능성이 매우 높습니다. 편리성과 소스코드 이식성이라는 명목으로 고급언어들의 구현과 관련한 세부 사항들이 프로그래머에게 제공되지 않기도 합니다. 그러나 어셈블리 언어는 기계가 수행하는 기계어이기 때문에 프로그래머에 대한 제한 사항들이 거의 없습니다.

 

어셈블리 언어들의 주요 결점은 어셈블리 언어 프로그램을 다른 종류의 컴퓨터들에서 다시 컴파일하여 사용할 수 없다는 점입니다. 각종 프로세서는 상이한 문법의 다른 어셈블러를 갖는데, 이는 어셈블러가 프로세서의 구성 형태에 근거하여 설계되었기 때문입니다. 이런 상황을 개선하기 위해서 소프트웨어 제작업체들은 크로스-어셈블러(cross-assembler)라는 공용 프로그램을 만들었는데, 이 프로그램은 특정 프로세서를 위해 작성된 어셈블리 언어 소스코드를 다른 종류의 프로세서에서 작동될 수 있는 어셈블리 소스코드로 번역합니다. 물론 컴퓨터 하드웨어와 운영체제에 관련된 문장들은 새로운 컴퓨터를 위해 다시 작성되어야 합니다. Intel 어셈블리 언어를 Motorola 어셈블리 언어로, 또는 RISC 프로세서 어셈블리 언어로 번역하는 크로스-어셈블러들이 개발, 사용되고 있습니다.




'IT' 카테고리의 다른 글

시리얼 통신 개념  (0) 2016.09.12
비주얼베이직 6.0의 역사와 특징  (0) 2016.09.11
아이폰 OS를 알아보자  (0) 2016.09.11
아두이노 프로그래밍 시작하기  (0) 2016.09.10
윈도우즈 프로그래밍 역사  (0) 2016.09.04
댓글