Register 관련 몇 가지 정리.

도영주 2013.07.16 14:27 조회 수 : 3244

LILO 공부하다 몇 가지 이해가 안되는 게 있어 Intel Manual을 좀 살펴봤습니다.

rep, mov 같은 명령어는 왜 si, di 같은 register를 지정해서 사용하는지 

그냥 명령어 설명만 찾아서는 도저히 이해가 안되더라고요.


Intel 64 and IA-32 Architectures Software Developer's Manual

Volume 1. Chapter 3 Basic Execution Environment  - 3.4 Basic Program Execution Registers

여기에 보면  register에 대한 설명이 나옵니다.


무제2.png


1. 범용 레지스터 : EAX, EBX, ECX, EDX, ESI, EDI, EBP, and ESP (16 bit인 경우 AX, BX, CX, DX, SI, DI, BP, SP)

                          일반적으로 이들 레지스터는 논리, 계산, 주소 계산을 위한 값을 저장하고 있거나 메모리 포인터로 활용됩니다.

                          모든 레지스터가 이러한 목적으로 사용될 수 있지만, SP와 같은 레지스터는 스택을 가르키고 있기 때문에 특별히 주의가 필요합니다.

                          범용 레지스터는 특별한 목적으로 사용되는 경우가 있습니다.

                          EAX - operand와 결과 데이터를 저장하기 위한 accumulator 

                          EBX - DS segment 내의 데이터를 가리키기 위한 포인터

                          ECX - String 과 loop 연산을 하기 위한 카운터

                          EDX - I/O 포인터

                          ESI  - DS register에 의해 세그먼트된 데이터를 가리키는 포인터. string 연산을 위한 소스 포인터

                          EDI  - ES register에 의해 세그먼트된 데이터 (혹은 목적지)를 가리키는 포인터. string 연산을 위한 목적 포인터

                          ESP - Stack 포인터 (SS segment 내에 존재)

                          EBP - 스택 상의 데이터를 가리키는 포인터 (SS segment 내에 존재)


2. 세그먼트 레지스터 :  CS, DS, SS, ES, FS, and GS 는 16 bit값을 갖고, 세그먼트 선택을 위해 사용합니다.

                                 세그먼트관리 방법은 OS의 메모리 관리 방식이나 수행되는 프로그램에 따라 다릅니다.

memory model.png


                                 Flat 메모리 모델을 사용하는 경우, 전체 레지스터는 프로그램의 0-4GB의 선형 주소 공간을 모두 가지게 됩니다.

                                  이 모델도 전형적으로 2가지 세그먼트가 정의됩니다. 하나는 코드를 위한 코드 세그먼트와 데이터와 스택을 위한 다른 세그먼트로 분류합니다. 이때, CS 세그먼트는 코드 세그먼트를 가리키고, 나머지는 데이터와 스택 세그먼트로 사용합니다.

                                 segment 메모리 모델을 사용하는 경우, 각 세그먼트 레지스터는 선형주소공간을 각각의 다른 세그먼트로 나타낸 세그먼트의 주소를 가지게 됩니다. 프로그램은 총 6개의 세그먼트로 된 선형주소공간에 접근할 수 있습니다. 세그먼트 레지스터에 포인팅 되지 않은 세그먼트에 접근하려면 먼저 세그먼트 레지스터에 세그먼트 주소를 넣고 그 후에 세그먼트에 접근해야합니다. 

                                 각 세그먼트 레지스터는 코드, 데이터, 그리고 스택과 연관되어 있습니다. CS레지스터는 코드 세그먼트를 위한 세그먼트이고, EIP레지스터의 내용과 함께 선형 주소를 구성합니다. EIP는 다음에 수행될 코드 세그먼트의 오프셋을 가지고 있습니다. CS레지스터는 프로그램에 의해서 바로 명시적으로 로드될 수 없고, 함수호출, 인터럽트 핸들링, 태스크 스위칭 같은 프로그램의 제어를 변경하는 명령어나 내부 프로세서 연산에 의해 로드됩니다. 

                                  DS, ES, FS, GS는 데이터 세그먼트를 가리킵니다. 

                                  SS는 스택 세그먼트를 가리킵니다. CS 레지스터와 다르게 SS레지스터는 프로그램에 의해서 명시적으로 로드할 수 있습니다.


3. EFLAG (Program status and control) register : 수행된 프로그램의 상태를 리포팅하고 프로세서의 제한된 명령의 수행을 허용하기 위한 용도로 사용됩니다.


4. EIP (Intstruction Pointer) register : 다음 번에 수행될 명령을 가리키는 32bit 포인터 값을 가지고 있습니다.


레지스터에 대한 내용을 좀 더 이해하면, assembly code볼 때 조금 더 도움이 될 것 같아서 올립니다.^^;

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2197
1485 First.S, Second.S 분석한 자료 file 도영주 2013.08.03 1441
1484 kernel 에서 실행 순서 관련 문서 file 도영주 2013.08.03 1880
1483 오늘 스터디 시간에 잠깐 찾은 second.S 분석 pdf [1] file 제한재 2013.07.27 1841
1482 lilo 분석 참고 자료 시갈 2013.07.27 1463
1481 헷갈리는 주소, 포인터 연산에 대하여 정리( #, (), [] ) [2] 시대유감 2013.07.20 3164
» Register 관련 몇 가지 정리. file 도영주 2013.07.16 3244
1479 처음 어셈블리 해보시는데 할만하세요? [4] 백창우 2013.07.08 1891
1478 SVN 사용법 정리 [2] 시대유감 2013.06.30 2135
1477 회식사진 투척합니다. [5] file 김택훈 2013.06.30 2291
1476 7장 소스1 file 시갈 2013.06.22 1415
1475 분석 관련 자료 [3] file 백창우 2013.06.15 1849
1474 리눅스 커널 분석 환경 [3] 시대유감 2013.06.10 2023
1473 오늘 풀리지 않은 문제 관련 [1] 이경욱 2013.06.02 3305
1472 OS 커널의 구조와 원리 실습 방법 [1] file 시갈 2013.05.26 5696
1471 제안사항 입니다. [2] 강정근 2013.05.07 3193
1470 ELF 파일 포맷 정리 [6] 도영주 2013.05.04 11542
1469 TOZ 신청방법 아시는분?! [4] 강정근 2013.04.29 2724
1468 안녕하세요. 빠른진행을 위해 어플로 접근성을 높여보아요^^ [1] Napoleon 2013.04.22 3583
1467 교제 및 장소(투표 종료) [14] 조유준 2013.04.22 3838
1466 반갑습니다. 이성미입니다. [1] 이성미 2013.04.22 3396
XE Login