http://espiras.net 으로 자료를 옮기고 있습니다.
3
5
0
by EeSE

존재가치 350원

eese.egloos.com


일반생활 전국 국토 대장정 2011/07/31 12:34 by EeSE

왜 글이 하나도 없었느냐에 대한 변명이랄까요...

13일간 국토 대장정 예정이 잡혀서 이것저것 준비할 게 많았어요.
(국토 대장정이라고는 하지만 혼자 출발하는 거니 자유여행에 가깝죠)

그나저나 지갑에 4만원도 안 들었는데 어떻게 13일을 버티지...

도와주세요

프로그래밍 어셈블리 일반 기초 3장 2011/07/29 16:26 by EeSE

주의: 컴퓨터에 대한 아무런 지식 없이 바로 어셈블리어로 뛰어드는 행동은
오리보트 타고 바다로 나가는 것만큼 위험한 행동이에요.
적어도 컴퓨터 기본 지식을 가지신 분
혹은 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장 정도에서 실전 운영체제 만들기를 시작할 수 있을 것 같아요.

프로그래밍 어셈블리 일반 기초 2장 2011/07/29 12:40 by EeSE

이번 2장에서는 메모리에 대해서 간단하게 이야기를 해 볼게요.



컴퓨터는 전기가 흐르는 장치이기 때문에 ON과 OFF, 다시 말해서 0과 1밖에는 알지 못해요.
마찬가지로 메모리에 쓰여진 데이터도 0과 1로만 저장되어 있어요.
이 0과 1의 조합이 데이터가 될 수도 있고, 연산이 될 수도 있는 거에요.

설명만 본다고 해서 이해할 사람이 몇 없을 것 같기 때문에
직접 숫자 '69' 데이터가 저장되는 예를 들어 보도록 할게요.

69는 우리가 일상생활에서 자주 사용하는 10진수에요.
하지만 컴퓨터는 0과 1을 사용하는 2진수를 사용하고 있기 때문에 10진수를 이해하지 못하죠.
그래서 10진수를 컴퓨터가 이해할 수 있는 2진수로 바꾸어 주어야 하는 거에요.

10진수 69는 2진수 1000101₂로 바꾸어 쓸 수 있어요.
메모리는 2진수 1000101₂을 받아 스위치를 ON/OFF시켜서 저장해요.
…[ON][OFF][OFF][OFF][ON][OFF][ON]…



하지만 각각의 정보를 구분해 주어야 하기 때문에
메모리에서의 기본 저장 공간은 8비트―스위치 8개―가 되어서 각각을 구분해 주고 있어요.

…[OFF][ON][OFF][OFF][OFF][ON][OFF][ON]…
12345678

그렇다면 문자는 어떤 방식으로 메모리에 저장되는지도 살펴봐야겠죠?
하지만 문자가 메모리에 직접 저장될 일은 전혀 없기 때문에 '약간 특별한' 방법을 이용한답니다.
문자를 저장할 때 '아스키 코드'라는 표에 쓰여진 문자와 숫자를 대응하는 방식으로 저장해요.
결국 메모리에 특정 숫자가 저장되고, 그 숫자를 불러올 때 문자로 바꾸어서 보여주는 방식이에요.
ASCII 코드표 [다운로드]
위 ASCII 코드표를 기준으로 문자열 'Hello world' 가 저장되는 예를 들어 볼게요.

…(0100 1000) (0110 0101) (0110 1100) (0110 1100)
Hell
    (0110 1111) (0010 0000) (0111 0111) (0110 1111)
ospacewo
    (0111 0010) (0110 1100) (0110 0100) (0000 0000)…
rldnull

또 하나, '문자'로 된 숫자와 '숫자' 그 자체로 표현되는 숫자가 있어요.
이 두 가지를 구분해서 사용해야 해요.
문자로 된 숫자는 연산을 할 수 없거든요.

사실 이렇게 메모리에 데이터가 저장되는 방식이 중요한 것이 아니라
메모리에 저장된 데이터에 어떻게 접근하느냐가 더욱 큰 문제죠.



사실 접근 문제도 그렇게 어려운 이야기는 아니에요.
위에서 설명했던 메모리 각 스위치마다 자신의 주소를 가지고 있어요
스위치 첫번째는 0번, 두번째는, 1번… 식으로 말이죠.

접근 문제에 대한 심화 학습은 어셈블리 언어를 직접 다룰 때 다시 한번 다루어 보기로 해요.

다음 장에서는 대망의 어셈블리어 출현!

프로그래밍 어셈블리 일반 기초 1장 2011/07/29 05:55 by EeSE

어셈블리를 정식으로 접하기 이전에 컴퓨터가 명령어를 어떤 방식으로 처리하는지는 알고 있어야겠죠?
아무것도 모르고 무작정 어셈블리로 달려들었다가는 머릿속만 어지러워져요.
컴퓨터가 동작하는 방식을 알게 된다면 어셈블리를 처음 접하더라도 생각보다 어렵지 않을 거에요.



컴퓨터가 명령어를 처리하기 위해서는 명령어가 주어져야겠죠?
맨 처음 하드 디스크와 같은 저장장치에서 실행할 명령어가 메모리로 로드된 이후의 이야기에요.

처음 메모리로 로드된 정보는 '2+6' 과 같은 데이터와 연산이 섞여있는 상태죠.
그리고 위의 데이터는 각각의 레지스터로 들어가서 연산 대기 상태가 돼요.
지금은 2, 6과 같은 숫자가 데이터가 되겠죠?

다음으로 데이터와 연산을 CPU로 보내면 CPU가 연산을 한 뒤 결과를 돌려받는 거에요.

연산을 하고 난 뒤 돌려받는 값 8은 또 다시 그 다음 데이터와 연산을 하겠죠?
이러한 연산들이 모여서 하나의 프로그램이 만들어지게 되는 거랍니다.

그렇다면 이런 생각을 하는 사람도 있겠죠?
'메모리에 들어 있는 데이터를 레지스터로 넣지 않고도 바로 계산할 수 있는 거 아닌가?'
하지만 메모리에 들어있는 내용은 단순한 정보이기 때문에 그런 방법을 쓸 수는 없어요.

…[2][+][6][비교][8][같다면 ○○○로 이동][4][-]… 와 같이 단순한 정보의 나열을
레지스터에 쓰게 되면 CPU로 들어가서 연산이 이루어지는 거죠.

어떻게 보면 카드를 뽑아 주는 것과 비슷하다고 볼 수도 있겠네요.
물론 이런 진부한 예 말고도 자기 나름의 비유를 만들어 보는 것도 괜찮다고 생각해요.


1장은 어셈블리어 없이 여기에서 마쳐보도록 할게요.
2장이 나오기 전까지 컴퓨터의 동작 방식이 어떨지 생각해 보는 시간을 가져 보는 건 어떨까요?

프로그래밍 어셈블리 일반 기초 2011/07/28 22:16 by EeSE

어셈블리 입문에 앞서서 한 마디,
어셈블리 파고들면 후일 입신양명에는 큰 도움이 되겠지만
제대로 못 배워서 허술하게 실력 쌓으면 잉여클럽에서 회원가입 제의 들어오고
어셈블리도 다 같은 어셈블리가 아니라서 이상한 책 사서 봤다가
주화입마 걸려서 죽어도 보험료는 10원도 안보태주니까 몸조심하세요.



어셈블리 입문을 축하합니다!


어셈블리 강좌라고는 해도 몇 가지만 설명하고
실전 운영체제 만들기(!)로 넘어갈 거니까 꽤 재미있어질 거에요.
(어셈블리 강좌가 끝나고 나서도 가지고 놀 수 있는 운영체제를 만들 거에요)

강좌는 내용이 정리되는 대로 올리도록 할게요.

그리고 한 마디 더,
컴퓨터공학과 온다고 해도 이런거 다 안 배우니까 겁먹지 말고 오세요.
이해가지 않으시는 부분은 제가 하나씩 친절하게 설명해드릴게요.

1 2


웹폰트 (나눔고딕)