본문 바로가기

개발자 페이지/Code

혼자서 움직이는 컴퓨터

728x90
반응형

계산기와 컴퓨터를 구분하는 가장 중요한 요소는 바로 조건에 따른 제어가 가능한 

반복 혹은 Loop 기능을 포함하고 있느냐 없느냐이다. 

 

디지털 컴퓨터는 프로세서, 메모리, 적어도 하나의 입력장치(DI), 출력장치(DO) 이렇게 

4가지 주요 구성요소로 이루어 진다.

 

1. ALU: (Arithmetic Logic Unit) 수치연산 및 논리연산 유닛

2. AND: 논리곱 이라고도 하며, 모든 입력값이 1일 때만 1을 출력 

3. OR: 논리합 이라고도 하며, 하나 이상의 입력값이 1이면 1을 출력

4. XOR: 입력값이 같지 않으면 1을 출력  

  예) 0 XOR 0 = 0

        0 XOR 1 = 1

        1 XOR 0 = 1

        1 XOR 1 = 0

 

컴퓨터를 이용하여 두 수를 곱할 수 있도록 일련의 명령을 결정한 일이 바로 컴퓨터 프로그래밍이다.

일반적으로 컴퓨터 프로그램은 코드(명령어들 자체를 의미)와 데이터(코드에 의해 조작되는 숫자들)로 구분될 수 있다.

 

컴퓨터 프로그래머는 종종 코더라고 불리기도 하지만 많은 프로그래머가 이 용어를 싫어하며, 대신 소프트웨어 엔지니어라는 용어를 더 선호한다.

 

명령어의 동작 코드를 머신코드(Machine code) 혹은 기계어(Machine language)라고 한다.

언어라는 용어가 사용된 것은 이것이 사람이 읽고 쓰는 것과 유사하게 이를 기계가 이해하고 대응할 수 있기 때문이다.

기계어는 니모닉(Mnemonics)라 불리는 대문자로 이루어진 짧은 약어를 할당하여 사용하는 것이 일반적이다.

 

보통 니모닉에는 두 글자나 세 글자가 사용된다.

이러한 니모닉은 다르 축약어들과 같이 사용할 때 아주 유용하다.

예를 들어 '1003h에 있는 byte 값을 누산기로 로드'라고 길게 쓰는 것보다 다음과 같이 쓰는 것이 더 간결하다.

 

     LOD A.[1003h]

 

니모닉 오른쪽에 있는 A나 [1003h]와 같은 값은 인수(argument)라고 부르고, 해당 로드 명령어가 어떤 방식으로

동작할 것인지 알려주는 역할을 한다.

 

왼쪽에 있는 인수(A)는 명령어 수행의 결과가 저장되는 목적지를 나타내며,

오른쪽의 경우 명령어 수행과정에서 처리될 값(source):[1003h]을 나타내게 된다.

[] 대괄호는 누산기로 1003h값이 로드되는 것이 아니라 메모리 1003h 주소에 있는 값이 누산기에 로드된다는 의미이다.

 

이와 유사하게 '001Eh 번지(주소)에 있는 한 바이트를 누산기의 값과 더하라' 는 다음과 같이 짧게 쓸수 있다.

→ ADD A.[001Eh] 

 

'누산기의 내용을 1003h 번지에 저장하라' 는 명령은 다음과 같이 쓸 수 있다.

→ STO [001Eh].A

위 저장 명령에서도 목적지는 왼쪽에 위치하고, 소스는 오른쪽에 위치한다.

 

'만일 Zero 플래그 값이 1이 아니라면 0000h로 분기하라' 는 명령은 다음과 같다.

→ JNZ 0000h

 

이외 어떤 명령어들이 특정한 주소에 저장되어 있다는 것을 나타내기 위해서는 아래와 같이 16진수 주소를 쓰고

콜론기호( : ) 를 붙여주면 된다.

    0000h : LOD A.[1005h]

 

특정 주소에 있는 데이터의 경우 다음과 같이 표현할 수도 있다.

 

1000h:  00h, A7h

1002h:  00h, 1Ch

1004h:  00h, 00h

 

쉼표로 구분되어 있는 2바이트 데이터 왼쪽 부분은 지정된 주소에 저장되어 있는 데이터 값이고,

오른쪽에 있는 값은 그 다음 주소에 저장되어 있는 값을 의미한다.

 

따라서 위 세줄은 다음과 같이 적을 수 있다.

 

1000h :    00h, A7h, 00h, 1Ch, 00h, 00h

 

위 주소는 숫자를 직접적는 대신 메모리 위치를 참조할 수 있는 레이블을 이용하는 것이 더 좋다.

(주소는 경우에 따라 바뀔 수 있음.)

 

NUM1: 00h, A7h

NUM2: 00h, 1Ch

RESULT: 00h, 00h

 

NUM1, NUM2, RESULT 와 같은 레이블들은 모두 2byte가 저장되어 있는 메모리 주소를 나타낸다.

이 문장에서 'NUM+1'은 그 레이블 다음에 있는 주소의 byte를 나타내는 점 확인.

나중에 어떤 의도로 해당 문장을 적었는지 잊을 가능성이 있으므로, 실제 문장옆에 세미콜론 기호를 쓰고나서

짧게 주석을 적을 수 있다.

 

여기까지 본 소스코드가 바로 프로그래밍 언어의 한 종류인 어셈블리어(assembly language)라는 컴퓨터 언어이다.

이 언어는 16진수 숫자로만 구성된 기계어를 이용하는 방식과 여러 명령어를 사람이 사용하는 자연어인 영어로 장황하게 

풀어쓰는 방식의 중간 정도로 명령을 사용할 때는 메모리 주소를 레이블로 표현하는 방식을 같이 사용한다. 

 

어셈블리어와 기계어를 혼동하는 경우가 많은데, 사실 두 언어는 같은 것을 서로 다르게 표현한 차이가 있는 것이다.

어셈블리어로 쓰인 모든 문장은 특정한 바이트의 기계어에 대응한다.

 

어셈블리어로 만들어진 프로그램을 이에 대응하는 기계어로 바꾸는 과정을 어셈블(assemble) 이라고 한다.

이 시점에서 스위치를 이용하여 기계어 프로그램을 RAM에 입력하고, 프로그램을 구동시킬 준비가 된 것이다.

프로그램을 구동시킨다는 것은 입력한 명령어들을 순서대로 수행하게 만드는 것을 의미한다.

 

우리가 만든 컴퓨터에서 곱셈이 가능하고, 제곱근, 로그, 삼각함수 같은 원함수도 처리할 수 있을것이라는 확신이 생긴다.

이러한 처리를 수행하기 위한 장치에 필요로 하는 적절한 프로그램을 수행할 수 있는 덧셈, 뺄셈, 조건 분기가 가능한 명령어와 하드웨어만 있으면 프로그래머들은 소프트웨어를 이용해서 모든 것을 할 수 있다고 말할 수 있을 것이다.

 

위의 컴퓨터를 만들때 사용한 많은 개념이 1930년대 중반에 처음으로 릴레이를 이용한 컴퓨터가 구성되었을 때까지만 해도 존재하지 않았으며, 1945년경에 들어서야 서서히 이해되기 시작했다. 그때까지만 해도 컴퓨터를 만들려고 하는 사람들은 내부적으로 이진수가 아닌 십진수를 이용하려고 했다. 지금도 마찬가지지만 64KB RAM을 만들기 위해서는 커다란 릴레이 5백만 개를 사용한다는 것은 좀 어처구니가 없는것이다.

 

릴레이는 진공관, 트랜지스터 같은 전자장치로 대체되었고, 우리가 설계한 프로세서나 메모리와 동일한 것을 누군가가 이미 손안에 들어올 수 있는 크기로 만들었다는 것을 알고 있다.

728x90

'개발자 페이지 > Code' 카테고리의 다른 글

아스키 코드 간단 정의 & 짧은 역사  (0) 2022.12.03
반도체란? 트랜지스터의 발명 및 역사  (0) 2022.11.09
Filp flop 회로 ( NOR )  (0) 2022.09.07
Relay / Inverter Relay  (0) 2022.08.25