검수요청.png검수요청.png

어셈블리

해시넷
이동: 둘러보기, 검색
어셈블리(Assembly)
어셈블리(Assembly)

어셈블리(Assembly)는 기계어를 대체하기 위해 만든 2세대 프로그래밍 언어이다. 어셈블리어 또는 어셈블리 언어(Assembly Language)라고도 한다.

개요[편집]

상징적인 기호 언어를 사용하여 작성한 프로그램기계어로 된 프로그램으로 번역하는 것이다.[1]

특징[편집]

어셈블리는 기계어에 가까운(machine-specific) 언어로 기계어의 명령문과 1:1 대응 관계에 있다. 여러 가지 종류의 어셈블리가 있으며 각 어셈블리느 각 프로세서(processor of processor family)에 특화되어 있다. 이는 어셈블리 명령어들이 프로세서의 명령어들과 하드웨어 구조에 맞추어 설계되었기 때문이다. 즉, 프로세서에 따라 어셈블리도 제각기 다르다. 물론 완전히 다르지는 않지만 명령어라든가 문법에서 약간씩 차이를 보인다. 예) IBM-PC ASM은 Intel 프로세서군에 맞추어 만들어져 있다. AMD는 Inter의 클론 제품이기 때무에 Intel용 ASM와 호환된다. 이에 추가로 AMD가 자체적으로 만든 별도의 명령어들도 있다.[2]

  • 하드웨어와 소프트웨어의 가장 밑에 있는 언어이다.
  • 기계어와 명령어가 1:1로 대응된다.
  • 임베디드 시스템, 커널 프로그램 등에서 필요하다.[3]

장점[편집]

  • 어셈블리를 사용하면, 특정 프로세서에만 있는 레지스터나 I/O 를 바로 접근할 수 있다.(you can access machine-dependent registers and I/O)
  • 크리티컬 섹션 등에서 데드락과 같은 일을 야기할 수 있는 여러개의 프로세스 쓰레드들의 코드 동작을 매우 정확하게 컨트롤 할 수 있다. 코드 하나하나의 동작을 모두 제어하고 생각한 대로 움직이게 할 수 있다.
  • 일반적인 컴파일러가 제공하는 환경과 생성하는 코드의 규칙들을 무시한 채 작업할 수 있다. 속도의 최적화 등을 위해 메모리 할당에 관한 규칙이나 쓰레딩, 함수 호출 규칙과 같은 것들을 일시적으로 무시하고 프로그래밍 할 수 있다.
  • 서로 다른 규약을 사용하는 여러 개의 코드들 간의 인터페이스를 구축할 수 있다. (예를 들면, 다른 컴파일러들로 생성된 코드들이 상호 작용할 수 있도록 만든다든지, low-레벨 인터페이스가 상이한 코드들의 인터페이스를 통일한다든지 하는 일 말이다.)
  • 일반적인 고수준 언어(c나 pascal)용 컴파일러로는 생성하기 힘든 특정 프로세서의 특수한 프로그래밍 모드에 접근할 수 있다. 예를 들어, 인터페이스 스타트 업을 위해 프로세서의 16비트 모드를 사용한다든지, 펌웨어용 프로그램을 만든다든지, 인텔 컴퓨터에서 레거시 코드(legacy code)를 만든다든지 하는 일을 어셈블리를 사용해서 할 수 있다.
  • 코드 최적화를 제대로 시키지 못하는 안 좋은 컴파일러의 코드를 직접 최적화시켜서 그런 컴파일러가 생성한 느리고 불필요한 루프, 루틴들을 매우 빠르고 효율적인 루프로 바꾸어 줄 수 있다. (하지만 매우 좋은 free 컴파일러들이 있다. ex)gcc)
  • 하드웨어 설정에만 완벽하게 최적화된 코드를 직접 제작할 수 있다. 그럼으로서 범용적인(일반적인) 호환을 위한 불필요한 것들을 코드에서 뺄 수 있다.
  • 새로운 언어를 만들고, 그 언어를 위해 컴파일러를 만든다면, 컴파일러가 최적의 코드를 생산할 수 있도록 조정할 수도 있다.[4]

단점[편집]

  • 어셈블리는 매우 저수준의 언어이다.
  • 버그가 발생할 확률이 매우 높다.
  • 버그를 추적해서 잡아내기가 매우 많이 어렵다.
  • 작성한 코드를 이해하기가 어려울 뿐만 아니라 수정하기도 어렵기 때문에 유지 보수가 어렵다.
  • 어셈블리를 이용하여 코딩을 한 결과물은 현존하거나 앞으로 개발될지도 모르는 다른 아키텍쳐의 머신으로 이식할 수 없다.
  • 어셈블리로 최적화시켜 작성한 코드는 개인이 개발한 타겟이 되는 아키텍쳐와 동일한 아키텍쳐를 가지고, 동일한 설정을 하고, 동일한 환경을 가진 기계에서만 수행될 것이다. 예글 들면, 인텔 계열의 프로세서들(Intel 386, 486, Pentium, PPro, PII, PIII, PIV; Cyrix 5x86, 6x86, M2; AMD K5, K6(K6-2, K6-III), K7(Athlon, Duron 등)만 보더라도 다들 프로세서의 디자인이나 그 외 여러 요소들(상대적 클럭 지연시간, 수행속도, 용량, 캐시, (RAM), 버스, 디스크, FPU의 존재 여부, MMX, 3DNOW, SIMD 확장 등등 나열하기 힘들다.)의 차이로 인해서 프로세서마다 그 주변 환경에 따라서 완벽하게 다른 최적화 테크닉이 필요하다. 게다가 프로세서의 설계/디자인은 계속적으로 변하고, 바뀌고, 발전하고 있기 때문에 방금 나열한 목록과 최적화시킨 코드가 최신의 코드가 되기를 바라는 것은 안 된다.
  • 자잘하고 세밀한 부분에 신경을 쓰느라 프로그램 전체의 알고리즘이나 설계에 신경을 쓰지 못할 가능성이 적지 않게 존재한다.
  • 알고리즘 설계를 조금만 바꾸어도 이미 만들어둔 어셈블리 코드의 전체를 다시 만들어야 할 확률이 높아진다.[4]

종류[편집]

어셈블러의 종류[편집]

  1. 단일 패스 어셈블러 : 원시 프로그램을 하나의 명령문씩 읽는 즉시 기계어로 번역하여 목적 프로그램으로 만든다.
  2. 이중 패스 어셈블러 : 원시 프로그램을 앞에서부터 끝까지 읽어서 1단계의 작업을 수행한 후, 다시 처음부터 읽으면서 1단계에서 수행한 결과를 사용하여 완전한 목적 프로그램을 만든다.
  3. 크로스 어셈블러 : 현재 사용하는 컴퓨터와는 다른 명령 형태로 동작하는 컴퓨터에서 사용할 프로그램을 어셈블 할 때 사용되는 어셈블러를 말한다. 현재 어셈블하는 컴퓨터가 아닌 어셈블된 프로그램을 실행시킬 컴퓨터에 맞게 목적 프로그램을 생성한다.[5]

구성[편집]

어셈블리는 표지부, 연산부, 피연산부로 구성된다.

  1. 표지부 : 프로그램에서 명령들을 참조하기 위해 명령 집단에 붙여지는 이름이다.
  2. 연산부 : mov(이동), add(덧셈), subtract(뺄셈) 등 수행을 위한 특별한 명령들의 기호로 되어 있다.
  3. 피연산부 : 데이터가 처리되어 저장될 레지스터나 저장 장소를 나타낸다.

활용[편집]

하드웨어 디바이스 드라이버[편집]

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

일반 프로그램의 특정 기능 최적화[편집]

게임이나 기타 프로그램을 만들 때 고급 언어로만 작성하면 속도가 느려서 프로그램이 제 역할을 할 수 없다. 하드웨어를 좀 더 정밀하게 직접 제어해야 하는 경우, 윈도우의 API를 사용해서는 정밀한 제어가 힘들기 때문에 어셈블리어로 만든 프로그램과 링크시켜 사용하는 것이 보편적이다.

임베디드 시스템[편집]

스마트폰, TV, 냉장고부터 엘리베이터, ATM과 같은 산업용 장비까지 임베디드 시스템을 사용한 각종 전자 장비의 ROM칩도 대부분 어셈블리어로 작성한다.[6]

각주[편집]

  1. 네이버 지식백과 - https://terms.naver.com/entry.nhn?docId=1583668&cid=50372&categoryId=50372
  2. 읽고..... 생각하고 행동한다,〈어셈블리의 특징과 어셈블리의 차이점〉,《네이버 블로그》, 2006-02-22
  3. K4keye,〈어셈블리어〉,《네이버 블로그》, 2019-03-20
  4. 4.0 4.1 위키위키 공식 홈페이지 - https://wiki.kldp.org/HOWTO/html/Assembly-HOWTO/x121.html
  5. 코딩팩토리,〈어셈블리어란 무엇인가?〉,《티스토리》, 2019-02-01
  6. 어셈블리어란?〉, 《티스토리》

참고 자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 어셈블리 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.