우분투 GNU as 명령어 완벽 가이드: 어셈블러 기초와 실습 예제

개요

GNU 어셈블러인 as 명령어의 개념을 이해하고, 어셈블리 소스 코드를 오브젝트 파일로 어셈블하는 전체 과정을 다룹니다. 필수 패키지 설치부터 주요 옵션 활용, 바이너리 링킹 및 실행 결과 검증까지 단계별 실습 예제를 통해 상세히 알아봅니다.

1. binutils 패키지 설치 및 as 어셈블러 환경 확인

as 어셈블러 실습 및 컴파일 환경 구성을 위해 binutils와 gcc 패키지를 설치합니다.

apt-get update -qq && apt-get install -y binutils gcc

as 명령어는 GNU 어셈블러(GAS)로, 어셈블리어 소스 코드를 기계어 오브젝트 파일로 변환합니다.
--version 옵션을 사용하여 현재 시스템에 설치된 어셈블러의 버전과 타깃 아키텍처를 확인합니다.
⚙️ [주요 옵션]

-o : 생성할 출력 오브젝트 파일의 이름을 지정합니다.
-g : 디버거 활용을 위한 디버깅 정보를 오브젝트 파일에 포함합니다.
-a : 소스 코드와 어셈블된 기계어 바이트를 함께 보여주는 리스팅을 출력합니다.
--32 : 32비트 아키텍처용 오브젝트 코드를 생성합니다.
--64 : 64비트 아키텍처용 오브젝트 코드를 생성합니다.
-v 또는 --version : 어셈블러의 버전 정보를 출력합니다.

as –version

2. 샘플 어셈블리 코드 작성 및 기본 오브젝트 파일 생성

as 어셈블러 실습을 위해 종료 코드 42를 반환하는 간단한 x86-64 어셈블리 소스 파일 exit_code.s를 생성합니다.

cat « ‘EOF’ > exit_code.s
.global _start
.text
_start:
mov $60, %rax
mov $42, %rdi
syscall
EOF

as 명령어에 -o 옵션을 지정하여 작성한 exit_code.s 소스 코드를 기계어 오브젝트 파일인 exit_code.o로 빌드합니다.
문법 오류가 없다면 화면에 아무런 메시지를 출력하지 않고 빌드를 정상 완료합니다.

as -o exit_code.o exit_code.s

오브젝트 파일이 정상적으로 생성되었는지 확인하기 위해 ls -l exit_code.o 명령어를 실행하여 파일의 상세 정보와 크기를 확인합니다.

ls -l exit_code.o

3. 디버그 심볼 추가(-g) 및 어셈블리 리스팅 파일(-a) 생성

GDB 등의 디버거를 사용해 소스 코드 단위로 추적할 수 있도록 -g 옵션을 추가하여 디버깅 심볼이 포함된 exit_code_debug.o 오브젝트 파일을 생성합니다.
오류가 없다면 별도의 출력 없이 명령어가 정상적으로 완료됩니다.

as -g -o exit_code_debug.o exit_code.s

어셈블리 소스 코드와 변환된 기계어 바이트를 함께 확인할 수 있는 리스팅 파일을 만들기 위해 -a=exit_code.lst 옵션을 지정하여 어셈블을 수행합니다.
이 과정을 통해 목적 파일 exit_code.o와 함께 리스팅 정보가 담긴 exit_code.lst 파일이 생성됩니다.

as -a=exit_code.lst -o exit_code.o exit_code.s

생성된 리스팅 파일의 내용을 확인하기 위해 head -n 20 exit_code.lst 명령어를 실행하여 상위 20줄을 출력합니다.
출력 결과를 통해 각 어셈블리 명령어 라인 번호와 오프셋, 그리고 변환된 실제 기계어 16진수 바이트 코드를 직관적으로 확인할 수 있습니다.

head -n 20 exit_code.lst

4. ld 링커 연동 및 실행 파일 생성과 결과 검증

앞서 생성한 exit_code.o 오브젝트 파일을 링크하여 실행 가능한 바이너리 파일 exit_program을 생성하기 위해 ld -o exit_program exit_code.o 명령어를 실행합니다.
링커에 별다른 오류가 없다면 화면에 메시지를 출력하지 않고 실행 파일 생성을 완료합니다.

ld -o exit_program exit_code.o

생성된 실행 파일 exit_program을 ./exit_program 명령어로 직접 실행합니다.
별도의 표준 출력을 수행하지 않고 프로그램이 종료되므로 터미널 화면에는 아무런 내용도 출력되지 않습니다.

./exit_program

직전 실행된 프로그램의 반환값을 확인하기 위해 echo "종료 코드: $?" 명령어를 실행합니다.
프로세스가 정상 종료되어 종료 코드로 0이 성공적으로 출력된 것을 확인할 수 있습니다.

echo “종료 코드: $?”

지금까지 우분투 환경에서 GNU as 명령어를 활용한 어셈블러 기초와 실습 예제를 간단하게 살펴보았습니다.
직접 코드를 어셈블하고 실행해보며 리눅스 시스템의 저수준 동작 원리를 이해하는 데 도움이 되었기를 바랍니다.