CS

실행 플랫폼 별 생성되는 기계어 코드가 다른 이유

kark 2025. 2. 10. 12:45
728x90

컴파일러는 실행할 플랫폼에 맞는 기계어 코드를 생성해야한다.

하지만 운영체제와 CPU 아키텍처마다 명령어 세트, 실행 방식이 다르기에 동일한 소스코드라도 각 플랫폼에 맞게 다르게 변환된다.

 

주요 원인

1. CPU 아키텍처의 차이 - CPU 마다 지원하는 명령어 세트가 다름

 

대표적 아키텍쳐 종류

x86 = 데스크톱, 서버에서 사용

ARM = 스마트폰, 임베디드 시스템

 

같은 코드라도 x86 과 ARM 에서 실행되는 코드가 다르게 컴파일 됨

int Add(int a, int b)
{ return a + b; }

====== x86 ======
mov eax, edi  ;  // a 값을 eax 레지스터에 저장
add eax, esi  ;  // b 값을 더함
ret           ;  // 함수 반환

====== ARM64 ====
add w0, w0, w1 ; // w0(a) + w1(b) 결과를 w0에 저장
ret            ; // 함수 반환

 

x86 은 mov, add 등 여러 명령어를 사용하지만

ARM 은 add 하나의 명령어로 수행된다.

 

2. 운영체제 차이 

운영체제마다 시스템 호출, 실행파일 형식, 라이브러리 등이 다름

따라서 같은 소스코드라도 OS 별로 다르게 컴파일됨

 

Windows 에서 컴파일된 실행파일 .exe 과 Linux 에서 컴파일된 실행 파일 .out

 

3. 컴파일러 최적화 방식 차이

동일한 소스코드라도 GCC, Clang, MSVC 같은 컴파일러가 다르게 변환할 수 있다.

 

4. 실행 환경차이 (32비트, 64비트)

32비트와 64비트는 CPU 레지스터의 크기, 주소 공간이 다르다

32비트는 eax, ebx 레지스터를 사용하고, 64비트에서는 rax, rbx 를 사용한다.

int Add(int a, int b)
{ return a + b; }

===== 32Bit =====
mov eax, dword ptr [esp+4] ; // a 값을 eax에 저장
add eax, dword ptr [esp+8] ; // b 값을 더함
ret

===== 64Bit =====
mov eax, edi  ;  // a 값을 edi 레지스터에 저장
add eax, esi  ;  // b 값을 더함
ret

 

32비트는 스택 메모리를 사용해 함수 인자를 전달하고, 64비트는 CPU 레지스터를 직접 사용한다.

'CS' 카테고리의 다른 글

절차지향 프로그래밍 POP  (0) 2025.02.13
객체지향 프로그래밍 OOP  (0) 2025.02.13
컴파일러 Compiler  (0) 2025.02.10
DI & DIP 의존성주입과 의존관계 역전원칙  (0) 2024.12.11
String 문자열의 불변성  (1) 2024.09.02