게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
FASM - 4. 레지스터
게시물ID : programmer_11054짧은주소 복사하기
작성자 : 중용자
추천 : 4
조회수 : 857회
댓글수 : 6개
등록시간 : 2015/06/09 01:23:02
오역하지 않을 자신이 없어 영어단어들은 가급적 번역하지 않고 그대로 사용할 생각입니다.
틀린 정보, 추가해야 할 정보가 있으면 알려주시면 감사하겠습니다.


4.1 레지스터란?

레지스터는 CPU에서 가장 빠르게 접근할 수 있는 메모리로 메모리로 부터 데이터를 읽어와 연산 등의 작업을 한 후 작업완료된 데이터를 메로리에 저장하는데 사용됩니다.
과거에는 레지스터 또한 CPU가 아닌 외부의 하드웨어에 존재하기도 했지만 현재는 CPU에 포함되어 있습니다.
그 어떤 저장장치 보다 빠른 속도를 내는 만큼 레지스터의 수는 제한되어 있습니다.
저장장치별 속도는 HDD < 메모리 < 캐쉬 < 레지스터로 좌측으로 갈수록 성능이 급격히 하락합니다.


4.2 실행 환경

1.png

2.png

위의 2개의 그림은 현재 INTEL CPU내의 32비트, 64비트 별 실행 환경을 나타냅니다.
32비트 모드와 64비트 모드의 차이점은 8개의 범용 레지스터, FLAGS 레지스터, Instruction 포인터 레지스터, FPU Instruction 포인터 레지스터, FPU Data Pointer Register 등 총 12개의 레지스터가 64비트로 확장되고 범용 레지스터에 8개의 64비트 레지스터가 추가되었다는 것입니다.

8개의 범용 레지스터 추가는 함수내에서 스택을 이용한 지역변수 대신 사용할 수 있는 레지스터 변수가 8개 늘어난 효과를 보이는 장점이 됩니다.


4.3 세그먼트 레지스터

세그먼트 레지스터는 16비트로 세그먼트 selectors를 가리킵니다.
세그먼트 selector는 메모리내의 한 세그먼트를 가리키는 특별한 포인터로 세그먼트 ID 정도로 생각하면 됩니다.
세그먼트 레지스터는 메모리 운영 모델에 따라 다르게 사용되는데 이 글은 윈도우 운영체제를 기준으로 하기 때문에 메모리 운영 모델에 따른 세그먼트 레지스터의 사용 방법에 대해서는 설명을 생략합니다.
FS 레지스터를 제외하고는 세그먼트 레지스터를 직접 사용하는 경우는 거의 없습니다.

- CS (Code Segment Register)
실행되야 하는 명령어가 위치한 코드 세그먼트를 가리키는 레지스터 입니다.
CS 레지스터가 가리키는 세그먼트에서 EIP를 이용하여 현재 실행되는 명령어의 위치를 알 수 있습니다.

- SS (Stack Segment Register)
스택 세그먼트를 가리키는 레지스터로 스택은 함수의 파라미터 전달, 지역변수, 임시 저장소 등 다양한 용도로 사용됩니다.

- DS, ES, FS, GS (Data Segment Register)
데이터 세그먼트를 가리키는 레지스터로 데이터 세그먼트를 모듈용 데이터 세그먼트, 외부에서 공유할 수 있는 데이터 세그먼트 등 용도에 따라 4개로 세그먼트를 나눌 수 있습니다.
일반적인 어셈블리 프로그래밍에서는 데이터 세그먼트는 하나만 사용하며 Windows 운영체제에서는 FS 레지스터를 특수목적으로 사용하기 때문에 데이터 세그먼트로 사용할 수 없습니다.

- FS (Windows)
Windows 운영체제에서는 어플리케이션 디버깅을 위해 TIB(Thread Information Block), SEH(Structured Exception Handling) 등을 사용하기 위해 FS 레지스터를 사용합니다.


4.4 범용 레지스터

범용 레지스터는 특정 목적에 사용되는 경우를 제외하고는 자유롭게 변수로 사용할 수 있습니다.
베이스 포인터와 스택 포인터는 스택을 사용하기 위한 필수 레지스터로 구분은 범용 레지스터에 포함되지만 스택을 사용하지 않는 경우는 드물기 때문에 변수로 사용되는 경우는 거의 없습니다.

- RAX, EAX, AX (Accumulator Register)
대부분의 입출력 및 산술, 논리 연산에 사용되고 Windows API 호출시 결과값 반환에 사용됩니다.

- RBX, EBX, BX (Base Register)
데이터의 주소를 절대값이 아닌 상대값으로 지정할 때 인덱스로 사용됩니다.

- RCX, ECX, CX (Count Register)
카운트 레지스터에 설정된 값만큼 루프를 실행하거나 쉬프트 할 횟수를 설정하는데 사용됩니다.

- RDX, EDX, DX (Data Register)
몇몇 입출력 및 산술 연산에 사용됩니다.

- RSI, ESI, SI (Source Index Register)
메모리 비교, 이동, 문자열 처리시 원천 데이터의 주소로 사용됩니다.

- RDI, EDI, EI (Destination Index Register)
메모리 비교, 이동, 문자열 처리시 비교 데이터 또는 이동할 메모리의 주소로 사용됩니다.

- RBP, EBP, BP (Base Pointer Register)
스택 프레임의 시작위치를 나타냅니다. 

- RSP, ESP, SP (Stack Pointer Register)
PUSH, POP 등 스택에 데이터를 입출력 하거나 지역변수 사용을 위해 스택의 위치를 변경할 때 사용됩니다.

- R?, R?D, R?W, R?B
8~15 까지 8개의 범용 레지스터로 속도 빠른 변수로 사용할 수 있습니다.


4.5 FLAGS 레지스터

3.png

o Status Flags

- CF (bit 0, Carry flag)
산술연산 후 최상위 비트에서 자리 올림 또는 내림이 발생했을 경우 1로 설정됩니다. 쉬프트 연산의 경우 쉬프트 연산 후 마지막 비트의 내용을 나타냅니다.

- PF (bit 2, Parity flag)
산술연산 후 하위 8비트가 짝수일 경우 1로 설정됩니다.

- AF (bit 4, Auxiliary Carry flag)
BCD 연산 후 3번째 비트에서 자리 올림 또는 내림이 발생했을 경우 1로 설정됩니다.

- ZF (bit 6, Zero flag)
산술 또는 비교 동작의 결과값이 0일 경우 1로 설정됩니다.

- SF (bit 7, Sign flag)
산술연산 후 결과값의 부호가 음일 경우 1로 설정됩니다.

- OF (bit 11, Overflow flag)
산술연산 후 결과값이 0보다 작거나 최대 허용 정수보다 클 경우 1로 설정됩니다.


o DF Flag (bit 10, Direction flag)

스트링 데이터를 처리하는 명령어의 처리 방향을 설정하는 플래그로 1로 설정(STD)되어 있으면 역순으로, 0으로 설정 (CLD)되어 있으면 순서대로 처리합니다.


o System Flags and IOPL Field

- TF (bit 8, Trap flag)
설정하면 디버깅시 single-step-mode를 사용할 수 있습니다.

- IF (bit 9, Interrupt enable flag)
인터럽트 여부를 설정합니다. 외부 입력 장치는 전부 인터럽트로 처리하기 때문에 인터럽트를 작동시키지 않으면 외부 입력장치를 사용할 수 없습니다. 사용자 모드에서는 항상 1로 설정되어 있습니다.

Status, DF 플래그를 제외한 나머지 플래그들은 특수한 경우에 사용되는 플래그로 Windows 어셈블리 프로그래밍시 직접 사용할 일은 거의 없기에 TF, IF 플래그만 설명하고 나머지는 생략합니다.


4.6 명령어 포인터 레지스터 (RIP, EIP, IP)

명령어 레지스터는 코드 세그먼트에서 실행될 다음 명령어의 offset 번지를 기억합니다. 이 레지스터는 직접적으로 사용할 수 없으며 JMP, Jcc, CALL, RET, IRET 등의 명령어들에 의해 영향을 받습니다.


4.7 레지스터 구조

아래는 위키피디아에서 가져온 레지스터 구조 모음입니다.

Segment Registers (C, D, S, E, F and G)
16 8
 ?S
General Purpose Registers (A, B, C and D)
64 56 48 40 32 24 16 8
R?X
E?X
 ?X
 ?H  ?L
Index Registers (S and D)
64 56 48 40 32 24 16 8
R?I
E?I
 ?I
 ?IL
64-bit mode-only General Purpose Registers (R8, R9, R10, R11, R12, R13, R14, R15)
64 56 48 40 32 24 16 8
 ?
 ?D
 ?W
 ?B
Pointer Registers (S and B)
64 56 48 40 32 24 16 8
R?P
E?P
?P
 ?PL
Instruction Pointer Register (I)
64 56 48 40 32 24 16 8
RIP
EIP
IP

Reference 
http://en.wikipedia.org/wiki/X86
Intel® 64 and IA-32 Architectures Software Developer’s Manuals
출처 본인
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호