1. 바이트 오더링(Byte Ordering)
// 데이터를 저장하는 방식.
1) 빅 엔디언(Big Endian)
// 사람이 보는 것과 동일, 앞부터 순차적으로 저장.
ex) 대형 UNIX서버(RISC계열의 CPU)
2) 리틀 엔디언(Little Endian)
// 데이터를 역순으로 저장.
- 리틀 엔디언에서 2byte(WORD), 4byte(DWORD)와 같은 멀티 바이트인 경우 역순으로 저장
- 리틀 엔디언에서 2byte 미만 , 문자열(str은 곧 char이기에)은 빅 엔디언처럼 앞부터 순차적으로 저장.
ex) Windows 계열 Intel x86 CPU
2. IA-32 Register 기본 설명
* 레지스터 (Register)
// CPU내부에 존재하는 다목적 저장 공간.
* Basic program execution registers
1) General Purpose Registers(32bit - 8개)
// 범용레지스터
- EAX (Extended Accumulator Register)
// 산술, 논리 연산 수행시 사용되는 레지스터 , 함수 리턴 값에 사용(리턴 값은 EAX에 저장한 후 리턴)
EAX - 32bit, 반 쪼개면 AX - 16bit , 또 다시 반 쪼개면 AH, AL(각 8bit)
- EBX (Extended Base Register)
// 메모리 주소를 저장하기 위한 용도의 레지스터
- ECX (Extended Count Register)
// 반복 명령어(for, while 등) 사용시 카운터로 사용되는 레지스터
- EDX (Extended Data Register)
// EAX와 함께 쓰이며, 부호 확장 명령이나 큰수의 곱셉/나눗셈 연산에 사용되는 레지스터
-------------------------- 산술 연산 명령어에서 상수/변수 값의 저장 용도로 사용 -------------------------
- ESI (Extended Source) / EDI (Extended Destination Index)
// ESI는 데이터 조작/복사 시 데이터의 주소가 저장.
EDI는 복사할 때 목적지의 주소가 저장.
----------------------------------- 메모리 복사에 사용 -----------------------------------------------------------
- EBP ( Extended Base Pointer) / ESP (Extended Stack Pointer)
// ESP는 Stack의 끝 지점 주소를 가리킴, 명령어(PUSH, POP, CALL, RET)들을 직접 조작
EBP는 Stack의 첫 시작 주소를 가리킴, 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가 함수가
리턴하기 직전에 다시 ESP에 값을 되돌려줘서 스택이 깨지지 않도록 함.(Stack Frame 기법)
----------------------------- 메모리 주소를 저장하는 포인터로 사용 ----------------------------------------
2) Segment Registers(16bit - 6개)
// CS, DS, SS, ES, FS, GS
3) Program Status and Control Register (32bit - 1개)
// EFLAGS, 종류가 많지만 기초적인 단계에서는 3가지만 알기
Flag는 단어 그대로 깃발이 올라가면 1(TRUE/On), 내려가면 0(False/Off)
- Zero Flag(ZF)
// 연산 명령 후에 결과 값이 0이면 -> ZF = 1 세팅
- Overflow Flag(OF)
// 부호 있는 수의 오버플로우 발생/ MSB(Most Significant Bit) 변경 시 -> 1로 세팅
- Carry Flag(CF)
// 부호 없는 수의 오버플로가 발생했을 때 -> 1로 세팅
4) Instruction Pointer(32bit - 1개)
// EIP
- EIP (Instruction pointer)
// cpu가 처리할 명령어의 주소를 나타내는 레지스터, 명령어를처리 후 자동으로 그 명령어 길이만큼 EIP를 증가시킴.