| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- adsp독학
- 세그먼테이션
- rev-basic-3
- HRRN
- dreamhack
- ADsP책추천
- Pacu
- 26년 1회
- Juice Shop
- 운영체제
- ADsP시험
- 시나공ADsP
- wargame
- ADsP합격
- Simple Crack Me
- id pool
- OpenClaw
- ADsP
- randzzz
- user pool
- OWASP TOP 10
- cloudgoat
- 교체 정책
- ADsP교재
- writeup
- AWS
- 병행성
- OS
- rev-basic-4
- 라운드로빈
- Today
- Total
chon
컴퓨터 명령어 처리구조 본문
컴파일러 (Compiler)
사람이 이해할 수 있는 고급언어(프로그래밍 언어)를 컴퓨터가 실행할 수 있는 저급언어(기계어)로 번역하는 프로그램이다.
[ 구조 ]
원시 프로그램(프로그래밍 언어) → 컴파일러 → 목적 프로그램(실행 코드, 기계어 코드)
[ 컴파일 과정 ]

전체적인 변환 과정은 전처리기 → 컴파일러 → 어셈블러 → 링커 → 로더의 순서를 거쳐 진행된다.
전처리기 (Preprocessor)
본격적인 컴파일에 들어가기 전, 소스 코드를 다듬고 정리하는 첫 단계
전처리기는 소스 코드 내의 #include나 #define 같은 지시문을 처리하고 불필요한 주석을 모두 제거하여 번역하기 좋은 상태로 만든다.
- 확장된 소스 코드 (.i)
컴파일러 (Compiler)
전처리가 끝난 고수준 언어를 저수준 언어인 어셈블리어로 변환한다. 사람이 작성한 코드를 컴퓨터 구조에 가까운 중간 단계의 언어로 바꿔주는 과정이다.
- 어셈블리 코드 (.s)
어셈블러 (Assembler)
어셈블리 코드를 컴퓨터가 직접 해석할 수 있는 0과 1로 이루어진 기계어로 변환된다. 이때 만들어진 파일은 기계어이긴 하지만, 아직 참조된 다른 부분들이 연결되지 않아 단독 실행은 불가능하다.
- 목적 파일 (.o, .obj)
링커 (Linker)
생성된 목적 프로그램에, 프로그램 실행에 필요한 각종 라이브러리 파일들을 하나로 연결(Link)해준다. 흩어져 있던 조각들을 합쳐 실행 가능한 하나의 완전한 파일로 완성한다.
- 실행 파일, .exe (결합된 목적 파일)
로더 (Loader)
하드디스크에 저장된 실행 파일을 주기억장치인 메모리에 할당하고 올린다. 메모리에 적재된 후 CPU가 명령어들을 처리하면서 프로그램이 실제로 동작하게 된다.
- 프로세스 (메모리에 적재된 프로그램)
[ 소프트웨어 레지스터 ]
1. 범용 레지스터 (General Register)
산술/논리 연산과 데이터 저장에 사용된다.
- EAX (Extended Accumulator) - 산술 연산(누산기)에 사용
- EBX (Extended Base) - 데이터 포인터(메모리 주소의 기준)로 사용
- ECX (Extended Counter) - 반복문(Loop)의 카운터 및 이동 연산에 사용
- EDX (Extended Data) - 산술 연산 보조 및 I/O(입출력) 연산에 사용
- ESI (Extended Source Index) - 메모리 연산 시 데이터의 '소스(출발지)' 주소 저장
- EDI (Extended Destination Index) - 메모리 연산 시 데이터의 '목적지(도착지)' 주소 저장
- ESP (Extended Stack Pointer) - 스택의 최상위(Top) 위치를 가리키는 포인터
- EBP (Extended Base Pointer) - 스택 프레임의 기준(Base)이 되는 위치를 가리키는 포인터
2. 명령어 및 세그먼트 레지스터
명령어 레지스터
프로그램 실행 흐름을 제어한다. 유효 주소를 계산하는 데 필요한 주소 정보를 담고 있으며, CPU가 수행해야 할 작업의 위치를 가리킨다.
- EIP (Extended Instruction Pointer) - 다음에 실행할 명령어의 주소 저장 (PC, Program Counter라고도 함)
세그먼트 레지스터
메모리를 효율적으로 관리하기 위해 나누어진 각 영역(세그먼트)의 위치를 나타낸다. 가상 주소를 실제 하드웨어의 물리 주소로 변환할 때 기준점이 된다.
- CS (Code Segment) - 실행 가능한 코드가 있는 세그먼트의 시작 주소
- SS (Stack Segment) - 스택 영역이 있는 세그먼트의 시작 주소
- DS (Data Segment) - 프로그램 데이터가 있는 세그먼트의 시작 주소
- ES, FS, GS (Extra Segment) - 추가 세그먼트의 시작 주소 (FS는 주로 TEB 주소 지정에 사용)
3. 플래그 레지스터 (EFLAGS)
프로그램의 상태나 조건 분기를 위해 비트 단위로 값을 표시한다.
- CF (Carry Flag) - 연산 결과 자리 올림(Carry)이나 빌림 발생 시 설정
- PF (Parity Flag) - 연산 결과 최하위 비트가 0인 경우(2의 배수) 설정
- AF (Adjust Flag) - BCD 연산 등에서 자리 올림(Carry) 발생 시 설정
- ZF (Zero Flag) - 연산 결과가 0일 때 설정
- SF (Sign Flag) - 연산 결과가 음수일 때 설정
- TF (Trap Flag) - 디버깅 시 한 단계씩 실행(Single Step)할 때 설정
- IF (Interruption Flag) - 인터럽트 처리가 가능하도록 허용된 경우 설정
- DF (Direction Flag) - 문자열(스트링) 연산 시 처리 방향을 역순으로 설정
- OF (Overflow Flag) - 부호 있는 연산 결과가 표현 범위를 초과했을 때 설정
[ 하드웨어 레지스터 ]
1. 제어 레지스터 (Control Register) CPU의 작동 모드(리얼/보호)를 전환하거나 메모리 페이징(Paging) 기법을 제어하는 등 시스템의 핵심적인 동작을 관리한다.
- CR0 - 페이징(PG) 설정 및 보호/리얼 모드(PE) 전환 제어
- CR2 (Page Fault Linear Address) - 페이징 오류(Page Fault)가 발생했을 때 문제가 된 주소를 저장
- CR3 - 페이지 디렉터리 베이스 주소(PDBA) 저장 (선형 주소를 물리 주소로 변환할 때 사용)
- CR4 - 보호 모드에서 프로세서의 가상화 운영 등을 지원
- CR8 - 64비트 모드에서 주로 사용 (태스크 우선순위 레지스터 등으로 활용)
2. 디버그 레지스터 (Debug Register) 개발자가 디버깅을 할 때 사용한다. 소프트웨어적으로 코드를 수정하지 않고도 하드웨어적으로 중단점(Breakpoint)을 걸어 실행을 제어할 수 있다.
- DR0 ~ DR3 - 4개의 하드웨어 중단점(Break Point) 주소를 저장 (디버거에서 설정 가능)
- DR6 (Debug Status Register) - 디버그 상태를 표시 (디버그 예외 발생 시 상태를 알림)
- DR7 (Debug Control Register) - 각 중단점(Break Point)을 선택적으로 활성화하거나 조건을 제어
'Reversing' 카테고리의 다른 글
| Helloworld.exe 분석 및 바이너리 패치 실습 (0) | 2025.11.22 |
|---|---|
| X64DBG 디버거 설치 및 사용 방법 (0) | 2025.11.20 |