회원가입 ID/PW 찾기

1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.

콘텐츠 수 1,041

캠퍼스 C 강좌_5

펌웨어 & 코딩언어 구매수 0 2007.11.04 01:12:20
판매자 프리미엄 판매 납포인트 무료 평점 0점 / 총 0명 참여

***************************< 캠퍼스 C  강좌 >*****************************
[제목] :
[코드] : campusc1-005 (초급)
[교재] : CAMPUS C (초급, Third edition)  [출판사 : 책과스승]
[알림] :이 파일은 "캠퍼스 C"에서 모든 분께 공개한 "초급 강좌"입니다.
        이 [알림]의 내용을  지우지 않는다면 누구에게나 임의로 복사해  줄 수
        있습니다.그러나 이 강좌내용에 대한 저작권은 "캠퍼스 C"에 있습니다.

[연락처] : 605-8662 (서울) ("캠퍼스 C", 도서출판 "책과 스승")
           천리안 : go campusc  
           나우콤 : go lcampc
           하이텔 ID : campusc
****************************<< 목 차 >>***********************************
<1> 컴퓨터의 이해
        1> CPU 와 입출력 장치
        2> CPU 와 BUS 3가지
        3> RAM, ROM, REGISTER
<2> 코드 이야기
        1> ASCII 코드
        2> KSCII 코드
*****************************< 내용 시작 >********************************
<1> 컴퓨터의 이해
        1> CPU 와 입출력 장치
        2> CPU 와 BUS 3가지
        3> RAM, ROM, REGISTER
**************************************************************************
        컴퓨터를 하드웨어 적으로  완전히 이해 한다는 것은 쉬운  일이 아닙니
다. 그래서 소프트웨어에  관한 내용을 배우는 "전산학과" 있듯이,   하드웨어의
설계및  구조에  대해서   전문적으로  배우는  학과도  따로   있는  것이지요.  
 

        우리나라에서는 이런  학과의 이름이 일반화  되 있지 않은 것  같은데,
미국의 경우는 "computer  engeering" 이라는 분야가 하드웨어에  관계된 학과이
고, "computer science"  라는 학과는 소프트웨어에 관계된 학과로  대충 정리가
되있지요.
        그러나 이  두 분야는 물과 불처럼  서로 대치하는 그런 관계가  아닙니
다. 오히려 내용이 서로 관계가 있어서 양쪽 학과에서  전부 다루는 과목과 많은
지경 입니다. 따라서 지금 우리처럼 C 라는  "소프트웨어 언어"를 배우려는 사람
들도 하드웨어에 대해서 전혀 모르면 곧 한계에 다다르고 맙니다.

        따라서 지금 우리도 하드웨어에 관해서 많이 알면  알수록 좋지만, 지금
은 여러가지로 어려움이  있을테니 중급과정에서 더 자세히 다루기로  하고 지금
은 가장 기초적인 내용으로 몇가지 관점에서만 살펴보기로 합니다.

----------------------
1> CPU 와 입출력 장치
----------------------
        먼저 여러분이  지금 눈앞에 보고  있는 컴퓨터는 "입력장치" 와  "출력
장치"로 나누어 생각해  볼 수 있는데, 당연히 컴퓨터쪽으로  데이타가 들어가면
"입력장치", 나오면 "출력장치", 드나들면 "입출력 장치" 이지요.  그 장치를 구
분해 보면 다음과 같습니다.
        -------------------------------------------------------------
        1. 입력 장치  --> 키보드(stdin), 마우스, CD-ROM, 스캐너,...
        2. 출력 장치  --> 모니터(stdout), 프린터(stdprn), 플로터,...
        2. 입출력 장치 --> 하드 디스크, 플로피 디스크, 모뎀(stdaux),..
        -------------------------------------------------------------
 

        이외에도 많은 장치가 있을 수 있겠지만, 여기서는  일반인들이 흔히 볼
수 있는 장치들만 적은 것 입니다.
        이런 분류를 하는  것은 별로 어렵지 않을 것입니다. 그리고  위에서 가
장 일반적으로 쓰는 장치들은  C 에서 좀더 쉽게 다루기 위해서 이름을  아예 하
나씩 붙여 주었습니다. 그것들이 다음과 같습니다.
        ----------------------------------------------------------
        stdin   --> 키보드를 가리키는 말 (standard input의 준말)
        stdout  --> 모니터를 가리키는 말 (standard output의 준말)
        stdprn  --> 프린터를 가리키는 말 (standard printer의 준말)
        stdaux  --> 직렬통신 포트를  //  (standard auxiliary의 준말)
        ----------------------------------------------------------
 

        이 장치들에  "standard" 라고 이름을  붙여준 이유를 여러분들은  이미
알 것 입니다. 위의  장치들은 컴퓨터를 쓸 때 가장 기본적으로 있어야  되는 것
아닙니까 ?
        이 중에서도  특히 "키보드와  모니터"를 묶어서 콘솔(console)  이라고
부릅니다. 이 용어는  "컴퓨터를 제어, 조작하는 장치" 라는 뜻인데,  낱말의 뜻
과 일치 하지요 ?   그러나 이 용어의 좀더 정확한 개념을 이해  하려면, 옛날부
터 써오던 컴퓨터의 구조를 이해해야 합니다.
        옛날부터 쓰던 컴퓨터의 형태는, 지금 은행에서 쓰고  있는 것과 똑같다
고 보면 됩니다.   지금 우리가 쓰고  있는 것은 "개인용(personal) 컴퓨터"  로
서, 자기 혼자만 쓰는  컴퓨터이지만, 이런 컴퓨터가 나온 것은 불과  10 여년전
의 일이고, 그전에는  한 컴퓨터에 여러 사람이   달라 붙어서 쓰는  구조였습니
다.
        즉 한 은행에 커다란 컴퓨터가 한대 있고,  여러명의 창구의 은행원들이
전부 그것을 공유해서 사용하고 있는 형태이지요. 창구의  은행원들이 쓰는 컴퓨
터는 지금 우리가 얘기하고  있는 "키보드 + 모니터" 형태로 되  있습니다. 그러
나 이것은 "터미널(단말기)" 라고 부르지 "콘솔" 이라고  부르지는 않습니다. 기
초 강좌를 읽은  분은 아직 "버스"얘기를 기억하시는 지 모르겠는데,  사람이 고
속버스를 타고와서 내리는 곳이 "터미널" 이듯이, 컴퓨터의  데이타도 버스를 타
고 또 긴 선로를 타고와서 내리는 곳이 은행창구의 터미널입니다.

        콘솔은, 보통의  경우, 진짜 컴퓨터가  놓여져 있는 컴퓨터실에  가보면
본체 옆에 같이 놓여져 있습니다. 생긴것은 "터미널" 과  유사하게 "키보드 + 모
니터" 형태로 생겼지요.  그러나 대형 컴퓨터에서, 터미널은 수십,  수백대 까지
연결해 쓸 수 있는 것에 비해, 콘솔은 보통  한대만 쓰지요. 마치 여왕개미와 일
개미 처럼, 같은 개미지만 종류가 틀린 것과  같습니다.

        이 콘솔을 만질 수  있는 사람은 (은행 체계를 잘 모르지만)  은행 내부
에서도 몇명 안될 겁니다. 왜냐하면 이 콘솔로 대형  컴퓨터 시스템 자체를 조작
하고 또 죽이기도 할 수 있기 때문이지요. 이에  비해 터미널은 간단한 데이타만
주고 받는 기능을 할 수 있을 뿐입니다.

        이와 같이,  대형 시스템에서 콘솔의  기능은 막중한 것이지만,  우리가
쓰고 있는 개인용(personal) 컴퓨터에서는 하나뿐이 없는 "키보드  + 모니터" 자
체가 자동적으로 콘솔이 되는  것 아니겠습니까 ?  옛날 콘솔 출신들은  땅을 치
고 통곡하겠지만, 기능상 다를 바 없으니 그 이름을 그대로 쓸 수 밖에요.

        컴파일러의 "헤더  파일" 중에,  "conio.h" 라는 헤더파일이  있습니다.
바로 지금 얘기한 "console   input output"의 준말 입니다. 이 헤더  파일에 어
떤 내용이 들어가 있을지 짐작이 가시지요 ?

        좌우간, 여기서  기억 할 것은  "키보드 와 모니터"가 대표적인  입출력
장치로서, 컴퓨터를 구성하는 중요 요소 라는 것  입니다. 따라서 이런 장치들을
하나씩 분석하고 공부를 해 나가면 결국은 컴퓨터  시스템 전체를 이해하게 되는
겁니다.

<숙제>
교재 [14쪽]을 보면 그림이 하나 있는데, 이 그림을  입출력 장치의 관점에서 분
류를 하고 C  에서 붙여준 이름 (stdin,  stdout, stdprn, stdaux) 을  해당하는
곳에 적어 두세요. (이 내용은 두달 후 파일 얘기 할 때 또 나올 겁니다)
--------------------
2> CPU 와 BUS 3가지
--------------------
        이제 범위를 좁혀서 컴퓨터 본체만을 놓고 보면,  프로그래머들이  기본
적으로 알아야 할 것은 역시 CPU 와 버스의 구조 입니다.
        CPU를 자세히 공부하는 것도 프로그래머에게는 필수  입니다. 그러나 지
금 단계에서는, 일단  버스와 연관해서 그 크기(폭)을 이해  하는게 중요합니다.
따라서 일단 다음과 같은 질문에 대답을 찾아봐야 합니다.

        -----------------------------------------------
        1. 이 CPU 내부의 "REGISTER는 몇 비트" 크기인가 ?
        2. 이 CPU는 몇비트의 "DATA BUS"를 가졌나 ?
        3. 이 CPU는 몇비트의 "ADDRESS BUS"를 가졌나 ?
        -----------------------------------------------

        이것은 각 CPU 마다 구조가 틀리기 때문에  각자 알아봐야 하는 것인데,
일단 우리들은 주로 "80286"  아니면 "80386" 이라고 보고 이 내용을  교재에 자
세히 실었습니다.
        레지스터에 관한 얘기는 나중에 또 자세히 얘기할  기회가 있을 것이고,
일단은 크기를 봅니다.
        -----------------------------------------------------
        1. [20쪽]의 80286은 전부 16비트 크기 입니다.
        2. [23쪽]의 80386 은 전부 32 비트 입니다(일부 빼고).
        3. 그리고  요즘은 80486을  가지고 있는 분들도  많은데 그 내부  구조    
         는 (레지스터 측면에서) 80386과 같습니다.
        -------------------------------------------------------

        이 레지스터의 크기가  왜 중요한지는 이미 알것입니다.  여러분이 가지
고 있는 전자  계산기 중에도, 장난감 같은  것은 8자리 수까지 밖에 못  더하고
좋은 것은 12자리 까지 더할 수 있는게 있을 겁니다.   따라서 계산 123456789 +
123456789 를 한다고 하면  8자리용 계산기를 가지고 있는 사람은 애를  좀 먹을
겁니다.
        나중에 어셈블러를  할 사람들은  이런 내용을  철저하게 해야  하는데,
[20쪽] 을 보면, 레지스터 이름 AX, BX 가 있습니다. 계산을 할  때 실제로 AX +
BX 연산을 합니다. 즉 각각 16비트 크기로 더하는  거지요. 여기서 32 비트 크기
로 더하기를 하려면 한번에 연산이 안되니까 여러번에  걸쳐서 계산을 해냅니다.
당연히 복잡하고 시간이 많이 걸리지요.
        이에  비해 386  같은 경우라면,[23쪽]  에 보다시피  레지스터 "EAX  +
EBX" 를 하면 한번에 가볍게 계산을 할 수 있습니다.
        C 를 이용할 때는 우리가 직접 이런  계산을 안하지만, 그것도 컴파일러
가 286 용인가,  386 용인가에 따라 내부적으로  이런 일이 벌어지는 것은  결국
똑같습니다.
        아쉽게도 우리가 쓰는 터보 C  2.0은 286  용이기 때문에 여러분들이 아
무리 386, 486을 가지고  있어도 위와 같은 32 비트 덧셈연산을 하려면  정신 없
이 여러번에 나눠서  합니다. 결국 여러분의 컴퓨터 성능을 제대로  발휘하지 못
하는 거지요.    이에  비해 볼란드 C++ 3.1을  쓰는 사람들은 386용으로 쓸  수
있습니다. 즉 한번에 32 비트 연산을 해 낼 수 있는 겁니다.
        이런 내용은 컴파일러마다 쉽게 확인을 할 수가  있습니다. 터보 C 에서
는 [Compiler]  [Code generation]  [Instruction set] 을  줄줄이 선택해  보면
"80186/80286" 이나 "8088/8086"으로 선택 할 수 있는게 보일 겁니다.
 

        따라서 여러분들이 나중에  C에 좀더 익숙해지면 컴파일러도  골라서 써
야 합니다. 지금  우리가 쓰는 컴파일러는 사실  쉽게 쓸 수 있는  컴파일러이긴
해도 "좋은 컴파일러"라고  하기는 어렵습니다. 옛날에는 마이크로 소프트  C 가
실제 개발용으로 많이  쓰였는데, 요즘의 판도는 예전과 다소 달라진  것 같더군
요.

        CPU에서 나오는 많은 핀들은 각각 전기줄에 연결이  되는데 이 전기줄들
을 관계 있는  것끼리 묶어서 버스라고 부른다고 했습니다(기초 강좌  참조). 따
라서 버스란 "전기줄 다발" 입니다. 이 버스도 기능상 3가지로 구별합니다.
        -----------------------------------------------------
        1. addres bus : 주소를 찾는데 필요한 선들
        2. data bus   : 데이타가 실려 다니는데 필요한 선들
        3. control bus : 그외 기능들을 하는 선들(나머지 가닥들)
        --------------------------------------------------------

        여기서 3. control  bus는 하드웨어를 공부할 사람들이나  보는 것이고,
우리는 나머지 "address bus" 와 "data bus"의 크기에  대해서만 알고 있으면 됩
니다.
        [25쪽]에 이 버스들의 크기가 나와 있습니다. 먼저  "address bus"의 크
기가 24 가닥 인걸 보세요. 이것은 총 2의 24승의 주소를 가리킬  수 있는 걸 의
미 합니다. 이게 계산에 의하면 16M(메가) 인데, 크기  계산은 [7쪽] 위 표를 참
조 하세요.
        그리고 데이타 버스는  16비트 크기인데, 이것은 편도  16차선의 고속도
로와 똑같은 개념입니다.  즉, 자동차 경주를 한다면, 총소리와 함께  16대의 자
동차가 "부앙~" 하면서  출발하듯이 데이타도 16비트가 동시에 출발  합니다. 즉
2 바이트 크기이지요. 이게 C 에서는 "int" 라는 크기 입니다.

        [26쪽]의 386은 "address bus"가 32 비트 입니다. 즉  2의 32승 만큼 주
소를 가리킬 수 있다는 것인데, 크기 계산은 아시지요 ?
 2의 32승 --> 2의 2승 x 2의 30승  --> 2의 2승 G --> 4 G (기가)
모르시는 분은 [7쪽] 위를 참조 해 주세요.

        여기서 데이타 버스는 32 비트 인데, 이것도 역시  총을 쏘면 차가 동시
에 32대가 출발 합니다. 즉 4 바이트 입니다. 286에 비해서 2배가 많지요.

        이것도 역시 286 컴파일러를 쓰면, 여러분의 386에서는  32대의 차를 동
시에 출발 시킬 수 있음에도 불구하고 16대씩만 출발  시키는 겁니다. 정말 아깝
지요 ? 좋은 컴퓨터  썩히는게 말입니다. 그래서 이런 불합리한 짓을  하지 말자
고 386 전용 프로그램들이  요즘 나오는 거지요. 아래 한글 2.5 따위와  같은 프
로그램을 보면, 그  안에 286용 과 386용  실행 파일이 따로 있습니다. 아마  그
차이를 짐작하실 겁니다.

        각 CPU 마다 이런 버스의 폭은 제각각 틀리기  때문에 [19쪽]에 전부 정
리해서 실었습니다.
<문제> [19쪽] 그림을 보고 펜티엄 칩의 버스 크기를 직접 확인해보세요.
        데이타 버스 : 핀  중에서 Dxx로 시작되는 것중 xx자리에 가장  큰 수를
                        찾아보세요.
        주소 버스  : 핀 중에서  Axx로 시작되는 것중  xx자리에 가장 큰  수를
                        찾아보세요.
----------------------
3> RAM, ROM, REGISTER
----------------------
        데이타 들이 버스를  타고 돌아다니다가 내리는 곳이 터미널  이라고 했
는데, 컴퓨터 내부에서 더  정확히 살펴보면, 그 도착지는 크게 3  군데 입니다.
그곳이 1. RAM, 2  ROM, 3.REGISTER 인데, [14쪽]의 그림을 보면  음영을 흐리게
준 부분 입니다.
        먼저 CPU 내부의 음영은  말할 것도 없이 "CPU 레지스터"를 그린  것 입
니다. 그리고 "Main 메모리" 부분이 RAM의 대표적인  부분인데, 요즘 나오는 RAM
의 형태는  [16쪽]의 그림과 같이 세워서  꽂게 되있습니다. 이 부분에,  우리가
짠 C 프로그램이 실제로 들어가는 것 입니다.
        그리고 이외에도 처리  속도를 빠르게 하기 위해서 SRAM을  사용하여 캐
쉬(cache) 메모리를 쓰지만, 우리가 프로그램을 할 수  있는 부분이 아니라서 그
림에서 제외 시켰습니다. 그리고 "CMOS" 부분은 밧데리로  계속 전원을 공급받고
있어서 시스템이 꺼진 후에도 계속 데이타를 보존 할 수 있는 곳이입니다.
        ROM에는  컴퓨터를   완전히  이해하기   위해서  꼭  필요한   부분인,
"ROM-BIOS"라는 프로그램이 들어가 있는 곳이고, 이 부분이  전원이 꺼져도 항상
데이타가 저장되 있는 곳 입니다. 그리고 나머지 부분들은  전부 작은 칩들에 내
장 되있는 수 바이트에서 수십 바이트 정도의 레지스터 들입니다.
        따라서 컴퓨터가  켜져서 동작을  하고 있을 때는  현재 [14쪽]  그림의 
음영 부분이 전부 의미 있는 데이타를 갖고 있다고  보아도 됩니다. 이 상황에서
CPU의 주관하에 데이타들이 왔다갔다 하면서 이동하는 일이  컴퓨터가 하는 일입
니다.
        그러나 컴퓨터가 꺼지면,"CMOS" 와 "ROM" 부분만  계속 의미있는 데이타
를 유지하고 있는 상황 입니다. 따라서 처음으로  컴퓨터가 켜지면 CPU가 의지해
야 할 데이타는 오직 이곳 밖에 없지요.

**************************************************************************
<2> 코드 이야기
        1> ASCII 코드
        2> KSCII 코드
**************************************************************************
1> ASCII 코드

        이제는 여러분도  한 바이트의  의미를 이해하고 있으리라고  믿습니다.
단순히 256각형의 주사위일  뿐이지요. 지난번에 주윤발과 개(멍멍이)를  등장시
킨 도박  이야기를 아직 기억하시는지  모르겠는데, 주사위를 굴려서 나온  숫자
자체는 아무 의미가 없다고 했지요.

        인간들이 이  의미 없는 256  가지의 숫자에다 "글자"를 하나씩  할당해
주고 서로 약속을 한 것이지요. 예를 들면 "숫자  65(0x41)는 'A'라는 글자로 하
자"는 식입니다.   이것은 단순히 약속이기 때문에 약속을  안하겠다는 사람들에
게는 아무 의미가 없습니다. 그러나 보통은 이 약속을 따르고 있지요.

        이제 아래의 실험으로  미국 사람들은 한 바이트에 어떤  글자를 할당해
주었나 확인하고 역시  한국에서는 완성형과 조합형에서 각각 어떤  약속을 했는
지 살펴 보기로 합시다.

        1) 자기가 갖고 있는 한글 프로그램을 띄운다.(도깨비,블랙 박스 따위)
        2) 아래의 프로그램을 잘라 내어 컴파일하고 실행한다.
        3) 결과를 화면에서 볼  수 있으면 한글 모드를 조합, 완성형,  영문 상
           태로 바꿔 가며 어떤 글자들이 표시되는지 본다.

----------------------------------------
main()
{
        int i;

        clrscr();
        for(i= 0x20; i < 0xff; i++) {
                if(!(i % 16)) {
                        printf("\n");
                }
                printf("%c ",i);                /*  <---- %c 타입     */
        }
        getch();
}
----------------------------------------
        위의 프로그램은 32부터  255까지의 숫자를 "문자"로 바꿔서  찍어 보라
는 것입니다.  여기서 한글 모드를  어떻게 바꾸느냐에 따라 한국과  미국에서는
서로 어떻게 약속했는지 눈으로 직접 확인할 수  있습니다. 처음 0부터 31(0x1f)
까지는 애초에 "글자"로 약속하지 않았기 때문에 일부러 찍지 않았습니다.

<문제> 한국과 미국간에 약속이 틀린 글자는 어떤 것인가 ?

        위의 256 가지 글자의  약속 중에서도 특히 반을 딱 잘라서  앞부분 128
개(0x00  -   0x7f)를  우리는     ASCII  Code(American  Standard  Code   for
Information  Interchange)라고 부릅니다.  "아스키 코드"라고  읽고,  번역하면
"정보 교환을 위한 미국 표준 코드"쯤 될것입니다.

        이 ASCII code를  16진법으로 표시하면 0x00부터 0x7f까지이고  2진법으
로 쓰면 00000000부터 01111111까지인데, 여기서 주목할  것은 최상위 비트(MSB)
가  전부 0이라는  사실입니다. 아스키  코드를  벗어난 다음글자  0x80(2진수로
10000000)부터는 최상위 비트가 1로 set 됩니다. 바로  "이 상태"를 이용해서 한
글 코드는 반드시 1xxxxxxx로 시작되게끔 정해 놓았습니다.  이른바 "쫑" 나는걸
피하기 위해서지요.  좀더 점잖은 용어로  서로 "상충"되는 것을 피하기  위해서
입니다.

        이렇게 256 가지  중에 후반부 128개는 사실상 코드로서의  별다른 의미
가 없습니다. 즉 자기하고  싶은 대로 써도 큰 문제가 되지  않는다는 것이지요.
그러나 전반부 128개(ASCII Code)는 절대로 자기 마음대로  써서는 안됩니다. 거
의 세계  표준이라고 할 만하지요.

        그 표를 교재  [534쪽]에 실었습니다. 이제 빨간 형광펜으로  다음의 글
자에 특히 표시를  해 두세요.  이것들은  아스키 코드 중에서도 특히  빈번하게
쓰는 것이므로 가급적 기억하고 있는 게 좋습니다.

0x00    NUL : 스트링(문자열)의 끝을 나타낼 때 쓰인다.
0x07    BEL : 벨 소리 낼 때
0x08    BS  : 리턴키 바로 위의 BACK SPACE 키
0x09    HT  : 탭 키
0x0a    LF  : 프린터의 한 줄 넘김 키
0x0c    FF  : 프린터의 페이지 넘김 키
0x0d    CR  : 리턴키
0x1b    ESC : Esc 키

0x30 - 0x39 : 아라비아 숫자 0부터 9까지
0x41 - 0x5a : 대문자 알파벳 A부터 Z까지
0x61 - 0x7a : 소문자 알파벳 a부터 z까지

        이 아스키 코드는  프로그램을 작성할 때 아주 기본적으로  쓰이기 때문
에 위에 언급한 것들은 외울 정도가 되어야 합니다.  특히 0x00부터 0x1f까지 32
개의 숫자들은 "글자"를 위한 약속이 아니고 주로 "통신할  때 제어"를 위한 "기
능"의 약속입니다. 예를 들면 0x07은 "벨 소리를  내자"는 약속이지 어떤 글자를
찍겠다는 뜻이 아니라는  것입니다. 또 0x0c같은 FF는 "한 페이지를  넘겨라" 같
은 기능을 수행하는 것입니다. 이 표를 좀더  자세하게 교재 [536쪽]에 실었으므
로 위의 글자들을 표시해 두세요.

        이제는 여러분의 키보드를 유심히 보세요. 보통 우리가  제일 많이 두드
리는 부분(좌측 아래 부분)이 거의 아스키 코드와 1  대 1로 대응하는 것입니다.
그리고 키 보드의 나머지 부분은 주로 Function Key라고  보면 별 무리가 없습니
다. 키보드의  제일 윗 부분 [F1]  - [F12]까지의 F는 Function의  머릿글자입니
다. 이와 같이 키보드는 크게 두 부분으로 나눌 수 있습니다. 즉

        1. 보통키 (아스키 코드 발생 부분)
        2. 확장키 (그 외 부분)

        이제는 우리가 무심코 친 키보드 "a"가 사실은  아스키 코드로 바뀌어서
컴퓨터 내부로 들어감을 새롭게 인식할 수 있을 것입니다.

--------------------------------------------------------------------------
2> KSCII 코드

        한국의 코드는 여러분도  아시다시피 완성형과 조합형이 난무하고  있습
니다. 정부에서 정한  건 KS 코드라고 "완성형"을 말하지요.  지금은 "조합형"도
채택했다고 하는데 자세한 내막은 모르겠습니다. 다만 여기서  말하고 싶은 것은 
빨리 코드를 하나로  통일해야 한다는 것입니다. 제가 말을 안해도  여러분이 이
미 완성형,조합형 두 가지로 인해 겪는 불편을 잘  아시겠지요?  이건 한글 관련
프로그램을 짜는 사람도  고생스럽게 하고 사용자도 마찬가지로 불편을  겪게 만
드는 것입니다.

        제 개인적인 생각으론 하나로 통일되려면 조합형이  당연히 낫다고 봅니
다. 그 차이는 이렇습니다. 먼저 교재 [558쪽]을  보세요. 이게 완성형 코드라는
것입니다. 여기서 특수  문자와 한자를 코드로 나열한 건 당연한  것이지만 한글
도 하나씩 코드를 할당해 준 걸 보세요. 이 표를  보는 법을 예를 들면 "가"라는
글자는 0xb0 0xa1  두 바이트를 순서대로 써  주는 것입니다. "각"은 0xb0  0xa2
입니다. 그러면 "늷"이란 글자는  어떻게 할까요 ?  이 완성형  표에서 찾아보면
그런 글자가 없습니다. 이걸 만든 사람들이 그런 글자는  안 쓴다고 생각하고 빼
버린 모양입니다. 아마 국어 사전에 "늷"이란 글자로  시작되는 단어가 없는지도
모르지요. 그렇다고 대한민국  정부에서 정한 코드가 엄연히  한국말인 "늷"이란
글자를 쓸 수 없다는  것은 말이 안되지요. 만일 여러분이 지금  소설가로서 "가
래 뱉는 소리"에  특별한 의미를 두어 "늷"이라고 쓰고 싶으면  어떻게 하시겠습
니까?  (아주 바보 같은) 이유 없는 제한이라는 걸 아시겠지요?

        이에 비해 교재  [550쪽] 조합형 한글은 그렇지 않습니다.  여기서도 특
수문자나 한자에  일련의 코드번호를 부여한 건  어쩔 수 없는 노릇이지만  한글
코드는 보다시피 말  그대로 초성,중성,종성을 조합하게 되어  있습니다. 여러분
도 그냥 보면 알겠지만 여기서 표현 못할 글자란  없습니다. 그리고 한글에 관한
한 이 조합표 한 장이면 충분하지요.

        여기서도 한글 한 글자는 2 바이트로 표현되고  최상위 비트가 1로 시작
되는 것은 조합,완성형 공히 같습니다. 위에서 얘기한  바와 같이 영어로 시작되
는지 한글로 시작되는지  구별할 수 있는 유일한 열쇠는 이  최상위 비트입니다.
여러분도 경험이 있겠지만 통신을  하다 보면 글자가 막 깨져 나오는  때가 있는
데, 전화선에서  실수로 한 바이트를  놓치면 한글과 영어가 하나씩  어긋나면서
생기는 현상이지요.(꼭 이런 경우만 있는 것은 아니지만)

        교재 [550쪽] 표를 보면  초, 중, 종성은 각각 5 비트씩  할당되어 있습
니다. 그리고 각각 fill code라는게 있는데, 받침  없는 글자(종성 없는 경우)는
종성 부분을 fill code로 채우면 됩니다. 예를 들어

김   -->   1 00010 11101 10001   --> 0x8bb1
           |    |    |    |  |      (4비트 씩 구분)

기   -->   1 00010 11101 00001   --> 0x8ba1
                           |
                          fill code

내용을 이해하시리라 믿습니다.

<숙제> 교재에  있는 조합형과 완성형 코드  표에서 자기 이름에 해당하는  한자
       코드를 찾아보세요.
<숙제> 다음에 있는 프로그램은 "김"이란 글자를 찍는  프로그램입니다. 이걸 고
       쳐서 자기  이름을 조합형과 완성형으로 각각 화면에  찍어 보세요.(반드
       시 아래의 4 가지 방법을 전부 사용하여  자기 이름을 써 보고 여기서 다
       음 사항을 유의하세요.)

        1. putch() 와 printf("%c") 타입이 같다는 것
        2. printf()문에서는 항상 쌍따옴표 " "로 데이터들을 묶는다는 것
        3. putch()는 항상 홑 따옴표 ' '로 묶는다는 것

-------------------------
<방법 1>

main()
{
        putch(0x8b);
        putch(0xb1);
        getch();
}

-------------------------
<방법 2> : printf()를 이용하면 다음과 같이된다.

main()
{
        printf("%c%c",0x8b,0xb1);
        getch();
}

-------------------------
<방법 3> : 변수를 사용하면 다음과 같다.

unsigned char ch  0x8b;
unsigned char ch2 0xb1;

main()
{
        printf("%c%c",ch, ch2);
        getch();
}

-----------------------------
<방법 4> : 보통 간편한 방법은 다음과 같다.

main()
{
        printf("김");
        getch();
}

------------------------------

<문제> putch('김'); 은 틀린 표현이다. 이유는 무엇인가요 ?
<문제> 교재에서 [552쪽] ~ [567쪽]의 표는 글자들을 전부  손으로 친 것이 아니
       고 간단한  프로그램을 짜서 코드로  발생시킨 것이다. for문을  써서(할
       수 있는 분들은) 이 글자들을 화면상에 전부 찍어보세요.

**************************************************************************
        사실상 우리가  평상시 문자를 찍을  때는  printf("안녕하세요")  이런
식으로 하지 이 글자들의 코드를 일일이  찾아서 printf("%c%c", 0x12,0x23)하는
식으로 쓰지는  않습니다. 오늘의 연습은  코드에 대한 이해를 확실히  하시라고
연습을 해 본 것입니다. 그러나 나중에 여러분들이  상용 프로그램을 짜거나, 어
떤 전문적인 프로그램을  짜게 되면 누군가 여러분의 프로그램을  복사해서 암호
를 풀려고 시도할  지도 모르지요. 그런 경우에 자기의 프로그램을  분석하는 것
을 어렵게 할 의도로 일종의 암호화 기법으로 쓰일 수 있을 것입니다.

        예를 들면 printf("Type  your password : "); 이런  식으로 프로그램을
짜 놓으면   분석해야 할 부분이 어디쯤인지  금방 노출되겠지요?  소스  파일을
분석하지  않고  실행 파일을  분석할  때도  debugger를 사용하면  "Type  your
password :" 같은 부분은 순식간에 찾아볼 수  있으므로 마찬가지입니다. 따라서
이런 글자들을 솔직하게 다  보여 주면 안되는데 이런 때 이  글자들의 코드에서
전부 1 씩 빼서  데이터로 저장한다거나, 혹은 더 어려운 방법을  동원하면 일단
은 이 부분이 노출되지는 않는다는 것이지요. 물론 이런  방법을 써도 마음만 먹
으면 소프트웨어 프로텍트라는  것은 다 풀린다고 보지만 일단은  어렵게 만들어
놓으면 푸는 사람을 좀 더 괴롭힐 수 있다는 것입니다.
***************************< 끝 맺으며 >**********************************
수고하셨습니다.
**************************************************************************

 


profile
외뿔공룡 2008.10.11 12:16
자료 감사합니다.
profile
버닝비 2009.09.22 15:39
좋은 자료 감사합니다.
profile
한틀 2009.11.02 11:15
좋은 자료 감사합니다.화이팅~!
profile
스마일러 2009.12.29 17:39
아...여기까지 왔군요 감사합니다.
profile
용정 2010.01.15 13:19
좋은자료 감사합니다. 잼있네요.
profile
안다솜 2010.02.03 13:46
감사합니다.
profile
공부하고놀자 2010.03.30 18:13
좋은 자료 감사^^
profile
KillingS 2010.05.23 14:58
잘 보고 갑니다~
profile
jlee377 2010.07.28 14:05
좋은자료 감사합니다^^
profile
시나브로69 2017.06.24 15:40
좋은 자료 감사합니다.
search
List of Articles
번호 분류 제목 평점 포인트 판매자 등록일 구매수 조회 수
공지 공공의 목적으로 공유하고자 하는 소프트웨어는 '소프트웨어 자료실'에 업로드를 요청드립니다.
공지 구매후 평점 댓글을 남겨주시면 구매포인트의 20%를 돌려드립니다.
281 펌웨어 & 코딩언어 캠퍼스 C 강좌_14 [2] 무료 프리미엄 2007-11-05 0 966
280 펌웨어 & 코딩언어 캠퍼스 C 강좌_13 [2] 무료 프리미엄 2007-11-05 0 1053
279 펌웨어 & 코딩언어 캠퍼스 C 강좌_12 [4] 무료 프리미엄 2007-11-05 0 1008
278 펌웨어 & 코딩언어 캠퍼스 C 강좌_11 [3] 무료 프리미엄 2007-11-05 0 1021
277 머신러닝, AI & 알고리즘 (10) matlab M-file 작성 시 유용한 함수 [2] 무료 프리미엄 2007-11-05 0 1995
276 머신러닝, AI & 알고리즘 (9) matlab 다차원 배열(multidimensional array) [1] 무료 프리미엄 2007-11-05 0 3548
275 머신러닝, AI & 알고리즘 (8) matlab subfunction과 다차원 배열 [2] 무료 프리미엄 2007-11-05 0 2223
274 펌웨어 & 코딩언어 캠퍼스 C 강좌_10 [4] 무료 프리미엄 2007-11-04 0 1072
273 펌웨어 & 코딩언어 캠퍼스 C 강좌_9 [6] 무료 프리미엄 2007-11-04 0 1309
272 펌웨어 & 코딩언어 캠퍼스 C 강좌_8 [7] 무료 프리미엄 2007-11-04 0 1294
271 펌웨어 & 코딩언어 캠퍼스 C 강좌_7 [9] 무료 프리미엄 2007-11-04 0 1101
270 펌웨어 & 코딩언어 캠퍼스 C 강좌_6 [9] 무료 프리미엄 2007-11-04 0 1357
269 머신러닝, AI & 알고리즘 (7) matlab 제어문과 debugging요령 [1] 무료 프리미엄 2007-11-04 0 1868
268 머신러닝, AI & 알고리즘 (6) matlab의 M-file이란 무엇인가? [2] 무료 프리미엄 2007-11-04 0 1720
267 머신러닝, AI & 알고리즘 (5) Matlab의 연산자(operators) [1] 무료 프리미엄 2007-11-04 0 2272
266 머신러닝, AI & 알고리즘 (4) Matlab의 행렬의 거듭 제곱 [3] 무료 프리미엄 2007-11-04 0 3597
265 머신러닝, AI & 알고리즘 (3) Matlab의 행렬연산을 전반적으로 정리 [2] 무료 프리미엄 2007-11-04 0 1649
264 머신러닝, AI & 알고리즘 (2) matlab으로 행렬을 다루는 전반적인 내용 [5] 무료 프리미엄 2007-11-04 0 1522
263 머신러닝, AI & 알고리즘 (1) 왜 Matlab을 배워야 하는가? [18] 무료 프리미엄 2007-11-04 0 1891
» 펌웨어 & 코딩언어 캠퍼스 C 강좌_5 [10] 무료 프리미엄 2007-11-04 0 1458
  • 사랑은 너무 어려 양심이 무엇인지 모른다. 그러나 양심이 사랑에서 태어나는 것을 누가 모르는가?
    - 셰익스피어
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.