어셈블리어
어셈블리어(Assembly language)는 중앙 처리 장치가 실행하는 기계어 명령을 사람이 읽고 작성하기 쉬운 기호와 명령어 이름으로 표현하는 저수준 프로그래밍 언어의 총칭이다. 숫자로 된 연산 코드와 메모리 주소를 MOV, ADD, JMP와 같은 명령어 니모닉, 레지스터 이름, 레...
| 영문명 | Assembly language |
|---|---|
| 분류 | 저수준 프로그래밍 언어 |
| 실행 방식 | 어셈블러를 통한 기계어 변환 |
| 추상화 대상 | 명령어 집합 아키텍처 |
| 주요 구성 요소 | 명령어 니모닉, 피연산자, 레지스터, 레이블, 지시어 |
| 주요 계열 | x86, x86-64, Arm, AArch64, RISC-V, MIPS, Power ISA, IBM Z |
| 주요 구현체 | GNU Assembler, NASM, MASM, FASM, LLVM Integrated Assembler |
| 파일 확장자 | .asm, .s, .S |
어셈블리어(Assembly language)는 중앙 처리 장치가 실행하는 기계어 명령을 사람이 읽고 작성하기 쉬운 기호와 명령어 이름으로 표현하는 저수준 프로그래밍 언어의 총칭이다. 숫자로 된 연산 코드와 메모리 주소를 MOV, ADD, JMP와 같은 명령어 니모닉, 레지스터 이름, 레이블과 기호로 나타내며, 작성된 소스 코드는 어셈블러에 의해 기계어 또는 오브젝트 파일로 변환된다.[1]
어셈블리어는 하나의 공통된 언어가 아니다. 각 어셈블리어는 특정 명령어 집합 아키텍처와 밀접하게 연결되어 있으며, x86-64용 코드와 AArch64용 코드는 사용할 수 있는 명령어, 레지스터, 주소 지정 방식과 호출 규약이 서로 다르다. 같은 아키텍처에서도 GNU Assembler의 AT&T 문법과 Intel 문법처럼 어셈블러와 개발 도구에 따라 표기 방식이 달라질 수 있다. Intel의 아키텍처 설명서도 프로세서의 프로그래밍 환경과 명령어 집합을 별도의 참조 체계로 정의한다.[2]
일반적인 어셈블리 명령은 기계 명령 하나와 가까운 관계를 가지지만, 모든 문장이 반드시 하나의 기계 명령으로 직접 대응하는 것은 아니다. 어셈블러 지시어는 실행 명령을 만들지 않고 데이터 배치, 섹션 구성과 심벌 정의를 제어할 수 있으며, 의사 명령어는 어셈블러에 의해 하나 이상의 실제 명령으로 변환될 수 있다. 매크로와 조건부 어셈블리 기능을 제공하는 구현체도 있으므로 어셈블리 소스는 단순한 기계어의 문자 치환보다 넓은 표현 능력을 가진다. GNU Assembler 역시 여러 프로세서용 문법과 기계 의존 기능, 지시어와 매크로 기능을 제공한다.[3]
초기 컴퓨터에서는 프로그램을 수치 형태의 기계어로 직접 작성해야 했으나, 어셈블리어와 어셈블러가 도입되면서 연산 코드와 기억 장소를 숫자 대신 이름으로 나타낼 수 있게 되었다. 다만 초기 어셈블리어도 일반적으로 프로세서 명령 하나마다 소스 코드 한 줄을 작성해야 했으며, 이러한 하드웨어 의존성과 낮은 추상화 수준은 이후 FORTRAN, COBOL, Lisp과 같은 고급 프로그래밍 언어가 발전하는 배경 가운데 하나가 되었다.[4]
현대 소프트웨어의 대부분은 C (프로그래밍 언어), C++, Rust와 같은 고급 언어로 작성되지만, 어셈블리어는 부팅 코드, 운영체제의 아키텍처 의존 부분, 인터럽트와 문맥 교환, 임베디드 시스템, 장치 제어, 암호화 루틴, 벡터 명령 최적화와 역공학 등에서 계속 사용된다. 또한 컴파일러가 생성한 명령을 분석하거나 프로세서의 레지스터, 메모리 모델, 호출 규약과 실행 과정을 이해하기 위한 수단으로 활용된다.