기계어 (Machine language)
Machine language(기계어)는 컴퓨터의 프로세서(CPU)가 특별히 이해하는 숫자 언어이다.
모든 x86 프로세서는 공통의 기계어를 사용한다.
어셈블리어 (Assembly Language)
Assembly Language(어셈블리어)는 ADD, MOV, SUB, CALL과 같은 짧은 약어로 작성된 명령문으로 구성된다.
1) 기계어와 어셈블리어는 어떤 관계일까?
어셈블리어는 기계어와 일대일 관계이다. 하나의 어셈블리어 명령은 하나의 기계어 명령에 해당한다.
2) C++와 어셈블리어는 어떤 관계일까?
C++은 고급언어로 어셈블리어, 기계어와 일대다 관계이다. 하나의 C++ 명령은 여러 어셈블리어 또는 기계어로 확장된다.
아래의 예시에서는 같은 내용의 명령이 C++로는 2줄, 어셈블리어로는 5줄인 것을 확인할 수 있다.
# C++
int Y;
int X=(Y+4)*3;
# 어셈블리어
mov eax, Y; # Y를 EAX 레지스터로 옮겨라
add eax, 4; # 4를 EAX 레지스터에 더해라
mov ebx, 3; # 3을 EBX 레지스터로 옮겨라
imul ebx; # EAX와 EBX를 곱해서 EAX에 넣어라
mov x, eax; # EAX 값을 X로 옮겨라
*저급 언어와 고급 언어 (High-Level Language vs. Low-Level Language)
프로그래밍 언어의 문법 구조가 기계어와 유사하면 '저급 언어', 사람들이 이해하기 편하도록 만들어진 프로그래밍 언어를 '고급 언어'라고 한다. 따라서 High와 Low는 사람의 언어에 가까운지 기계의 언어에 가까운지를 표현하는 단어일 뿐 성능과 관련된 용어가 아니다.
어셈블리어 특징
1) 이식성(Portable)이 없습니다. 특정 프로세서 제품군용으로 설계되었다.
2) 임베디드 프로그램 작성에 사용됩니다. 어셈블리어는 경제적인 메모리 사용으로 임베디드 프로그램에 이상적이다.
3) 실시간 애플리케이션 작성에 사용됩니다. 시뮬레이션 및 하드웨어 모니터링을 다루는 실시간 애플리케이션에는 정확한 타이밍과 응답이 필요하다. 고급 언어로는 컴파일러에서 생성된 기계어 코드를 정확하게 제어할 수 없습니다. 어셈블리어는 프로그램의 실행 코드를 정확하게 지정할 수 있다.
4) 콘솔 게임 작성에 사용됩니다. 콘솔은 작은 코드 크기와 빠른 실행을 위해 최적화된 소프트웨어가 필요하다. 따라서 하드웨어 기능을 최대한 활용한 작성이 요구된다. 어셈블리어는 직접적인 하드웨어 접근이 가능하기 때문에 최적화와 속도 향상을 위해 사용한다.
5) 하드웨어, OS, 응용 프로그램 간의 상호 작용에 대한 전반적인 이해에 사용된다.
마무리
프로그래밍 초기에는 대부분의 응용 프로그램은 어셈블리어로 작성되었다. 당시에는 메모리 영역이 작고 프로세서 속도가 느렸다. 요즘에는 메모리는 더 풍부해지고 프로세서는 속도가 비약적으로 증가했다. 프로그램이 더 복잡해짐에 따라 객체지향언어(OOP)가 더 인기가 많아졌다.
대형 응용 프로그램을 어셈블리어로 완전히 작성하는 것은 쉽지 않다. 작성하고 유지 관리하는 데 너무 많은 시간이 걸리기 때문이다. 대신 어셈블리어는 속도를 위해 응용 프로그램의 특정 섹션을 최적화하고 컴퓨터 하드웨어에 액세스 하는 데 사용된다. 대부분의 C 및 C++ 컴파일러에서는 코드에 어셈블리어 문을 포함할 수 있으므로 하드웨어 세부 정보에 액세스 할 수 있다.
다음 글에서는 데이터의 표현에 대해 다뤄보겠다 :)