기계어

기계어(Machine Code)는 0과 1로 이루어진 명령어 집합입니다.

CPU는 기계어(이진 명령어)만 이해하고 실행할 수 있기 때문에, 모든 프로그램은 결국 기계어 형태로 변환되어 실행됩니다.

고급 언어 중 하나인 C 언어로, 간단한 코드를 작성해 비교해보도록 하겠습니다.

int a = 1;
int b = 2;

a + b;

이 코드를 MIPS 아키텍처의 기계어로 옮기면 다음과 같습니다.

001000 00000 01000 0000000000000001
001000 00000 01001 0000000000000010
000000 01000 01001 01010 00000 100000

이렇게 기계어는 이진수로 나열하면 너무 길어지기 때문에, 가독성을 위해 아래와 같이 십육진수로 표현하기도 합니다.

0x20080001
0x20090002
0x01095020

이진수보다 보기는 편해졌지만 여전히 무슨 말인지 쉽게 알아 볼 수 없습니다.

그래서 이러한 기계어를 사람이 좀 더 읽기 쉽게 표현한 형태가 바로 어셈블리어입니다.

어셈블리어

어셈블리어(Assembly Language)는 기계어 명령어를 사람이 읽기 쉽도록 기호 형태로 표현한 저급 언어입니다.
각 어셈블리 명령어는 기계어와 거의 1:1로 대응됩니다.

앞서 살펴본 기계어 코드를 MIPS 어셈블리어로 표현하면 다음과 같습니다.

addi $t0, $zero, 1
addi $t1, $zero, 2
add  $t2, $t0, $t1

여기서 $t0, $t1, $t2는 CPU 내부의 레지스터를 의미하며, $zero는 항상 0 값을 가지는 특수한 레지스터입니다.

기계어와 비교하면 훨씬 읽기 쉬운 형태이기 때문에 어떤 작업이 수행될지 이해해 볼 수 있었지만, 여전히 고급 언어에 비하면 복잡한 편입니다.

대부분의 어셈블리어 한 줄은 하나의 기계어 명령어에 대응하지만, 경우에 따라 여러 개의 기계어로 변환되거나, 데이터나 구조를 정의하기 위한 지시어일 수 도 있습니다.

성능 최적화가 중요한 상황이나 임베디드 시스템 개발, 컴파일러 개발, 보안 분야 등에서는 어셈블리어가 사용되기도 합니다.

ComputerScience 카테고리 내 다른 글 보러가기

댓글남기기