[Assembly] 어셈블리어란?

gunha·2024년 10월 5일
0

Assembly

목록 보기
1/5

컴퓨터를 더 자세히 알기위해 어셈블리어를 공부한 내용을 작성

기계어

CPU가 이해할 수 있는 언어이다. 전기 신호를 0과 1로 표현한 것이다.
예시

x = 10 + 2
y = x + 4

이 표현을 MIPS라는 아키텍처의 기계어로 옮기면 다음과 같다.

001001 11101 11101 1111111111111000
001000 00001 00000 0000000000001010
001000 00001 00001 0000000000000010
101011 11101 00001 0000000000000000
001000 00010 00001 0000000000000100
101011 11101 00010 0000000000000100
001001 11101 11101 0000000000001000

보통은 4자리씩 끊어서 16진수로 표현한다. 16진수로 표현하자면 다음과 같다.

27 BD FF F8
20 20 00 0A
20 21 00 02
AF A1 00 00
20 41 00 04
AF A2 00 04
27 BD 00 08

기계어가 아키텍쳐마다 다른 이유

  • 하드웨어 설계의 차이
    • 각 아키 텍처는 서로 다른 하드웨어 설계 및 구성 요소(CPU/메모리/입출력장치)를 가지고 있어서 명렁어 집합이 달라질 수 밖에 없다(RISC/CISC 등)
  • 성능 최적화
    • 각 아키텍처는 특정 작업에 최적화되어 있어서 특정 아키텍처에서 잘 동작하는 명령어와 데이터 처리 방식이 다른 아키텍처에서는 비효율적일수 있다. 예를 들면 그래픽 처리에 최적화된 GPU 아키텍처는 일반 CPU 아키텍처와는 다른 기계어를 사용 한다.
  • 시장 경쟁
    • 다양한 아키텍처는 결국 기업 간 경쟁의 결과이다. 각 기업은 기술과 설계를 통해 차별화를 시도하며, 이러한 과정에서 기계어 및 아키텍처가 다르게 발전하게 된다. 특정 아키텍처는 특정 용도(모바일, 서버, 임베디드 시스템 등)에 더 적합하게 설계 된다.

어셈블리어

어셈블리어(Assembly Language)는 프로그래밍 언어의 하나로, 기계어에서 한 단계 위의 언어이며 기계어와 함께 단 둘뿐인 저급(Low Level) 언어에 속한다.

기계어라는 게 컴퓨터 관점에서 바로 읽을 수 있다는 것 빼고는 인간의 관점에서는 사용이 불편한 언어이기 때문에 이를 보완하기 위해 나온 것이 어셈블리어다. 따라서 어셈블리어의 특징은 기계어 1라인당 어셈블리 명령어가 대부분 1라인씩 대응되어 있고 이를 비교적 간단하게 짤 수 있는 어셈블러를 통해 기계어로 변환되도록 한 것이다. 이 때문에 어셈블리어는 고급 언어와 기계어 사이에 있다 하여 '중간 언어'라고도 불린다. 그리고 기계어는 CPU가 채택한 명령어셋(ISA)에 따라 다 다르기 때문에 어셈블리어의 명령어 역시 통일된 규격이 없다. 또한 문법 아키텍처에 따라서도 다르고 어셈블러의 종류에 따라서도 문법/매크로 등이 제각각이다.

표기법은 같은 아키텍처에 대해 서로 다른 어셈블러가 다르게 표기법을 가질 수 있다. 예를 들어, Intel 어셈블리어라고 하더라도 NASM에서 사용하는 표기법과 MASM에서 사용하는 표기법은 다르다.

어셈블러

어셈블리어로 작성된 코드를 기계어로 바꿔주는 일종의 컴파일러이다. 여러가지 종류가 존재한다. 아키텍처마다 어셈블러가 다르고, 어셈블리어도 다르다.

NASM, MASM, FASM 등 다양한 어셈블러가 있으며, 이들은 각각 고유한 문법과 기능을 가지고 있다.
이들은 python,java,c 처럼 서로 다른 문법을 가지고있으며 아키텍처에 따라서 다른 기계어로 번역한다. 하나의 어셈블러로 서로 다른 아키텍처의 기계어로 번역도 가능하다. (ex GNU Assembler)

"각각 고유한 문법과 기능을 가지고 있다"는 것은 각 어셈블러가 서로 다른 어셈블리어 문법을 사용한다는 의미이며, 어셈블리어는 아키텍처에 종속적이며, 어셈블러는 그 아키텍처의 어셈블리어를 변환하는 도구이다.

0개의 댓글