GAS
GAS
GAS(GNU Assembler)는 GNU 프로트의 공식 어셈블로, 주로닉스 계열 운영제와 리눅스 환경에서 사용되는 저수준 프래밍 도구입니다. C, C 어셈블리 언어 등 작성된 소스 코드가 컴파일된 후 생성 어셈블리 코드를 기계어로환하는 역할을 수행합니다. GAS는 GNU Binutils 패키지의 핵심 구성 요소 중 하나이며, GCC(GNU Compiler Collection)와 긴밀하게 통합되어 있어 소프트웨어 개발 과정에서 중요한 위치를 차지합니다.
개요
GAS는 다양한 프로세서 아키텍처를 지원하며, 주로 AT&T 문법 스타일의 어셈블리 코드를 처리합니다. 이는 인텔 문법과 구조적으로 차이가 있어, 특히 x86/x86-64 아키텍처에서 주목할 만한 특징입니다. GAS는 포터블하고 확장 가능한 설계를 기반으로 하며, 오픈소스 생태계에서 저수준 시스템 프로그래밍, 커널 개발, 임베디드 시스템 등 다양한 분야에서 널리 사용됩니다.
주요 기능
1. 다중 아키텍처 지원
GAS는 다음과 같은 주요 프로세서 아키텍처를 지원합니다: - x86 및 x86-64 (IA-32, x86-64) - ARM, AArch64 - MIPS - PowerPC - RISC-V - SPARC - IBM System z (s390)
이러한 다중 아키텍처 지원 덕분에 GAS는 크로스 컴파일 환경에서도 유용하게 활용됩니다.
2. AT&T 문법 사용
GAS는 기본적으로 AT&T 문법(AT&T Syntax)을 사용합니다. 이 문법은 다음과 같은 특징을 가집니다:
- 피연산자 순서: 소스, 목적지 (예: mov %eax, %ebx)
- 레지스터 이름 앞에 % 기호 사용
- 즉시값 앞에 $ 기호 사용
- 주소 참조 시 괄호 사용 (예: mov (%eax), %ebx)
예시:
movl $42, %eax # 즉시값 42를 레지스터 EAX에 저장
addl %ebx, %eax # EBX 값을 EAX에 더함
3. 전처리기와의 통합
GAS는 일반적으로 C 프로그램 컴파일 과정에서 GCC가 생성한 .s 확장자를 가진 어셈블리 파일을 입력으로 받습니다. GCC는 어셈블리 코드에 C 전처리 지시어(#include, #define 등)를 포함할 수 있도록 하며, 이는 GAS가 전처리된 코드를 직접 처리하거나, [cpp](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC/cpp)와 같은 전처리기와 함께 작동할 수 있게 합니다.
사용 방법
명령어 형식
GAS는 명령줄에서 [as](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%96%B4%EC%85%88%EB%B8%94%EB%9F%AC/as) 명령어로 실행됩니다. 기본적인 사용법은 다음과 같습니다:
as [옵션] 입력파일.s -o 출력파일.o
대표적인 옵션:
- -32 또는 -64: 대상 아키텍처의 비트 수 지정
- --gstabs: 디버깅 정보를 Stabs 형식으로 포함
- -o: 출력 오브젝트 파일 이름 지정
- --target=: 특정 타겟 아키텍처 지정 (크로스 어셈블리 시 사용)
예제
간단한 "Hello, World!" 어셈블리 프로그램을 GAS로 어셈블링하는 예:
# hello.s
.section .data
msg: .ascii "Hello, World!\n"
len = . - msg
.section .text
.globl _start
_start:
mov $4, %eax # sys_write 시스템 콜 번호
mov $1, %ebx # 파일 디스크립터 (stdout)
mov $msg, %ecx # 메시지 주소
mov $len, %edx # 메시지 길이
int $0x80 # 시스템 콜 호출
mov $1, %eax # sys_exit
mov $0, %ebx
int $0x80
컴파일 및 링크:
as hello.s -o hello.o
ld hello.o -o hello
./hello
GAS와 다른 어셈블러 비교
| 특징 | GAS (GNU Assembler) | NASM | MASM |
|---|---|---|---|
| 문법 | AT&T | 인텔 | 인텔 |
| 라이선스 | GPL (오픈소스) | BSD | 상용 |
| 플랫폼 | 리눅스, 유닉스 중심 | 크로스 플랫폼 | 윈도우 |
| 통합성 | GCC와 긴밀 통합 | 독립적 | MS 도구 체인 |
| 확장성 | 높음 (Binutils 일부) | 중간 | 낮음 |
GAS는 오픈소스 생태계와 깊이 통합되어 있어, 리눅스 커널, 부트로더(U-Boot), GCC 기반 프로젝트 등에서 사실상 표준 어셈블러로 자리 잡고 있습니다.
관련 도구
GAS는 GNU Binutils 패키지에 포함되어 있으며, 다음 도구들과 함께 사용됩니다:
- [ld](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%A7%81%EC%BB%A4/ld): GNU 링커
- [objdump](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%94%94%EB%B2%84%EA%B9%85%20%EB%8F%84%EA%B5%AC/objdump): 오브젝트 파일 분석 도구
- [objcopy](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%94%94%EB%B2%84%EA%B9%85%20%EB%8F%84%EA%B5%AC/objcopy): 오브젝트 파일 변환
- [readelf](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%94%94%EB%B2%84%EA%B9%85%20%EB%8F%84%EA%B5%AC/readelf): ELF 파일 정보 출력
- [strip](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EB%94%94%EB%B2%84%EA%B9%85%20%EB%8F%84%EA%B5%AC/strip): 심볼 정보 제거
이러한 도구들은 저수준 시스템 개발 및 디버깅에 필수적입니다.
참고 자료
- GNU Assembler 공식 문서
- GNU Binutils 프로젝트
- "Programming from the Ground Up" – 저수준 리눅스 프로그래밍과 GAS 사용법을 다룬 무료 책
- "Computer Systems: A Programmer's Perspective" – 어셈블리와 시스템 구조에 대한 심화 학습 자료
GAS는 현대 소프트웨어 개발의 기반이 되는 저수준 도구로서, 시스템 프로그래머와 컴파일러 개발자에게 필수적인 지식과 기술을 제공합니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.