상세 컨텐츠

본문 제목

[시스템 해킹/ 5주차] 어셈블리어 - 리틀에디안, 빅에디안

Ping!

by _young 2024. 2. 25. 02:40

본문

어셈블리어

: 컴퓨터 프로그램을 기술하는 언어의 하나로,  알파벳 기호 등 인간이 판독하기 쉬운 기호 형식으로 기계 명령(machine instruction)에 대응하는 저수준 언어

 

각 명령문은 통상 단일 기계 명령과 1:1로 대응. 어셈블리 언어로 프로그램을 작성한 후에는 어셈블러를 사용하여 어셈블리 언어를 기계어로 번역해야 함. 어셈블리 언어는 속도, 제어, 사용자의 선호도 등의 이유로 고수준 언어 대신 사용됨. 어셈블리 언어로 작성된 프로그램은 대체로 컴파일러 언어로 작성된 프로그램보다 실행 속도가 빠르고, 어셈블리 언어는 프로그래머가 하드웨어(프로세스, 메모리, 화면,입출력 접속구)와 직접상호 작용할 수 있기 때문.

 

어셈블리어로 프로그래밍할 때, 데이터를 메모리에 저장하는 방식도 중요한 요소임.

컴퓨터는 데이터를 메모리에 저장할 때 바이트(byte) 단위로 나눠서 저장하는데, 컴퓨터가 저장하는 데이터는 대게 32비트(4바이트)나 64비트(8바이트)로 구성됨.

따라서 이렇게 연속되는 바이트를 순서대로 저장해야 하는데, 이것을 바이트 저장 순서(byte order)라고 함.

 

이때 바이트가 저장되는 순서에 따라 빅엔디안(big endian) 방식, 리틀엔디안(little endian) 방식으로 나눌 수 있음.

 

 

빅엔디안(big endian) 

: 낮은 주소에 데이터의 높은 바이트(MSB, Most Significant Bit)부터 저장하는 방식

 

이 방식은 평소 우리가 숫자를 사용하는 선형 방식과 같은 방식

따라서 메모리에 저장된 순서 그대로 읽을 수 있으며, 이해하기가 쉽다는 장점을 가지고 있음.

SPARC을 포함한 대부분의 RISC CPU 계열에서는 이 방식으로 데이터를 저장

 

예를 들어, 32비트 정수 0x12345678을 빅엔디안 방식으로 저장하면 아래와 같이 저장됨.

주소 데이터
0x00 0x12
0x01 0x34
0x02 0x56
0x03 0x78

 

 

 

틀엔디안(little endian) 

: 낮은 주소에 데이터의 낮은 바이트(LSB, Least Significant Bit)부터 저장하는 방식

 

이 방식은 평소 우리가 숫자를 사용하는 선형 방식과는 반대로 거꾸로 읽어야 함.

대부분의 인텔 CPU 계열에서는 이 방식으로 데이터를 저장

 

리틀엔디안 방식으로 위와 같이 32비트 정수 0x12345678을 빅엔디안 방식으로 저장하면 아래와 같이 저장됨.

주소 데이터
0x00 0x78
0x01 0x56
0x02 0x34
0x03 0x12

 

 

 

빅 엔디안과 리틀 엔디안은 단지 저장해야 할 큰 데이터를 어떻게 나누어 저장하는가에 따른 차이일 뿐, 어느 방식이 더 우수하다고는 단정할 수 없음.

물리적으로 데이터를 조작하거나 산술 연산을 수행할 때에는 리틀 엔디안 방식이 더 효율적이고, 데이터의 각 바이트를 배열처럼 취급할 때에는 빅 엔디안 방식이 더 적합함.

 

 

 

[참고 자료]

https://www.tcpschool.com/c/c_refer_endian

관련글 더보기