-
x86레지스터

eax : 어큐뮬레이터라는 호칭으로 불리며 연산에 사용되는 레지스터입니다.
ebx : 베이스 레지스터라는 호칭으로 불리며 메모리 어드레스를 저장하는 레지스터입니다.
ecx : 카운트 레지스터라는 호칭으로 불리며 반복 회수를 카운트합니다.
edx : 데이터 레지스터라는 호칭으로 불리며 데이터를 저장합니다.
esi : 소스 인덱스라는 호칭으로 불리며 데이터를 전송하는 곳의 메모리 어드레스를 저장합니다.
edi : 데스티네이션 인덱스라고 불리며 데이터가 전송되는 곳의 메모리 어드레스를 저장합니다.
ebp : 베이스 포인터라고 불리며 데이터 저장 영역의 메모리 어드레스를 저장합니다.
esp : 스택 포인터라고 불리며 스택 영역의 메모리 어드레스를 저장합니다.

16bit 레지스터
1) 일반 레지스터 (AX, BX, CX, DX) 
- 실제로는 명령에 따라서 특수하게 쓰이기도 한다.
- 상위 8비트(AH, BH, CH, DH)와 하위 8비트(AL, BL, CL, DL)를 따로 접근할 수도 있다.
 
2) 세그먼트 레지스터(CS, DS, SS, ES) 
- 메모리 주소의 기준을 정하는 데 사용된다.
- 메모리 영역들의 시작위치를 보관하기 위해 존재한다. 이 영역들의 프로그램 명령어들과 데이터, 스택에 사용된다.
  메모리의 모든 위치는 세그먼트 레지스터가 가리키는 메모리 위치를 기준으로 계산되며 4가지 세그먼트 레지스터가 있다.
 
  ① CS(코드 세그먼트)       
    : 프로그램의 실행 명령어들이 내장되는 메모리 영역의 시작되는 위치를 보관
  ② DS(데이터 세그먼트)     ? 
    : 데이터가 내장되는 메모리 영역의 시작 위치를 보관 
  ③ SS(스택 세그먼트)       
    : 스택으로 사용되는 메모리 영역의 시작 위치를 보관
  ④ ES(엑스트라 세그먼트) 
    : 변수들을 위한 추가 메모리 영역의 시작 위치를 보관
 
3) 인덱스 레지스터?  
- 데이터와 명령어들의 오프셋 주소를 갖는다. 오프셋 주소란 세그먼트 주소에서 떨어진 거리이다.
- 문자열, 배열, 다수의 데이터를 포함하는 데이터 구조체의 처리를 빠르게 한다.
 
 ① BP(Base Pointer)
 : SS 레지스터로부터의 오프셋 주소를 갖는다. 서브루틴을 호출할 때 서브루틴에 변수들을 넘겨주는데 서브루틴은 흔히 BP 레지스터를
  사용하여 변수들을 찾아낸다.
 ② SP(Stack Pointer)
 : 스택 최상부의 오프셋 주소를 갖는다. SP와 SS레지스터와 결합하여 스택 최상부의 위치 주소가 만들어진다.
 ③ SI(Source Index)
 : 문자열 이동 명령어들에서 따온 이름이다. 이 명령어들에서 소스 문자열이 사용되며 SI 레지스터가 이 문자열을 가리킨다.
 ④ DI(Destination Index)
 : 문자열 이동 명령어에서 목적지를 가리킨다. 상태 및 제어 레지스터.
 ⑤ IP(Instruction Pointer)
 : 현재 코드 세그먼트 내의 다음 실행될 명령어의 오프셋 주소를 갖는다. IP와 CS 레지스터가 결합하여 다음 실행될 명령어의 메모리 주소를 결정한다. 


*DR0 ~ DR3 레지스터
각각의 32비트 레지스터들은 각각의 하드웨어 브레이크 포인트 주소를 말해준다. DR7 레지스터와 함께 사용되고, 4개의 하드웨어 브레이크 포인터를 사용할 수 있다.
만약 이 레지스터들이 활성화 해 있을 경우, 프로세서가 주소를 엑세스 할 때마다 이 레지스터에 저장되어 있는 주소 값과 비교해 같을 경우 인터럽트 1(Exception 1)이 발생한다.



*DR6(Debug Status Register)
이 레지스터는 인터럽트 1(Exception 1)이 발생한 여러가지 이유를 알려준다. 프로세서에 의해 세트되고, 자동으로 클리어 되지 않으므로 직접 지워줘야 한다.
하위 0~4비트는 엑세스 된 레지스터 주소값에 관련된 내용을 알려준다. 예를들어 DR0이엑세스 되었다면, B0가 1로 세트되어 있을 것이다.



BD(Break for Debug register access,Bit,13) 비트는 하드웨어 브레이크 포인터랑은 상관 없고, 오로지 DR7의 GD 비트에 의해 디버그 레지스터가 잠김(Lock)되었을 시, 디버그 레지스터를 엑세스하면 인터럽트 1(Exception 1)이 발생하고 이 비트가 세트된다.


BS(Break for Single-step,Bit 14)비트는 EFLAGS 레지스터의 TF 비트가 세트되어 인터럽트 1이 발생하였음을 나타내 준다.


BT(Break for Task switch, Bit 15)비트는 태스크 변환 시 트레이싱(Tracing)을 가능하게 하는 TSS의 T 비트가 세트되어 인터럽트 1이 발생하였음을 알려준다.


*DR7(Debug Control Register)
이 레지스터는 4개의 하드웨어 브레이크 포인터에 대해 조건을 지정해 준다.
L0(Local enable,Bit 0)비트는 세트되어 있을 때 DR0에 저장되어 있는 주소에 대하여 현재의 테스크 기간 동안만 하드웨어 브레이크 포인트가 작동한다. 다음 태스크 변환이 발생하면 이 비트는 자동으로 클리어된다. L3번까지 동일하다.


G0(Global Enable,Bit,1)비트는 DR0에 저장되어 있는 주소에 대하여 태스크 변환에 상관 없이 모든 시간 동안 하드웨어 브레이크 포인트가 작동하게 한다.(G1,G2,G3)동일
LE(Local Exact,Bit,8),GE(Global Exact,Bit 9)이 비트는 데이터 엑세스 브레이크 포인터를 지정할 경우에 반드시 설정해야하는 비트로, 이 비트가 설정해 있지 않으면 데이터에 대한 엑세스가 끝난 후에도, 몇 개의 명령어를 수행한 후, 인터럽트가 발생한다.
이유는 80386에서는 '파이프 라인(Pipe Line)' 구조를 사용해 한 명령어의 실행이 끝나기 전에 다른 명령어가 동시에 처리되는데, 프로세서가 이 명령어가 끝난 후에야 인터럽터를 발생하기 때문이다.


GD(Global Debug access,Bit,13) 이 비트는 G0~G3레지스터와는 상관 없다.
다만, 이 비트가 세트되어 있는 상태에서 디버그 레지스터에 대한 엑세스가 이루어지면 인터럽트 1이 발생하여 이 비트는 자동으로 리셋된다.



RW0(Read/Write access,Bit 16 and 17) 이 비트는 DR0에 저장되 있는 주소에 대하여 아래의 엑세스 방법 중 어떠한 엑세스가 발생했을 때 하드웨어 브레이크 포인트가 작동할지 지시해 준다.(RW1,RW2,RW3) 동일하다.
RW
내용
00
명령어 실행 시에만 브레이크 포인트가 작동(Code fetch)
01
데이터에 대한 쓰기 작업이 있을 때 브레이크 포인트가 작동(Data Write)
10
펜티엄 이전의 프로세서는 사용하지 않는다. 그 이상부터는 CR4 레지스터에 있는 DE(Debug Extentions) 플래그가 세트되어 있을 경우 I/O 포트에 대한 읽기 혹은 쓰기 작업 시 프레이크 포인트가 작동하게 되며, 이 경우 관련된 DR 레지스터의 주소 역시 포트의 번지로 해석되어지게 된다.
11
데이터에 대한 모든 엑세스 시 브레이크 포인트 작동(Date Read or Write)
LEN0(break-point LENgth,Bit 18 and 19) 이 비트는 DR0에 저장되어 이쓴 브레이크 포인트 주소의 유효 범위를 나타내 주며, 유효 범위는 아래 표와 같다.
이 때 명령의 실행에 대한 브레이크 포인트 지정 시 LEN 필드는 항상 00을 지정해야 하고, 데이터 엑세스 브레이크 포인터 지정 시, 그 브레이크 포인트의 시작 번지가 ㄷ아래 표와 같은 주소 위치어야 한다.(LEN1,LEN2,LEN3)동일.
LEN
브레이크 포인의 유효 범위 길이
브레이크 포인트의 시작 번지
00
1바이트
임의
01
2바이트
짝수 번지
10
미사용
-
11
4바이트
4의 정수배



플래그 레지스터
조건분기명령은 비교명령이나 연산명령의 결과에 따라서 분기합니다.
그러나, 정확히 말하자면 비교명령이나 연산명령의 결과에 의해 세트된 플래그 레지스터의 값에 따라서 분기하는 것입니다. 플래그 레지스터는 여러 가지 상태를 기억하기 위한 레지스터입니다. 
+------------------------------------------------------------------+
*플래그 레지스터의 각 비트의 명칭 
공백인 비트는 사용하지 않읍니다. 
비트 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 
 OF DF  IF TF SF ZF AF PF CF 
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 
+------------------------------------------------------------------+
스테이터스 플래그(status flag)
연산의 결과에 따라서 세트 혹은 리셋되는 플래그로 다음과 같은 것이 있읍니다.
-CF : 캐리플래그 (carry flag)
연산한 결과,최상의 비트로 부터의 높은 자리로 자리올림(캐리) 
혹은 최상의 비트로 부터의 빌림이 발생한 경우에 1로 세트되고
그 이외의 경우 0으로 세트됩니다.
-PF :패리티 플래그(parity flag)
연산한 결과, 1로된 비트의 수가 짝수개(EVEN)일 때 1로 세트되
고 그 이외의 경우 0으로 리셋됩니다.
-AF : 보조 캐리플래그(auxiliary carry flag)
8(16)비트 연산에서,하위 4(8) 비트로 부터 상위 4 비트로 자리
올림 혹은 빌림이 발생한 경우에 1로 리셋된다. 10진 보정 명령에
있어서도 사용 됩니다.
-ZF : 제로 플래그(zero flag)
연산한 결과가 0으로 되었을 때에 1로 세트되고,그이외일 때는
0으로 리셋됩니다.
-SF :사인 플래래그(sign flag)
연산한 결과,최상의 비트가 1이 되었을 때(즉,보수표현으로
음수가 되었을 때) 1로 세트되고,그이외일 때는 0으로 리셋됩니다.
-OF : 오버플로우 플래그(overflow flag)
연산을 부호가 달린 숫자로 했을때,오버 플로우 혹은 언더 플로우
가 발생한 경우에 1로 세트되고,그 이외일 때는 0으로 리셋됩니다.
콘트롤 플래그(control flag)
CPU의 동작 상태 를 제어하는 레지스터로 플래그 제어 명령이나 플래그 전송명령을 사용하여 프로그램 중에서 세트 혹은 리셋됩니다.
-DF : 디렉션 플래그(direction flag)
스트링 조작을 할 때에 이 플래그가 0이면 번지를 나타내는
레지스터값이 자동으로 증가하고 1이면 레지스터값은 자동적으로
감소합니다.
-IF : 인터럽트 플래그(interrupt flag)
이 플래그가 0 일 때 INTR단자로 부터의 외부 인터럽트 요구는
무시되고,1 일 때에는 외부 인터럽트 요구를 받아 들일 수 있게
됩니다.
-TF : 트랩 플래그(trap flag)
이 플래그가 0일 때 CPU 는 보통대로 명령을 실행한다.이 플래그가
1일 때 CPU 는 한 명령을 실행할 때마다 자동적으로 내부 인터럽트
(INT1)가 발생하고,인터럽트 처리 루틴으로 들어간다.(단, 이 처리
루틴의 실행중에는 트랩플래그는 0으로 클리어 된다).이 플래그는
프로그램의 추적에 사용됩니다.
플래그 레지스터 제어 명령 과 전송 명령
STC (Set Carry flag) 캐리플러그를 1로 세트한다.
CLC (CLear Carry flag) 캐리플러그를 0으로 리셋한다.
CMC (CoMplement Carry flag) 캐리플래그가 0이면 1로 1이면 0으로 
세트한다.
STD(Set Direction flag) 디렉션 플래그를 1로 세트한다.
CLD(CLear Direction flag) 디렉션 플래그를 0으로 리셋한다
STI(Set Interrupt-enable flag) 인터럽트 플래그를 1로 세트한다.
CLI(CLear Interrupt-enable flag) 인터럽트 플래그를 0으로 세트한다.
LAHF(Load AH from Flags) 플래그 레지스터의 하위 8비트를 AH레지
스터로 전송한다.사용하지 않는 비트의 
값은 정해져 있지 않다.
SAHF(Store AH into Flags) AH레지스터의 내용을 플래그레지스터의
하위 8비트에 전송한다.
PUSHF (PUSH Flas onto stack) 플래그 레지스터의 내용을 스택(stag)상
에 푸쉬(PUSH:삽입)한다.
POPF (POP Flags off stack) 스택 위의 워드데이터를 플래그레지스터
에 POP한다.

FS 레지스터
Ring3에서는 TEB 위치를 가르킨다.

FS:[0x00] Win9x and NT Current SEH frame
FS:[0x04] Win9x and NT Top of stack
FS:[0x08] Win9x and NT Current bottom of stack
FS:[0x10] NT Fiber data
FS:[0x14] Win9x and NT Arbitrary data slot
FS:[0x18] Win9x and NT Linear address of TIB
FS:[0x20] NT Process ID
FS:[0x24] NT Current thread ID
FS:[0x2C] Win9x and NT Linear address of the thread local storage array
FS:[0x30] Pointer to PEB
FS:[0x34] NT Current error number
FS:[0x38] CountOfOwnedCriticalSections
FS:[0x3c] CsrClientThread
FS:[0x40] Win32ThreadInfo
FS:[0x44] Win32ClientInfo[0x1f]
FS:[0xc0] WOW32Reserved
FS:[0xc4] CurrentLocale
FS:[0xc8] FpSoftwareStatusRegister
FS:[0xcc] SystemReserved1[0x36]
FS:[0x1a4] Spare1
FS:[0x1a8] ExceptionCode
FS:[0x1ac] SpareBytes1[0x28]
FS:[0x1d4] SystemReserved2[0xA]
FS:[0x1fc] GDI_TEB_BATCH
FS:[0x6dc] gdiRgn
FS:[0x6e0] gdiPen
FS:[0x6e4] gdiBrush
FS:[0x6e8] CLIENT_ID
FS:[0x6f0] GdiCachedProcessHandle
FS:[0x6f4] GdiClientPID
FS:[0x6f8] GdiClientTID
FS:[0x6fc] GdiThreadLocaleInfo
FS:[0x700] UserReserved[5]
FS:[0x714] glDispatchTable[0x118]
FS:[0xb74] glReserved1[0x1A]
FS:[0xbdc] glReserved2
FS:[0xbe0] glSectionInfo
FS:[0xbe4] glSection
FS:[0xbe8] glTable
FS:[0xbec] glCurrentRC
FS:[0xbf0] glContext
FS:[0xbf4] NTSTATUS
FS:[0xbf8] StaticUnicodeString
FS:[0xc00] StaticUnicodeBuffer[0x105]
FS:[0xe0c] DeallocationStack
FS:[0xe10] TlsSlots[0x40]
FS:[0xf10] TlsLinks
FS:[0xf18] Vdm
FS:[0xf1c] ReservedForNtRpc
FS:[0xf20] DbgSsReserved[0x2]
FS:[0xf28] HardErrorDisabled
FS:[0xf2c] Instrumentation[0x10]
FS:[0xf6c] WinSockData
FS:[0xf70] GdiBatchCount
FS:[0xf74] Spare2
FS:[0xf78] Spare3
FS:[0xf7c] Spare4
FS:[0xf80] ReservedForOle
FS:[0xf84] WaitingOnLoaderLock
FS:[0xf88] StackCommit
FS:[0xf8c] StackCommitMax
FS:[0xf90] StackReserve

[출처] 레지스터 정리|작성자 오타해커


'정리중' 카테고리의 다른 글

HTTP 응답코드 목록  (0) 2014.07.31
x86 Assembly  (0) 2014.07.25
ARM assembly 문법정리  (0) 2014.07.23
x86 호출 규약 목록  (0) 2014.07.23
레지스터 목록 및 설명  (0) 2014.07.23

다른 카테고리의 글 목록

정리중 카테고리의 포스트를 톺아봅니다