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 어셈블리 언어 개발 도구이다. -
자유 컴파일러와 인터프리터 -
Tcl
Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다. -
자유 컴파일러와 인터프리터 -
PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다. -
공식 웹사이트에 알 수 없는 변수를 사용한 문서 -
브루클린 미술관
브루클린 미술관은 1823년 브루클린 견습생 도서관으로 시작하여 현재 약 50만 점의 소장품을 보유한 뉴욕 브루클린 소재의 미술관으로, 다양한 분야의 예술 작품을 전시하며 특히 아프리카 미술과 여성주의 미술에 대한 기여가 크다. -
공식 웹사이트에 알 수 없는 변수를 사용한 문서 -
광주지방기상청
광주지방기상청은 광주광역시와 전라남도 지역의 기상 예보, 특보, 관측, 기후 정보 제공 등의 업무를 수행하는 기상청 소속 기관으로, 1949년 광주측후소로 설치되어 1992년 광주지방기상청으로 개편되었으며, 기획운영과, 예보과, 관측과, 기후서비스과와 전주기상지청, 목포기상대를 두고 있다.
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" 심볼에 할당