2008. 7. 21. 21:10 과거 저장소/IT infomation
728x90
레지스터 란?

어셈블리 언어로 프로그래밍을 하려면 C/C++ 같은 고급 언어와는 달리 CPU 내부에
있는 특별한 메모리에 대해서 잘 알고 있어야 한다. 우리가 일반적으로 알고 있는
메인메모리 혹은 시스템 메모리외에 CPU의 내부에는 레지스터(Register)라고 불리
는 특별한 메모리가 있다.

레지스터는 CPU가 접근할 수 있는 메모리 중에서 가장 빠르게 동작하는 메모리로
CPU가 여러가지 연산등의 처리를 하는 동안 필요한 임시적인 데이터들을 보관하는
데 사용된다.

메인 메모리는 바이트 단위로 매겨진 번지 혹은 주소를 이용해서 접근할 위치를 구
분하는데, 레지스터의 경우는 번지의 개념이 없고 모두 고유한 이름이 부여되어 있
다.

인텔 80x86 계열의 CPU에는 여러 개의 레지스터가 있어서 다양한 역할들을 맡고 있
다. 여러 레지스터 중에서 운영체제가 특별한 용도로 사용하는 레지스터를 제외하
면 일반적인 응용프로그램이 직접 이용할 수 있는 레지스터는 불과 10개 정도에 지
나지 않는다.

2. 레지스터의 종류

2.1 범용 레지스터

EAX      EBX      ECX      EDX

이들 레지스터는 말그대로 범용적인 목적으로 사용되는 레지스터로 크기는 각각 32
비트이고 다른 레지스터에 비해서 비교적 다양한 역할을 한다. 이름에서도 짐작이
가겠지만 단순히 A B C D 라는 이름을 가진 레지스터이다. A B C D 는
Accumulator, Base, Counter, Data 라는 단어의 첫 글자이기도 하다.      

16비트 시절에는 AX, BX, CX, DX 라는 이름을 가지고 있다가, 386 CPU부터 레지스
터의 크기가 32비트로 확장되면서 모두 이름앞에 E(Extended) 가 붙여진 것이다.

16비트 시절의 AX, BX, CX, DX 는 모두 16비트 크기였지만 8비트 크기로 나누어서
접근이 가능했다. 그래서 AX의 경우는 상위 8비트가 AH, 하위 8비트가 AL 이라는
이름을 가진다(H는 high, L은 Low라는 뜻). BX, CX, DX 의 경우도 마찬가지로 BH,
BL,    CH, CL,    DH, DL 이라는 이름으로 8비트 단위의 접근도 가능하다.

                                 EAX
----------------------------------
!..............EAX...............!    32비트
!---------------------------------      
!...............!.......AX.......!    16비트
!---------------------------------      
!...............!...AH...!...AL..!      8비트
----------------------------------

                                 EBX
----------------------------------
!...............EBX..............!    32비트
----------------------------------      
!...............!.......BX.......!    16비트
----------------------------------      
!...............!...BH...!...BL..!      8비트
----------------------------------

                                 ECX
----------------------------------
!..............ECX...............!    32비트
----------------------------------      
!...............!.......CX.......!    16비트
----------------------------------      
!...............!...CH...!...CL..!      8비트
----------------------------------

                                 EDX
----------------------------------
!..............EDX...............!    32비트
----------------------------------      
!...............!.......DX.......!    16비트
----------------------------------      
!...............!...DH...!..DL...!      8비트
----------------------------------

그림처럼 네개의 범용 레지스터는 동일한 32비트 공간을 이름에 따라 다양한 크기
로 접근할 수가 있다. 이는 범용 레지스터의 독특한 특징이기도 하다.

2.2 포인터 레지스터

ESI    EDI    ESP    EBP    (EIP)

이들 레지스터는 메인메모리의 번지값을 저장해서 포인터의 역할을 하는 레지스터
로 16비트 시절에는 SI, DI, SP, BP, IP 라고 불리던 레지스트이다. 범용 레지스터
와 마찬가지로 32비트로 확장 되면서 앞에 E가 붙게 된 것이다. 각각의 이름은
Source Index, Destination Index, Stack Pointer, Base Pointer, Instruction
Pointer 에서 유래한다.

이중에서 EIP는 현재 실행되고 있는 프로그램의 실행코드가 저장된 메모리의 주소
를 가리키는 레지스터로 프로그램의 실행이 진행됨에 따라 자동으로 증가하고 프로
그램의 실행 순서가 변경되는 제어문이 실행될때 자동으로 변경된다. 그래서 직접
접근해서 값을 저장하거나 읽거나 하는 일이 없기 때문에 응용 프로그램에서는 손
댈 일이 없는 레지스터이다.

ESI와 EDI는 이름이 암시하듯이 주로 메모리의 한 영역(Source)에서 다른 역영
(Destination)으로 데이터를 연속적으로 복사해서 옮길 때 사용한다. 이렇게 메모
리의 번지를 저장하는 포인터의 역할 외에도 단순히 32비트 데이터를 저장하는 데
도 사용할 수 있다.

ESP와 EBP 는 STACK 으로 동작하는 특별한 메모리 영역을 가리키는 데 사용되는 포
인터 레지스터로 특히 ESP 의 경우는 절대적으로 이 용도로만 사용해야 한다.

스택은 보통 함수를 호출해서 프로그램의 제어가 서브루틴으로 넘어 간후 다시 원
래 실행되던 루틴으로 돌아오기 위한 복귀 주소를 저장해 두는 곳으로 사용되고.
특히 고급언어로 작성된 프로그램의 경우 함수의 파라메터나 함수 내부에서 선언
된 지역변수의 저장 공간으로도 사용된다. ESP 는 바로 이런 스택공간의 꼭대기를
가리키는 포인터 레지스터이다. ESP의 값은 직접 변경할 수도 있지만 보통은 스택
에 데이터를 넣고 빼는 PUSH, POP 명령어의 실행시 자동으로 변경된다.

EBP 는 ESP 에 보조적으로 사용되는 포인터 레지스터로 ESP를 대신하여 스택에 저
장된 함수의 파라메터나 지역변수의 주소를 가리키는 용도로 주로 사용된다. 스택
을 가리키는 데는 ESP 하나로도 충분하지만 ESP 대신 EBP를 보조적으로 사용하는
이유는 프로그램의 오류로 중요한 스택 공간이 망가지는 일을 어느정도 방지할 수
있기 때문이다. EBP를 이런 용도로 사용하지 않을 경우에는 단순히 데이터를 저장
하는 용도로도 사용할 수 있다.(보통 속도 최적화 옵션으로 컴파일된 프로그램들
의 경우 인텔의 모자라는 레지스터를 보충하기 위해 EBP를 데이터 저장용으로 사용
하고, 스택은 ESP 하나로 감당하기도 한다.)

2.3 플래그 레지스터

EFLAGS

이 레지스터는 16비트 시절 FLAGS 였고, 32비트로 확장 되면서 앞에 E가 붙은 것이
다. 이 레지스터는 이름이 암시하듯이 비트 단위의 플래그 들을 저장하는 레지스터
로 아주 특별한 용도로 사용된다. 이 레지스터는 비트 단위로 의미를 가지는데 32
비트 모두가 사용되는 것은 아니고, 일부만 의미를 가진다. 각각의 플래그 마다 SF
(Sign Flag), ZF(Zero Flag), CF(Carry Flag), DF(Direction Flag) 등의 이름이 붙
어 있다.

보통 이 레지스터의 값을 직접 읽거나 쓰는 일은 거의 필요하지 않다. 각종 연산을
수행한 결과가 어떠한 지를 기록해 놓는 용도나 특정 명령어의 동작을 조절하는 용
도로 활용된다. 연산 결과가 0인지 음수 인지 자리올림이 발생했는지 따라 각각
ZF, SF, CF등이 설정된다. 이렇게 설정된 플래그들은 조건 제어문들이 자동으로 참
조해서 자신의 동작을 선택하기 때문에 우리가 직접 그 값을 챙길 필요는 없다.

DF의 경우는 MOVS 같은 연속적으로 메모리 복사를 하는 명령어가 동작할 때 번지가
증가하면서 동작할지 감소하면서 동작할 지를 지정해주는 용도로 사용된다. 이 때
에도 이 플래그의 값을 켜고 끄는 명령어가 별도로 있기 때문에 직접 EFLAGS 의 값
을 손 댈 일은 없다.

일반적인 응용 프로그램에서 DF의 경우를 제외하면 나머지 언급하지 않은 플래그들
은 물론 이거니와 ZF, SF, CF등도 관련되는 명령어들이 자동적으로 참조하기 때문
에 이들 플래그의 값을 직접 신경쓰지 않아도 무방하고 그냥 없는 듯이 여기면 된
다.


2.4 세그먼트 레지스터

CS    SS    DS    ES    (FS    GS)

이들 레지스터는 모두 16비트 크기로 메모리의 특정 영역을 가리키는 용도로 사용
되는 레지스터이다. 인텔의 CPU는 메모리의 영역을 용도에 따라 세그먼트로 나누어
서 사용한다. 과거 16비트 프로그래밍 시절에는 한 세그먼트가 가리키는 메모리 영
역이 64KB에 불과 했기 때문에 중요한 의미를 가졌지만 요즘의 32비트 프로그래밍
시절에는 32비트 주소만 해도 4GB 라는 방대한 메모리 영역을 나타낼 수 있다.그래
서운영체제가 한번 설정을 해주고 나면 응용 프로그램에서는 신경 쓸일이 거의 없
는 레지스터들이다. 일반적인 프로그램에서는 없듯이 생각해도 무방하다는 것이
다.

각각의 레지스터의 이름은 Code Segment, Stack Segment, Data Segment, Extra
Segment이고 이름이 암시하듯이 코드 영역, 스택 영역, 데이터 영역 을 가리키는
용도로 사용된다.

ES, FS, GS 는 모두 Extra Segment로 DS 처럼 데이터 영역을 가리키는 용도로 사용
되고 DS를 보조 해주는 세그먼트 레지스터이다. 두곳 이상의 데이터 저장영역을 가
리켜야 할 때 DS와 함께 사용된다. 하지만 32비트 프로그램에서는 DS와 ES가 같은
영역을 가리키고 있기 때문에 굳이 세그먼트 레지스터에 대해서 신경을 쓸 필요가
없다. 특히 FS, GS는 286 이후에 추가된 것으로 운영체제를 작성하는 게 아니라면
없듯이 여겨도 된다.

3. 꼭 알아야 하는 레지스터
위에서 언급한 레지스터 외에도 다른 레지스터가 더 있지만 나머지는 모두 운영체
제 같은 시스템 프로그램들에서나 신경 쓸 레지스터이고 일반적인 응용 프로그램
을 작성한다면 아래 8개의 레지스터만 잘 알고 있으면 충분하다.

EAX, EBX, ECX, EDX
ESI, EDI, ESP, EBP
 
728x90
posted by acedon
2008. 7. 21. 00:02 찜 리스트
728x90

아...
오늘 친구녀석이 노트북 쿨러랍시고 가져온 "크라디아 플랙스 mini"

생각보다 크기는 컸지만, 다양한 기능으로 약간의 지름신 압박을 당하고 있습니다.
제 생각에는 쿨러의 역할은 무난할듯 보이고, 또한 거취대의 기능, USB포트 확장의 기능까지 그 부가적인 부분이 더 끌린다고 할수 있습니다.

하지만 가격이 생각보다 3만원이라는 부분이 약간의 NG 인듯 합니다.
혹시라도 관심있으신 분이라면 이쪽에서 자세한 그림과 함께 정보를 얻으시면 됩니다.

"크라디아 플랙스 mini" 쿨럭 보러가기

간단한 제 친구녀석의 사용기 보러가기

728x90
posted by acedon
2008. 7. 20. 22:36 과거 저장소/IT infomation
728x90

우연찮게 갱주니님의 블로그에서 흥미 있는 글이 있어서 읽어보게 되었습니다.

간략한 내용은 예전에 8086에서부터 서서히 발전해서 펜티엄이라는이름을 가지기까지, 또한 싱글코어라는 부분에서 이제는 듀얼코어,쿼드코어 등 멀티코어의 시대로 도래함에 있어서의 내용입니다.

그 안에서 코어의 스피드클럭(hz, Mhz, Ghz)이라는 부분으로 컴퓨터의 성능을 저울질 해왔지만 요새들어서는 오히려 몇 Ghz라는 말보다는 싱글? 또는 듀얼, 쿼드? 라는 말로써 컴퓨터의 성능이 표현되고 있는것 같습니다.
이런 말들에 대해서 왜 그렇게 갈수 밖에 없고 그렇게 가게 된다면(병렬프로세서형식) 우리 프로그래머들이 해나가야 하는 그에 합당한 행동태세는 어떤것인지에 대해서 설명해주고 있었습니다.

그렇게 길지 않은 글이라 생각보다 재미나게 읽었습니다.
워낙 가지고 있는 지식이 없는터라 유익하게 받아들였습니다.

그럼 이 글에 흥미를 가지시는 분들은 읽어보시기 바랍니다.
고고씽!  "멀티프로세서 프로그래밍의 시대 개막"

728x90
posted by acedon
2008. 7. 20. 14:02 카테고리 없음
728x90
처음 쓰는 글입니다.
Test 목적입니다.



사용자 삽입 이미지

728x90
posted by acedon