주의: 컴퓨터에 대한 아무런 지식 없이 바로 어셈블리어로 뛰어드는 행동은
오리보트 타고 바다로 나가는 것만큼 위험한 행동이에요.
적어도 컴퓨터 기본 지식을 가지신 분
혹은 C에 대한 기초가 어느 정도 있으신 분만 계속 진행해 주세요.
(읽는다고 해도 말리지는 않아요. 요즘 습해서 빨래도 잘 안 마르는데...)
그럼 본격적으로 어셈블리어를 향해 돌진!

이번에는 CPU의 연산에 직접적인 연산을 맡는 레지스터에 대해서 설명하고
어셈블리어 약간을 넣어서 전문틱(?!)하게 갈 생각이에요.
그나저나 나 케이온 중독인가?그 이전에 앞으로 자주 보게 될 16진수에 대해서 설명할게요.
2진수를 10진수로 바꾸어 쓰다가 편의상 묶은 4비트(니블) 2진수의 범위가
0에서부터 15까지인 것을 알게 된 사람들이 16진수를 쓰기 시작한 거에요.
2진수와 16진수 사이에는 변환하는 방법도 쉽거든요.
변환하고 나면 한 글자가 되니까 알아보기도 편하고요.
0[0,0]1[1,1]2.[10,2]3,[11,3]4[100,4]5[101,5]6[110,6]7[111,7]8[1000,8]9[1001,9]10[1010,A]11[1011,B]12[1100,C]13[1101,D]14[1110,E]15[1111,F]CPU에는 레지스터라는 장소가 있어요
이전에 작성했지만 레지스터는 데이터를 저장하고 연산하는 과정에 필요한 공간이에요.
하지만 일반적인 저장 장치와 마찬가지로 크기 제한이 있어요.
레지스터는 16비트만큼의 크기 제한이 있어요.
다시 말하자면 2바이트, 1워드만큼 크기 제한이 있다고 할 수 있어요
16비트, 2바이트, 1워드 세 가지는 모두 똑같은 말이에요.
2진수를 16진수로 바꾸어서 0000-FFFF 범위 내 제한을 둔다고도 할 수 있죠.
2장에서 설명했던 메모리의 주소도 레지스터에 입력된 주소를 찾아가야 하는데
다시 생각해 보면 메모리가 65535비트밖에 없는 것도 아니고 당황스럽죠.
65535비트가 얼마나 작느냐에 대한 질문은 1MB가 1048576비트라고만 해도 답이 되겠네요.
데스크탑 컴퓨터에서 램 용량이 작더라도 512MB 이상은 될 텐데
주소값을 표현할 방법이 없어서 1MB도 못 쓴다니 답답하죠.
CPU가 8086(286 이전 CPU)이었던 시절, Intel은 주소 버스(Address bus)를 20비트로 만들어서
레지스터 2개의 값을 합하는 방식으로 65535비트 이후의 주소값을 쓸 수 있게 했죠.
(4비트)(4비트)(4비트)(4비트)
(4비트)(4비트)(4비트)(4비트)
4비트씩 5개가 되어서 20비트가 만들어지는 방식이에요.
물론 보호 모드(Protected mode)로 들어가면 16비트 레지스터 2개를 이용해서
32비트로 4GB 크기까지의 메모리 주소에 접근할 수 있어요.
일단 지금은 레지스터 2개의 값을 합하는 방식에 대해서 알아보자고요.
어셈블리로 코딩을 하면서 가장 먼저 만나는 모드가 리얼 모드(Real mode)이고
리얼 모드에서는 레지스터 2개의 값을 합해서 메모리 주소를 지정하니까요.
점점 어려워지는 게 느껴지나요?

레지스터 2개의 값을 합해서 메모리 주소를 지정하는 방식을 세그먼트:오프셋 방식이라고 해요.
세그먼트 값에 16을 곱한 다음(한 자릿수 증가) 오프셋을 더해주면 실제 주소가 나와요.
예를 들어서 7F2B:61E3과 같은 주소가 있을 때
실제 주소는 세그먼트 7F2B에 16을 곱한 7F2B0 + 오프셋 61E3 = 85493이 되는 거에요.
설명이 복잡해서 그렇지 이해하고 나면 생각보다 어렵지 않죠?
다음 4장에서는 레지스터의 종류와 사용 용도에 대해서 알아보기로 해요.
아마 5장 정도에서 실전 운영체제 만들기를 시작할 수 있을 것 같아요.
최근 덧글