티스토리 뷰
1. 어셈블리 언어의 정의 (출처 : 위키백과)
어셈블리 언어란, 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다.
컴퓨터 구조에 따라 사용하는 기계어가 달라지게 되며(ARM, MIPS), 이에 따라 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다.
어셈블러는 니모닉 기호(mnemonics -> ex> ADD eax, 1 에서의 ADD와 같은, 사람이 보기 쉽게 만든 언어를 말한다.)
를 opcode(Operation Code -> 기계어의 일부로, 수행할 명령어를 나타내는 부호를 말함.) 로 변환하고, 메모리 위치와 기타 존재물에 따라 식별자를 다시 분석함으로써, 목적 코드(실행될 수 있는 기계어 코드) 를 만들어낸다.
2. 레지스터 (범용)
x86 기반 CPU는 8개의 범용 레지스터를 가지고 있으며, 각각 4바이트(32bits)의 크기를 저장할 수 있다.
EAX - Extended Accumulator Register :
함수의 리턴값을 저장 (char, int, bool -> real value | struct, array -> PTR)
덧셈, 뺄셈, 곱셈 나눗셈과 같은 숫자 연산에서 사용
EBX - Extended Base Register :
ESI, EDI 레지스터와 결합하여 인덱스로 사용된다. (Array Access IDX)
ECX - Extended Count Register :
흔히 for문 등에서 카운터로 사용된다.
MS Compiler VC++ 에서 함수의 호출 규약이 __thiscall 인 경우, this 포인터를 저장한다. 이 경우, ecx는 다른 레지스터로 mov되어 사용될 수 있다.
EDX - Extended Data Register : - 내용 추가 필요
EAX와 같이 부호확장 등에 사용된다.
ESI - Extended Source Index :
데이터 복사 / 조작 등의 과정에서 특히 char[], byte[] 자료형 변수의 Source(시작점) 포인터로 사용된다.
EDI - Extended Destionation Index :
1. ESI 와 동일. 데이터의 Destination(데이터의 끝) 포인터로 사용된다.
2. call Instruction 에서 EDI 에 Callee의 포인터를 저장하고, 호출할 때 사용된다.
ESP - Extended Stack Point :
push, pop Instruction 으로 스택에 액세스 할 때 현재 메모리 주소를 저장하고 있는 포인터.
EBP - Extended Base Point :
현재 함수 스택의 최상위 주소를 저장하고 있는 포인터.
EIP - Extended ? Point:
다음에 실행할 명령의 주소를 저장하고 있는 포인터.
현재 실행할 명령어의 주소로 헷갈리지 않도록 한다. 예를 들어, 디버거에서 a라는 주소에 bp를 걸고, breakpoint가 활성화되어 명령이 해당 위치에서 프로그램의 execution이 멈추게 될 때, EIP의 주소가 breakpoint의 주소에 위치하고 있는데, 이는 아직 해당 주소의 명령어가 실행 전이므로 당연한 것이다.
필요에 따라서, ~~X 로 끝나는 레지스터는 16비트 또는 8비트로 접근할 수 있다. (그림 참고)
ex) EAX 레지스터의 경우,
AX : 오른쪽의 16비트 접근 가능 (2bytes)
AL : AX 레지스터의 왼쪽 8비트 접근 가능 (1byte)
AL : AX 레지스터의 오른쪽 8비트 접근 가능 (1byte)
3. 레지스터(플래그)
5개의 플래그 레지스터를 이용하며, 연산 및 비교 Instruction을 실행하고, 특정 결과를 저장할 때 사용한다.
CF(Carry Flag)
부호 없는 연산 결과가 용량보다 크다면 세트된다.
OF(Overflag Flag)
부호 있는 연산 결과가 용량보다 크다면 세트된다.
SF(Sign Flag)
연산 결과가 음수가 되었을 때 세트된다.
ZF(Zero Flag)
연산 결과가 0일 때 세트되며, 연산 결과가 0이 아닐 때 해제된다.
cmp 명령 후 jz, jnz와 같은 if 문기문에서 사용된다.
DF(Direction Flag)
문자열 처리에서 연속되는 문자열의 처리 방향에 따라 세트된다.
본 문서는 http://www.cs.virginia.edu/~evans/cs216/guides/x86.html 문서의 내용을 번역한 일부와,
http://dakuo.tistory.com/9 문서의 내용을 참고하였습니다.
'Reversing > Assembly_x86' 카테고리의 다른 글
x86 어셈블리 기초 _ 세그먼트 레지스터 (0) | 2016.07.16 |
---|---|
x86 어셈블리 기초 _ 함수 호출 규약, 스택 (0) | 2016.07.15 |
x86 어셈블리 기초 _ 명령어 모음 (0) | 2016.07.14 |
x86 어셈블리 기초 _ 바이트 순서(byte order) (0) | 2016.07.13 |
x86 어셈블리 기초 _ 메모리, 주소 접근 모드 (0) | 2016.07.12 |