어셈블리어
- 기본적으로 위에서부터 아래로 실행된다.
- 대소문자를 구분하지 않는다.
- 어셈블리어는 기계의 움직임을 정하는 언어이기 때문에 size를 정확히 써야한다. (size가 틀릴 경우 아예 실행이 안된다.)
mov reg,값
mov reg, reg
- 레지스터의 값으로 값을 덮어쓴다.
- ex) mov eax, ebx
- eax에 ebx값을 넣는다.
- 레지스터의 크기가 서로 같아야 한다.(양쪽 모두)
- 공간의 크기는 EAX(4BYTE), AX(2BYTE) , AH/AL(1BYTE)이다.
어셈블리어의 숫자
- 어셈블리어에서 숫자는 기본적으로 16진수로 들어간다.
- 10을 표현하려고 할경우 a만 쓰지 말고, 0a라고 명확하게 표현해야한다. (ollydbg의 경우 자동 변환)
AX / AH / AL
- 이전에 16비트 시절에 사용했던 저장 방식이다.
- AX는 전체 2바이트(16비트) 전체를 뜻한다.
- AL는 전체 중 1바이트의 일의 자리를 뜻한다.
- AH는 십의 자리를 뜻한다.
32비트의 경우(4byte)
- 전체의 이름을 EAX라고 부른다.
- 낮은 자리의 2byte를 AX라는 이름으로 사용할 수 있다.
- AX의 높은 곳을 AH, 낮은 곳을 AL로 사용한다.
- ex) 1234567을 EAX에 저장 시킬 경우
- MOV EAX, 12D687
- EAX [00 12 D6 87]로 저장 된다.
- AX는 [D6 87]
- AH는 [D6]
- AL는 [87]
64비트의 경우
범용 레지스터
범용 레지스터(General Purpose Register, GPR)는 CPU에서 다양한 용도로 사용할 수 있는 레지스터이며, IA-32 아키텍처에서는 다음과 같은 범용 레지스터가 있다.
IA-32 범용 레지스터
- EAX (Accumulator Register): 주로 산술 연산 및 I/O 작업에 사용된다. 많은 명령에서 결과값을 저장한다.
- EBX (Base Register): 주소 계산을 위한 기본 레지스터로 사용된다. 배열이나 데이터 구조에 대한 포인터를 저장하는 데 유용하다.
ECX (Counter Register): 반복 작업이나 문자열 처리를 위한 카운터로 사용된다. LOOP 명령어와 함께 자주 사용된다.
EDX (Data Register): 산술 연산의 결과를 저장하거나, 확장된 곱셈/나눗셈에서 사용된다. I/O 작업에서도 사용될 수 있다.
ESI (Source Index):문자열 처리에서 소스 데이터의 주소를 저장하는 데 사용된다. MOVS, CMPS, SCAS 명령어와 함께 자주 사용된다.
EDI (Destination Index):문자열 처리에서 목적지 주소를 저장하는 데 사용된다. 소스 인덱스와 함께 문자열 작업에 사용된다.
EBP (Base Pointer): 함수 호출 시 스택 프레임의 기준을 제공하는 데 사용된다. 로컬 변수와 함수 매개변수에 대한 포인터 역할을 한다.
ESP (Stack Pointer): 현재 스택의 최상단을 가리키는 레지스터이다. 스택 관련 작업에 사용되며, 함수 호출과 리턴 시 자동으로 업데이트된다.
범용 레지스터의 특징
- 다목적 사용: 범용 레지스터는 다양한 데이터 유형을 저장할 수 있으며, 연산에 자유롭게 사용할 수 있다.
- 속도: CPU 내부에 위치하여 매우 빠른 속도로 데이터를 처리할 수 있다.
- 가시성: 어셈블리 프로그래밍 시 레지스터를 직접 조작할 수 있어, 프로그래머가 메모리보다 더 효율적으로 데이터 처리를 할 수 있게 해준다.