맨위로가기

GNU 어셈블러

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

GNU 어셈블러(GAS)는 1986년에 처음 출시된 어셈블러로, 다양한 아키텍처를 지원하며, 특히 AT&T 구문을 기본으로 사용한다. GAS는 어셈블러 지시자와 주석을 지원하며, C 언어와 유사한 여러 줄 주석과 아키텍처에 따라 다양한 형식의 한 줄 주석을 제공한다. 버전 2.10부터는 인텔 구문도 지원한다. GAS는 GCC의 백엔드로 널리 사용되며, 리눅스 및 macOS 환경에서 어셈블러로 활용된다.

더 읽어볼만한 페이지

  • 어셈블러 - 터보 어셈블러
    볼랜드에서 개발한 터보 어셈블러는 빠른 속도와 MASM과의 높은 호환성을 특징으로 하며, 어셈블리 프로그래밍 입문자를 위한 튜토리얼과 샘플 코드를 제공하지만, 참조 문서 부족은 단점으로 지적되었다.
  • 어셈블러 - 마이크로소프트 매크로 어셈블러
    마이크로소프트 매크로 어셈블러(MASM)는 1981년 첫 출시 후 인텔 프로세서 명령어와 SIMD, MMX 명령어 지원을 추가하며 업데이트되어 왔고, 현재는 Visual Studio에 통합되어 다양한 IDE, 디버거, 디스어셈블러를 통해 개발 환경이 지원되는 x86 어셈블리 언어 개발 도구이다.
  • 유닉스 프로그래밍 도구 -
    펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다.
  • 유닉스 프로그래밍 도구 - GNU 컴파일러 모음
    GNU 컴파일러 모음(GCC)은 리처드 스톨먼이 1987년 처음 출시한 자유 소프트웨어 컴파일러 시스템으로, C, C++, Fortran, Ada, Go 등 다양한 프로그래밍 언어를 지원하며 여러 명령어 집합 아키텍처와 플랫폼에서 널리 사용된다.
  • 자유 컴파일러와 인터프리터 - Tcl
    Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
  • 자유 컴파일러와 인터프리터 - PHP
    PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
GNU 어셈블러 - [IT 관련 정보]에 관한 문서
기본 정보
이름GNU 어셈블러
개발자GNU 프로젝트
최신 버전GNU Binutils
최신 버전 출시일}}
프로그래밍 언어C
플랫폼크로스 플랫폼
종류어셈블러
라이선스GNU 일반 공중 사용 허가서 v3
웹사이트GNU Binutils 웹사이트

2. 역사

GAS의 첫 번째 버전은 1986년에서 1987년 사이에 출시되었다.[1] 이 버전은 딘 엘스너(Dean Elsner)가 작성했으며, VAX 아키텍처를 지원했다.[1]

3. 일반적인 문법

GAS는 지원하는 모든 아키텍처에서 사용할 수 있는 일반적인 문법을 지원한다. 이 일반 문법에는 어셈블러 지시자와 주석 작성 방법 등이 포함된다. GAS의 기본 구문은 AT&T 구문이다.

3. 1. 어셈블러 지시자

GAS는 C 언어의 전처리기와 비슷하게 동작하는 어셈블러 지시어(의사 연산자라고도 함)를 사용한다.[13][2] 이 지시어는 마침표(`.`)로 시작하는 키워드 형태를 가진다.[2] 대부분의 사용 가능한 어셈블러 지시어는 대상 구조와 상관없이 사용할 수 있지만, 일부 지시어는 특정 기계에 종속적이기도 하다.[13][2]

버전 2.10부터는 .intel_syntax 지시어를 사용하여 인텔 구문을 사용할 수 있다.[3][4][5]

3. 2. 주석

GAS는 두 가지 스타일의 주석을 지원한다.[14][6] 여러 줄에 걸쳐 작성하는 주석과 한 줄만 작성하는 주석을 사용할 수 있다. 여러 줄 주석은 C 언어와 유사한 방식을 따르며, 한 줄 주석은 어셈블 대상 아키텍처에 따라 사용하는 기호가 다르다.

3. 2. 1. 다중 라인 주석

C언어와 마찬가지로, 여러 줄 주석은 슬래시-별표 쌍(`/*`와 `*/`)으로 시작하고 끝낸다.[6][9]

예시:



/*

주석

  • /



코드 내에서도 사용할 수 있다.



movl %eax,%edx /* 여기는 주석

개행이 포함된

설명문 */


3. 2. 2. 단일 라인 주석

단일 라인 주석은 어셈블되는 아키텍처에 따라서 여러 다른 형식을 가진다.

주석 기호사용 아키텍처
해시 기호 (#)i386, x86-64, i960, 68HC11, 68HC12, VAX, V850, M32R, PowerPC, MIPS, M680x0, RISC-V
세미콜론 (;)AMD 29k 제품군, ARC, H8/300 제품군, HPPA, PDP-11, picoJava, 모토로라, M32C
앳 기호 (@)32비트 ARM
두 개의 슬래시 (//)AArch64
수직 막대 (|)M680x0
느낌표 (!)Renesas SH



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부터[10] .intel_syntax 지시어를 통해 인텔 문법도 지원하게 되었다.[11][12]

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" 심볼에 할당


참조

[1] CiteSeerX The GNU Assembler
[2] 웹사이트 The GNU Assembler - Assembler Directives https://web.archive.[...] 2008-04-13
[3] 웹사이트 GNU Assembler News https://sourceware.o[...]
[4] 웹사이트 AT&T Syntax versus Intel Syntax https://web.archive.[...] 2014-07-28
[5] 웹사이트 Linux assemblers: A comparison of GAS and NASM http://www.ibm.com/d[...] IBM DeveloperWorks 2014-07-28
[6] 웹사이트 Using as https://web.archive.[...] 2013-01-10
[7] 웹사이트 GNU Binutils https://www.gnu.org/[...] gnu.org 2022-03-11
[8] 웹사이트 The GNU Assembler - Assembler Directives http://sources.redha[...] 2008-05-16
[9] 웹사이트 The GNU Assembler - Comments http://sources.redha[...] 2008-05-16
[10] 웹사이트 GNU Assembler News http://sourceware.or[...] 2008-05-16
[11] 웹사이트 AT&T Syntax versus Intel Syntax http://www.redhat.co[...] 2008-05-16
[12] 웹사이트 Linux assemblers: A comparison of GAS and NASM http://www.ibm.com/d[...] IBM DeveloperWorks 2007-10-17
[13] 웹인용 The GNU Assembler - Assembler Directives http://sources.redha[...] 2016-05-30
[14] 웹인용 Using as http://sources.redha[...] 2013-01-10
[15] 웹인용 GNU Assembler News http://sourceware.or[...]
[16] 웹인용 AT&T Syntax versus Intel Syntax http://sources.redha[...] 2014-07-28
[17] 웹인용 Linux assemblers: A comparison of GAS and NASM http://www.ibm.com/d[...] IBM DeveloperWorks 2014-07-28



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com