티스토리 뷰

[전광성의 어셈블리어 이해하기:2회] IA-32 프로세서 아키텍쳐란? (2)
저자: 전광성 |  날짜: 2004년 12월 08일  

/
1 .0 IA-32 프로세서 아키텍쳐란? (1)
0 IA-32 프로세서 아키텍쳐란? (2)
3 .0 IA-32 프로세서 아키텍쳐란? (3)
/
  • IA-32 프로세서 아키텍쳐(Processor Architecture)

    IA-32란 인텔386에서 시작하여 최근의 32비트 프로세서인 펜티엄4에 이르는 프로세서'군' 의미한다. 물론 펜티엄 4에 이르러가면서 많은 변화가 있었지만, 프로그래머의 관점에서 보면 크게 바뀐것이 없다고 할 수 있다. 왜냐하면 프로세서의 수행속도의 향상과 구현방법의 변화로 프로세서가 진화해 갔기 때문이다. 굳이 다른 것이 있다면 멀티미디어 처리에 대한 명령의 성능 향상을 꼽을 수 있다.

    참고로, 앞으로 우리는 CPU가 프로텍티드 모드(Protected Mode)라는 가정 하에서 공부할 것이다. 이 단어에 대해 간단히 말하면 단어가 뜻하는 대로, 한 프로그램에 주어진 일정한 메모리의 밖으로 벗어나는 메모리 참조를 프로세서가 감지해 그렇게 하지 못하도록 해주는 모드이다. 좀 더 자세한 사항은 인텔社의 IA-32프로세서 아키텍쳐를 참고하기 바란다.

  • 레지스터 메모리
    < 그림3 : 레지스터 메모리 >

    레지스터 메모리(이하 레지스터)는 CPU안에 위치한 고속의 저장장치이다. 보통은 CPU가 특정 연산을 수행할 때 피연산자를 레지스터 메모리에 올려놓고 수행하게 된다. 하드디스크가 메모리보다 느리다는 것은 알고 있을 것이다. 실제로 우리 눈에 레지스터 메모리는 직접 보이지 않으니까 실감하지 못하겠지만, 메모리는 레지스터보다 느리다.

    비유하자면, 하드디스크가 자료를 저장하는 책상서랍이라 하면 메모리는 자료를 올려놓는 책상 위라고 생각할 수 있으며, 레지스터는 자료를 직접 들고 있는 손이라고 생각할 수 있다. 레지스터는 그림3과 같이 8개의 일반 레지스터(General-Purpose Registers)와 6개의 세그먼트 레지스터(Segment Registers), 프로세서의 상태를 나타내는 플래그인 EFLAGS, 명령 포인터(instruction pointer)인 EIP로 이루어져있다.

    일반 레지스터(general-purpose register)는 주로 자료 전송이나 산술연산에 쓰이며, eax, ebx, ecx, edx는 그림4와 같이 나뉠 수 있다.

    < 그림4 : eax, ax, ah, al >

    그림에서 보이는 것과 같이 eax의 하위 16비트는 ax라고 이름붙여져 있고, ax의 상위 8비트는 ah라고 이름붙여져 있으며, ax의 하위 8비트는 al이라고 이름붙여져 있다. eax, ax, ah, al이 각각 다른 공간을 의미한다고 착각하지 않길 바란다. 32비트의 공간안에서 각각의 위치에 해당 이름이 붙여져 있는 것이다. 따라서 eax에다가 0000 0000 .... 0000 0001 을 집어넣으면 ax도 1, al도 1이 된다는 사실을 잊지 말기 바란다.

    이해를 돕자면, 본래 IA-32이전의 인텔 CPU는 32비트 레지스터가 없었다. 위의 그림에서 세그먼트 레지스터를 제외한 레지스터들의 앞에 붙은 E가 모두 없었고, 이들은 모두 16비트 레지스터였다. 하지만 IA-32에서 32비트 레지스터가 등장하였고, 이전과의 호환성을 유지하기 위해 앞에 Extended를 의미하는 E를 붙인 것이다. 덧붙여 이야기 하자면 ah, al에서 h는 high, l은 low를 뜻한다. 아래의 표를 참고하면 이해가 빠를 것이다.

    32-bit

    16-bit

    8-bit(high)

    8-bit(low)

    EAX

    AX

    AH

    AL

    EBX

    BX

    BH

    BL

    ECX

    CX

    CH

    CL

    EDX

    DX

    DH

    DL

    < 표1 : EAX, EBX, ECX, EDX >

    마찬가지로 나머지의 네 개의 일반 레지스터도 16bit의 다른 이름을 갖고 있다.

    32-bit

    16-bit

    ESI

    SI

    EDI

    DI

    EBP

    BP

    ESP

    SP

  • 각 레지스터의 용도

    EAX, EBX, ECX, EDX, ESI, EDI레지스터는 우리 마음대로 쓸 수 있는 레지스터이다. 반면 다른 레지스터들은 함부로 사용했다가는 프로그램이 종료되어버릴 수 있으니 주의하기 바란다.

    - EAX : 곱셈, 나눗셈 명령에 쓰이게 된다.
    - ECX : 루프 카운터로 쓰인다.
    - ESI 와 EDI : 고속의 메모리 복사에 쓰인다. S는 source, D는 destination의 약자이다.
    - EBP : 고급언어에서 사용하는 함수 파라미터와 지역변수를 가리키는 데 쓰일 것이다. 일반적인 산술이나 데이터 전송에 쓰여서는 안된다.
    - ESP : Stack Pointer의 약자이다. 스택의 탑을 가리키고 있다. 즉, 주소를 갖고 있을 것이다.(스택이라는 자료구조를 아는가? 혹시 모른다면 그냥 스택이라는 메모리 공간에 데이터를 쌓아놓는데 쌓아두는 곳의 맨 윗부분이라고 생각하길 바란다.)
    - 세그먼트 레지스터(Segment Register) : 프로그램 수행에 필요한 내용들이 미리 메모리에 할당되어있는데 그곳의 주소를 갖고 있다.(우리는 이 레지스터를 사용할 일이 거의 없을 것이다.)
    - 명령 포인터(Instruction Pointer) : 다음에 수행되어야 할 명령문의 주소를 갖고 있게 된다.
    - EFLAGS Register : 흔히 그냥 Flags라고 부른다. flag의 뜻은 다들 알다시피 '깃발'이다. 깃발로 어떤 정보를 전달 할 수 있을까? 깃발을 들고 내리고를 통하여 On/Off를 표시할 수 있을 것이다. EFLAGS의 각각의 비트는 1(set)이 되거나 0(clear)이 될 수 있다. 그리고 그 각각은 다른 의미를 갖고 있으며, 비트마다 다른 이름이 부여되어있다. 쉬운 예를 들면 Sign Flag라는 비트는 계산 결과가 음수인지 아닌지를 표시해 준다. 이런 게 무슨 의미를 가질까 의심할 수 있겠지만, 이는 다른 플래그와 결합하여 수의 크기를 비교하는 등 중요한 의미를 만들어 낼 수 있다는 것을 기억해주기 바란다. 각각의 플래그는 나올 때 마다 설명해 주기로 하겠다.

    앞으로 레지스터는 메모리에서 값을 불러와 잠깐 사용하는데 쓰이거나, 특정 연산을 하기 이전에 피연산자를 미리 불러오는 데 쓰일 것이다. 레지스터를 잘만 사용한다면 우리가 다른언어보다 뛰어난 퍼포먼스를 낼 수 있다는 점은 어셈블리어를 사용하는 데 있어 큰 매력이 된다. 지금 언급 한 것 이외에도 IA-32에는 부동소수점 연산장치(FPU : Floating-point unit)가 있는데 그다지 본 강좌의 목적에 부합한다고는 생각하지 않으므로, 따로 설명하지 않겠다.

    지금까지 레지스터에 대해 숨가쁘게 알아 보았다. 사실 매번 하는 이야기이지만 실전에 들어가기 이전에 배우는 배경지식은 모르는 부분은 한번 쯤 의심을 해보고 이해가 가지 않을 때는 체크해두고 넘어가면 되는 것이다. 나중에 뒷부분을 어느정도 본 후에 다시 앞부분을 보면 무슨소리를 하는 것이었는지 이해할 수 있을 것이다. 여기를 읽으면서 독자가 한번이라도 의심을 가져본다면 나로서는 대만족이다.


  • 댓글
    안내
    궁금한 점을 댓글로 남겨주시면 답변해 드립니다.