본문 바로가기

Computer/0x02 운영체제

OS 개발하기 - 2 : 레지스터 크기 와 세그먼트

OS 개발하기 - 2 : 레지스터 크기 와 세그먼트





 만의 운영체제를 만든다는 것은, 아마 컴퓨터를 하시는 분들의 로망중 하나가 아닐까 사료 됩니다.

그만큼 고생스러운 일이면서도 보람찬 일이 아닐까요? ^^

지난 시간에는 'X'를 출력하는 것으로 간단한 실습을 했습니다.


이번 시간에는 지난시간에 다루지 못했던 부족한 이론을 공부 해 보겠습니다.

아직 우리는 초짜 이고 아는 것이 아무것도 없는 백지 상태이기 때문에 공부해야 될 부분이 무척 많지만

천리길도 한걸음 부터 라는 말도 있듯이 기초적인 부분부터 하나씩 step by step 으로 나아 갑시다.





레지스터의 크기





위의 그림을 토대로 살펴보면 EAX 32 Bit, AX 16 Bit , AH,AL은 각 8Bit 라는 것을 알 수 있습니다.

그리고 지난 시간에 어셈블리 코딩할떄도 잠깐 언급했지만 '0Xb800' 이라는 주소는 반드시

숙지하고 있어야 합니다. 무슨 주소 이냐구요? 


바로 '비디오 메모리가 매핑 된 주소' 입니다. 이곳으로 값을 전달한다면 비디오 장치로 출력

하게 됩니다.


그런데 여기서 의문점이 생깁니다. 


0xb8000? 16비트 최대 값은 0xFFFF가 아닌가요?

네 맞습니다 16비트 최대 값은 0xFFFF 입니다.  더 큰 주소 값을 사용하기 위해서는 

어떻게 해야 할까요?





Segment 와 OFFSET 계산방법




위의 방법대로 '미션'을 드릴테니 한번 풀어 보시길 바랍니다^^


[ 미션 ]

: 세그먼트와 오프셋을 계산 하시오


* Segment : 0x1234

* Offset : 0x3030





[ 정 답 ]


* 1234

    3030

----------

   15370












Segment의 다른용도




일반적으로 세그먼트 레지스터는 실제 주소 모드 (Real Address Mode) 에서 세그먼트(Segment)라고 불리는
미리 할당된 메모리 영역의 시작 주소를 가리킵니다.

다른 용도로는

CS: 코드 영역 (Code segmnet)
DS: 데이터 영역(Data segment)
ES: 비디오 영역(Extra segment)
FS,FS: 기타 영역
SS: 스택 영역 (Stack segment)


* 세그먼트 설정 규칙:

레지스터를 통해서만 설정이 가능합니다. 값을 바로 넣지 못합니다.
예를 들어 MOV ES , 0x1234  라고 할 수는 없으며,
대신에 MOV AX, 0x1234
          MOV ES,AX 

이런식으로 표기 할 수 있습니다.



p.s 하는게 많아서 포스팅 까지 쓰려니 정말 시간이 부족하다고 느껴지지만 그래도 될 수 있는한 
꾸준히 써볼려고 노력 하겠습니다.^^+  이번 포스팅 어떘나요 참 쉽죠잉?