GNU 어셈블러
1. 개요
GNU 어셈블러(GAS)는 1986년에 처음 출시된 어셈블러로, 다양한 아키텍처를 지원하며, 특히 AT&T 구문을 기본으로 사용한다. GAS는 어셈블러 지시자와 주석을 지원하며, C 언어와 유사한 여러 줄 주석과 아키텍처에 따라 다양한 형식의 한 줄 주석을 제공한다. 버전 2.10부터는 인텔 구문도 지원한다. GAS는 GCC의 백엔드로 널리 사용되며, 리눅스 및 macOS 환경에서 어셈블러로 활용된다.
| 이름 | GNU 어셈블러 |
|---|---|
| 개발자 | GNU 프로젝트 |
| 최신 버전 | GNU Binutils |
| 프로그래밍 언어 | C |
| 플랫폼 | 크로스 플랫폼 |
| 종류 | 어셈블러 |
| 라이선스 | GNU 일반 공중 사용 허가서 v3 |
| 웹사이트 | GNU Binutils 웹사이트 |
-
어셈블러 -
터보 어셈블러
볼랜드에서 개발한 터보 어셈블러는 빠른 속도와 MASM과의 높은 호환성을 특징으로 하며, 어셈블리 프로그래밍 입문자를 위한 튜토리얼과 샘플 코드를 제공하지만, 참조 문서 부족은 단점으로 지적되었다. -
어셈블러 -
마이크로소프트 매크로 어셈블러
마이크로소프트 매크로 어셈블러(MASM)는 1981년 첫 출시 후 인텔 프로세서 명령어와 SIMD, MMX 명령어 지원을 추가하며 업데이트되어 왔고, 현재는 Visual Studio에 통합되어 다양한 IDE, 디버거, 디스어셈블러를 통해 개발 환경이 지원되는 x86 어셈블리 언어 개발 도구이다. -
유닉스 프로그래밍 도구 -
펄
펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다. -
유닉스 프로그래밍 도구 -
GNU 컴파일러 모음
GNU 컴파일러 모음(GCC)은 리처드 스톨먼이 1987년 처음 출시한 자유 소프트웨어 컴파일러 시스템으로, C, C++, Fortran, Ada, Go 등 다양한 프로그래밍 언어를 지원하며 여러 명령어 집합 아키텍처와 플랫폼에서 널리 사용된다. -
GNU 프로젝트 소프트웨어 -
GNU 코어 유틸리티
GNU 코어 유틸리티는 유닉스 계열 운영체제에서 파일, 셸, 텍스트 조작을 위한 기본적인 명령어 모음으로, GNU 파일 유틸리티에서 시작하여 3개의 패키지가 통합되어 발전했으며 셸 스크립트 및 시스템 관리에 필수적인 도구를 제공한다. -
GNU 프로젝트 소프트웨어 -
GNU 허드
GNU 허드는 유닉스 운영 체제를 대체하는 것을 목표로 개발된 GNU 프로젝트의 커널로, 마이크로커널 기반의 서버-클라이언트 아키텍처를 사용하며, 파일 시스템 기능을 확장하는 트랜슬레이터 개념을 제공한다.
2. 역사
GAS의 첫 번째 버전은 1986년에서 1987년 사이에 출시되었다. 이 버전은 딘 엘스너(Dean Elsner)가 작성했으며, VAX 아키텍처를 지원했다.
3. 일반적인 문법
GAS는 지원하는 모든 아키텍처에서 사용할 수 있는 일반적인 문법을 지원한다. 이 일반 문법에는 어셈블러 지시자와 주석 작성 방법 등이 포함된다. GAS의 기본 구문은 AT&T 구문이다.
3.1. 어셈블러 지시자
GAS는 C 언어의 전처리기와 비슷하게 동작하는 어셈블러 지시어(의사 연산자라고도 함)를 사용한다. 이 지시어는 마침표(`.`)로 시작하는 키워드 형태를 가진다. 대부분의 사용 가능한 어셈블러 지시어는 대상 구조와 상관없이 사용할 수 있지만, 일부 지시어는 특정 기계에 종속적이기도 하다.
버전 2.10부터는 .intel_syntax 지시어를 사용하여 인텔 구문을 사용할 수 있다.
3.2. 주석
GAS는 두 가지 스타일의 주석을 지원한다. 여러 줄에 걸쳐 작성하는 주석과 한 줄만 작성하는 주석을 사용할 수 있다. 여러 줄 주석은 C 언어와 유사한 방식을 따르며, 한 줄 주석은 어셈블 대상 아키텍처에 따라 사용하는 기호가 다르다.
3.2.1. 다중 라인 주석
C언어와 마찬가지로, 여러 줄 주석은 슬래시-별표 쌍(`/*`와 `*/`)으로 시작하고 끝낸다.
예시:
/*
주석
*/
코드 내에서도 사용할 수 있다.
movl %eax,%edx /* 여기는 주석
개행이 포함된
설명문 */
3.2.2. 단일 라인 주석
단일 라인 주석은 어셈블되는 아키텍처에 따라서 여러 다른 형식을 가진다.
GAS는 일반적으로 `#` 기호를 사용하여 한 줄 주석을 나타낸다.
예시는 다음과 같다:
pop %edx # 여기는 주석
# 여기도 주석
movl %edx,%eax
4. 사용
GCC라는 유명한 컴파일러의 백엔드로서 GNU 어셈블러(GAS)는 현대적인 자유-오픈 소스 소프트웨어를 컴파일하는 데 매우 폭넓게 사용된다. GAS는 다른 GNU 소프트웨어와 함께 GNU/리눅스 운영 체제에서 어셈블러로 자주 사용된다. 또한 GAS의 수정된 버전은 macOS 개발 도구 패키지에서도 찾아볼 수 있다.
5. 문법 (표기법)
GAS는 지원하는 모든 아키텍처에서 작동하는 일반적인 문법을 지원한다. 이 일반 문법에는 어셈블러 지시어와 주석 작성 방법 등이 포함된다. 기본적으로 사용하는 문법은 AT&T 구문이다.
x86이나 x86-64와 같은 아키텍처에서 일반적으로 사용되는 인텔 문법이 아닌 AT&T 구문을 기본으로 사용하는 점은 비판을 받기도 한다. 예를 들어, `mov`와 같은 명령어에서 인수의 순서가 인텔 문법과 반대로 되어 있다.
하지만 버전 2.10부터 .intel_syntax 지시어를 통해 인텔 문법도 지원하게 되었다.
6. 예시 프로그램
IA-32 리눅스에서 표준 AT&T 문법을 사용하는 표준 “Hello, world!” 프로그램은 다음과 같다.
.global _start
.text
_start:
movl $4, %eax # 4 ("write" 시스템 호출 코드) -> EAX 레지스터
movl $1, %ebx # 1 (표준 출력에 대한 파일 디스크립터) -> EBX (시스템 호출의 첫 번째 인수)
movl $msg, %ecx # msg 문자열의 32비트 주소 -> ECX (두 번째 인수)
movl $len, %edx # msg 문자열의 길이 -> EDX (세 번째 인수)
int $0x80 # 주소 0x80 (128)에서 인터럽트, 커널의 시스템 호출 프로시저 호출
movl $1, %eax # 1 ("exit") -> EAX
movl $0, %ebx # 0 (성공) -> EBX
int $0x80 # 이전과 동일
.data
msg:
.ascii "Hello, world!\n" # 인라인 아스키 문자열
len = . - msg # (현재 주소 - msg 시작 주소)를 "len" 심볼에 할당