GNU 어셈블러
"오늘의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]
GAS는 지원하는 모든 아키텍처에서 사용할 수 있는 일반적인 문법을 지원한다. 이 일반 문법에는 어셈블러 지시자와 주석 작성 방법 등이 포함된다. GAS의 기본 구문은 AT&T 구문이다.
3. 일반적인 문법
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