macOS에서 C 언어를 어셈블리어로 컴파일하려면 GCC(GNU Compiler Collection) 또는 Clang 컴파일러를 사용할 수 있습니다. macOS에는 기본적으로 Clang이 설치되어 있지만, GCC를 설치하려면 Homebrew와 같은 패키지 관리자를 사용할 수 있습니다.
아래는 macOS에서 C 언어를 어셈블리어로 컴파일하는 방법입니다.
- C 프로그램이 있는 파일을 준비하세요. 예를 들어, 파일 이름이
hello.c
라고 가정하겠습니다. - 터미널을 열고 아래와 같은 명령어를 입력하여 C 소스 코드를 어셈블리어로 컴파일하세요.Clang을 사용하는 경우:
clang -S -O0 -mllvm --x86-asm-syntax=intel hello.c -o hello.s
GCC를 사용하는 경우:
gcc -S -O0 -masm=intel hello.c -o hello.s
여기서 -S
옵션은 컴파일러에게 어셈블리어로 컴파일하도록 지시합니다. -O0
옵션은 최적화를 비활성화합니다. 최적화를 끄면 더 읽기 쉬운 어셈블리 코드를 얻을 수 있습니다. -mllvm --x86-asm-syntax=intel
(Clang) 또는 -masm=intel
(GCC) 옵션은 어셈블리어를 인텔 구문으로 출력하도록 설정합니다.
위의 명령어를 실행한 후, hello.s
파일에 어셈블리어 코드가 생성됩니다. 이 파일을 열어 어셈블리 코드를 확인할 수 있습니다.
Hello C 코드
#include <stdio.h>
int main(){
printf("Hello\n");
return 0;
}
어셈블리어
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 13, 0 sdk_version 13, 0
.intel_syntax noprefix
.globl _main ## -- Begin function main
.p2align 4, 0x90
_main: ## @main
.cfi_startproc
## %bb.0:
push rbp
.cfi_def_cfa_offset 16
.cfi_offset rbp, -16
mov rbp, rsp
.cfi_def_cfa_register rbp
sub rsp, 16
mov dword ptr [rbp - 4], 0
lea rdi, [rip + L_.str]
mov al, 0
call _printf
xor eax, eax
add rsp, 16
pop rbp
ret
.cfi_endproc
## -- End function
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "Hello\n"
.subsections_via_symbols
주어진 어셈블리 코드를 실행하려면 먼저 해당 코드를 컴파일하고 링크해야 합니다. 이 과정에서 다음과 같은 단계를 거칩니다.
어셈블리 코드를 파일에 저장합니다. 예를 들어, hello.s
라는 파일로 저장합니다.
터미널을 열고, 해당 어셈블리 파일을 목적 파일로 컴파일합니다. 이 때, 아래와 같은 명령어를 사용합니다.
gcc -c hello.s -o hello.o
이 명령어는 hello.s
파일을 hello.o
라는 목적 파일로 컴파일합니다.
이제 목적 파일을 실행 파일로 링크합니다. 다음과 같은 명령어를 사용합니다.
gcc hello.o -o hello
이 명령어는 hello.o
라는 목적 파일을 hello
이라는 실행 파일로 링크합니다.
실행 파일을 실행합니다.
./hello
- 이 명령어를 실행하면, 프로그램이 실행되고 “Hello” 문자열이 출력됩니다.
참고로, 이 과정은 x86-64 아키텍처 기반의 macOS 또는 Linux 시스템에서 작동합니다. 다른 시스템이나 아키텍처에서 실행하려면 명령어와 옵션을 조정해야 할 수도 있습니다.