레지스터는 CPU 내부에서 데이터를 일시적으로 저장하는 장소이다.

쉽게말해서 메모지 역할이라고 생각하면된다.

 

 

 

32비트 : EAX

16비트 : AX (8비트 : AH 8비트 : AL)

 

범용레지스터

 

EAX 레지스터

-> 누산기인 EAX 레지스터는 입출력과 대부분 산술 여산에 사용. 예를 들어 곱셈, 나눗셈, 변환 명령은 EAX를 사용한다.

EBX 레지스터

-> DS 세그먼트에 대한 포인터를 주로 저장. ESIEDI와 결합하여 인덱스에 사용된다.

메모리의 주소지정을 확장하기 위해 인덱스로 사용될 수 있는 유일한 범용 레지스터이다.

ECX 레지스터

-> 루프가 반복되는 횟수를 제어하는 값, 왼쪽이나 오른쪽으로 이동되는 비트 수 등을 포함.

EDX 레지스터

-> 입출력 연산에 사용하며 큰수의 곱셈과 나눗셈 연산에서 EAX와 함께 사용.

 

세그먼트 레지스터

CS 레지스터

-> 코드 세그먼트는 실행될 기계 명령을 포함한다.

-> CS 레지스터는 코드 세그먼트의 시작 주소를 가리킨다.

DS 레지스터

-> 프로그램에 정의된 데이터, 상수, 작업 영역을 포함한다.

-> DS 레지스터는 데이터 세그먼트의 시작 주소를 가리킨다.

SS 레지스터

-> 스택 세그먼트는 프로그램이 실행 될 때, 실행 과정에서 필요한 데이터나 연산 결과 등을 임시로 저장하거나 삭제할 때 사용된다.

-> SS레지스터는 스택 세그먼트의 시작 주소를 가리킨다.

 

포인터 레지스터

EBP 레지스터

-> 스택 세그먼트에서 현재 호출되어 사용되는 함수의 시작 주소 값을 저장한다.

ESP 레지스터

-> 현재 스택 영역에서 가장 하위 주소를 저장한다. EBP와 마찬가지로 실제 메모리 상의 주소를 참조할 때 SS레지스터와 함께 사용된다.

EIP 레지스터

-> 다음에 실행될 명령의 오프셋을 포함한다.

-> 현재 실행 중인 코드 세그먼트에 속한 현재 명령을 가리키며, 실제 메모리상의 주소를 참조할 때 CS 레지스터와 함께 사용된다.

 

인덱스 레지스터

ESI & EDI

-> ESIEDI는 주로 메모리의 한 영역에서 다른 영역 즉, Source에서 Destination으로 데이터를 연속적으로 복사할 때 사용된다.

 

08x86 시스템의 메모리

메모리의 기본 구조

 

스택

후입선출(LIFO : Last-In, First Out) 방식에 의해 정보를 관리하는 데이터 구조.

나중에 들어온게 먼저 나간다.

스택은 프로그램의 함수 내에서 정의도니ᅟᅳᆫ데 함수 종료와 동시에 사라지는 자동 변수가 저장되고 함수가 호출될 때 함수 내 로컬 변수 등이 저장되는 곳이다.

 

스택과 더불어 메모리에서 프로그램 실행과 관련해 매우 중요한 역할을 한다.

힙은 프로그램이 실행 될 때 가지 미리 알 수 없는 가변적인 양의 데이터를 저장하기 위해, 프로그램의 프로세스가 사용할 수 있도록 에약 되어있는 메인 메모리의 영역이다.

 

어셈블리어의 구조

Label :             MOV             AX,                 BX             ; comment

라벨             작동코드     1피연산자     2피연산자         설명

 

리틀엔디언 방식

컴퓨터에서는 메모리에 데이터를 저장하는 방식을 두가지로 구분하는데, 빅엔디언과 리틀엔디언으로 구분한다.

cpu가 메모리에 데이터를 저장할 때 어느 순서로 저장하는가에 대해 나눠지는데 왼쪽->오른쪽 은 빅엔디안이고, 오른쪽->왼쪽 은 리틀엔디언이다. 데이터는 리틀엔디언 방식에 의해 스택에 저장되고 참조된다.

예를들면 0x12345678이란 값이 있을 때 빅엔디안은 0x12345678로 저장. 리틀엔디안은 0x785563412로 저장.

 

기본명령

산술연산

ADD AL 4

-> AL이 원래 2였다면, 명령실행 후 AL6이 된다.

SUB AL 4

-> AL이 원래 8이였다면, 명령실행 후 AL4가 된다.

CMP AL 4

-> AL이 원래 5였다면, 명령 실행 후 AL5가 된다.

0이 아니므로 거짓이 된다. CMP A,B의 경우 A에서BqoS 값이 0이면 참이된다.

 

데이터전송

MOV AX, [BP+4]

-> BP의 주소에 4 더해진 주소에 있는 데이터 값을 AX에 대입한다.

PUSH 1피연산자

-> PUSH 명령은 스택에 데이터를 삽입할대 사용한다. 다음 그림과같이 스택은 커지고, 스택포인터(SP)는 데이터 크기만큼 감소한다.

 

 

POP 1피연산자

-> POP 며령은 스택에서 데이터를 삭제할 때 사용한다. 스택에서 삭제된 명령은 반환 값으로 받아 사용할수 있으며 다음 그림과 같이 스택포인터는 삭제하는 데이터 크기만큼 증가한다.

 

 

 

LEA AX [BP+8]

-> BP의 현재 값이 0x10000004이라면, MOV 명령처럼 BP+80x1000000C의 주소 값을 가져오는 것이 아니라 Ox10000004의 주소에 있는 값에 8을 더해 AX에 대입한다.

 

논리명령

AND

-> AND 명령은 대응되는 비트가 둘 다 1일때만 결과가 1이고, 그 이외는 모두 0이된다.

, 2진수로 바꿔준후 대응해야한다.

OR

-> 대응되는 비트중 하나만 1이어도 결과가 1이고, 둘다 0인 경우에만 0이된다.

XOR

-> 대응되는 비트중 한 비트가 1이고 다른 비트가 0이면 결과가 1이된다. 그리고 두 개의 비트가 모두 0 또는 1일 때 0이된다.

NOT

-> 피연산자의 1의 보수를 구하는 작동코드로, 각 비트를 반전한다. 1일 경우 0, 0일 경우 1

TEST

-> CMP 명령처럼 데이터의 두 값을 비교할 때 사용한다. , CMP처럼 제 1피연산자에서 제2피연사자 값을 빼는 과정이없다. , 데이터의 변경 없이 단순 비교만 한다.

 

스트링 명령

REP

-> ADDMOVS와 같은 작동 코드의 앞에 위치하며, CX0이 될 때까지 뒤에오는 스트링 명령을 반복한다.

MOVS

-> 바이트나 워드, 더블워드를 옮기는 명령으로 각각 MOVSB, MOVSW, MOVSD가 있다.

더 쉬운 이해는 다음 리버싱 문제를 풀 때 설명할 것이다.

 

제어 전송

JMP 100h

-> 대표적인 점프 명령으로 프로그램을 실행할 주소 도는 라벨로 이동한다.

CALL 1피연산자

-> JMP처럼 함수를 호출할 때 사용하고제1피연산자에 라벨을 지정한다. 하지만 CALL은 리턴주소로 IP주소를 백업하여 “PUSH EIP +JMP”와 의미가 같다.

RET(Return from CALL)

-> 함수에서 호출한 곳으로 돌아갈 때 사용하는 명령. RET“POP EIP”와 의미가 같다.

CALLRET의 예를 함께 살펴보겟다.

 

위의 AX0x08h라고 하자.

위의 경우 SUBR 함수를 호출하면 SUBR 라벨이 있는 곳에서 RET 까지 실행된다.

이때 INC AX가 있어서 AX0X09h가 된다. RET 명령이 실행되면 CALL 다음 라인인 ADD AX,10h가 실행되어 AX0X19h가 될 것이다.

LOOP(Loop CX timex)

-> 문장들의 블록을 지정된 횟수만큼 반복한다. CX는 자도적으로 카운터로 사용되며 루프를 반복할 때 마다 감소한다.

 

 

'IceB1u3 > System' 카테고리의 다른 글

시스템공부를 시작하며..  (0) 2014.01.03
Posted by MUSH1