기계어

기계어(Machine Code)는 프로세서의 명령어 집합 아키텍처(ISA)가 정의한 명령어를 컴퓨터가 처리할 수 있는 이진 형식으로 인코딩한 것이다. 레지스터 이동·산술·분기·메모리 접근 등 연산은 ISA마다 다른 명령어 비트 패턴을 사용하며 CPU가 이들을 인출·해독해 실행한다. 사람...

영어 명칭Machine Code
분류CPU가 실행하는 인코딩 명령어
정의 기반명령어 집합 아키텍처(ISA)
표현바이너리 비트·명령어 바이트
관련 언어어셈블리어
생성 도구컴파일러, 어셈블러, JIT 엔진
실행 구조명령어 인출·해독·실행
주요 대상x86-64, ARM, RISC-V 등
실행 파일ELF, PE/COFF, Mach-O 등 컨테이너별
공식 예시Intel Software Developer Manuals
RISC-V ISARISC-V Specifications

기계어(Machine Code)는 프로세서의 명령어 집합 아키텍처(ISA)가 정의한 명령어를 컴퓨터가 처리할 수 있는 이진 형식으로 인코딩한 것이다. 레지스터 이동·산술·분기·메모리 접근 등 연산은 ISA마다 다른 명령어 비트 패턴을 사용하며 CPU가 이들을 인출·해독해 실행한다. 사람이 읽기 쉬운 어셈블리어의 기호와 대비되는 개념으로, 대개 컴파일러·어셈블러·JIT 코드 생성기가 작성한다.[1]

명령어의 인코딩은 opcode와 레지스터·즉치값·주소 지정 및 접두부 등 필드를 포함할 수 있다. x86-64는 길이가 변하는 명령어를 사용하고 여러 RISC 계열은 상대적으로 규칙적인 고정 길이 또는 압축 명령을 지원한다. 같은 add라는 어셈블리 표기라도 대상 ISA에 따라 바이트 배열과 연산·플래그 동작이 다르다.

실행 파일 전체와 기계어는 동일하지 않다. PE·ELF·Mach-O 파일에는 기계어 코드뿐 아니라 데이터, 심벌·재배치, 동적 링크 정보 및 메타데이터가 함께 저장될 수 있다. 링커는 여러 목적 파일을 배치하고 주소를 결정하며 로더는 실행 시 필요한 코드·데이터를 메모리에 매핑한다. CPU가 실행할 코드가 메모리에 있다고 해서 아무 데이터 바이트나 유효한 명령어가 되는 것은 아니다.

기계어의 의미는 프로세서 아키텍처와 실행 환경의 특권 수준·메모리 보호에 영향을 받는다. x86 기계 코드를 ARM CPU에서 직접 실행하지 못하는 이유가 여기 있으며, 별도 에뮬레이션·변환 계층이 있으면 다른 ISA 프로그램을 실행할 수 있다. 취약점 분석에서는 기계 명령과 바이너리를 역어셈블하고 제어·데이터 흐름을 확인하는 작업이 중요하다.

역사

정의와 적용 범위

구조와 형식

컴파일·실행 과정

하드웨어·운영체제와의 관계

개발·디버깅 도구

보안·호환성과 주의점

관련 문서

  1. Intel Software Developer's Manual ↩