컴퓨터가 받아들이고 처리하는 정보의 종류로는 프로그램 코드와 데이터가 존재한다 

디지털 컴퓨터에서 그러한 정보들은 모두 2진수를 나타내는 비트들의 조합으로 표현된다.

c와같은 언어들로 작성된 프로그램은 사람이 이해하기는 간단하지만 컴퓨터 하드웨어의 입장에서는 전혀 이해를 못한다. 그러하기 때문에 컴파일러 라고 불리우는 소프트웨어를 이용해 하드웨어가 이해할 수 있는 언어로 번역한다.

컴퓨터의 하드웨어가 이해할 수 있는 언어를 "기계어 , 기계코드" 라고 부른다.

기계어는 CPU마다 서로 다르다.
이러한 문제를 어셈블리 언어( 고급언어와 기계어 사이에 존재한다 )를 이용해 언어상의 차이를 해결한다 .

고급언어 프로그램 ---> 어셈블리 프로그램 ---> 기계어 프로그램 
ex)  Z = X + Y             LOAD  A, X               00100101
                                ADD  A, Y               10000110
                               STOR  Z, A               01000111

LOAD A, X : 기억장치 X번지의 내용을 읽어서 레지스터 A에 적재(LOAD)하라 
ADD  A, Y : 기억장치 Y번지의 내용을 읽어서 레지스터 A에 적재된 값과 더하고 결과를 레지스터 A에 적재하라.
STOR Z, A : 레지스터 A의 내용을 기억장치 Z번지에 저장(STORE) 하라.

LOAD, ADD, STOR같은 기호를 니모닉스 라고 부른다.

명령어는 CPU가 수행해야 할 동작뿐만 아니라 처리할 데이터가 저장되어 있는 기억장치 주소나 레지스터 번호도 구제적으로 지정해준다.
이와 같은 명령어들은 CPU의 내부 구조와 밀접한 관계가 잇기때문에 어셈블리를 사용하는 프로그래머는 컴퓨터의 내부 구조를 알고 있어야 한다 . 

컴파일의 마지막 결과인 기계어 프로그램은 2진수인 1과 0들의 조합으로 이루어져있다 .
예시를 위해서 LOAD A, X명령어에 대한 기계어의 예를 들어보겠다 

                          연산코드          오퍼랜드 
                            0 0 1            0 0 1 0 1
연산코드 필드(op code field)에 저장된 001은 '레지스터 A로 적재하라'는 연산을 지정해주는 비트이다 . 
오퍼랜드 필드(operand field)의 00101은 적재될 데이터가 저장되어 있는 기억장치 주소를 가리킨다.
위의 기계어 에서는 오퍼랜드가 5번지를 가리키고 있기때문에 "기억장치 5번지의 내용을 읽어서 레지스터 A에 저장하라"라는 명령을 나타내고 있다.

연산코드의 비트가 세 비트들로 이루어져있다면 2³ = 8가지의 연산들을 지정할 수 있다.(지수 쓰는법 찾는거 귀찮았다..-_-)
마찬가지로 오퍼랜드는 비트들의 수가 5개 이므로 2의 5승 = 32 즉 기억 장소들의 최대 수가 32개가 되는것이다 .
이와 같은 비트들의 구성을 명령어 형식이라고 한다 .

[전체 시스템의 구성] 

프로그램 실행 : CPU가 주기억장치로부터 프로그램 코드를 읽어서 실행한다.
데이터 저장 : 프로그램 실행 결과로서 얻어진 데이터를 주기억장치에 저장한다.
데이터 이동 : 디스크나 CD-ROM에 저장되어 있는 프로그램과 데이터 블록을 주기억장치로 이동한다.
데이터 입력 및 출력 : 사용자가 키보드를 통하여 보내는 명령이나 데이터를 읽어 들인다. 또한 CPU가 처리한 결과 값이나 기억장치의 내용을 프린터(혹은 모니터)로 출력한다.
제어 : 프로그램이 순서대로 실행되도록 혹은 필요에 따라 실행 순서를 변경 하도록 조정하며 , 각종 제어 신호들을 발생한다 .

IAS 컴퓨터 

1952년, 폰 노이만이 개발하였으며 stored-program 컴퓨터이다
2진수 체계를 이용하고 프로그램과 데이터를 내부에 저장한다.
주요 구성요소 : 프로그램 제어 유니트(Program Control Unit): 명령어


인출/해독
산술논리연산장치(ALU)
주기억장치 : 명령어와 데이터를 모두 저장
입출력 장치 

폰노이만 아키텍처(von Neumann Architecture) : 폰노이만이 제안한 컴퓨터구조 설계 개념으로서 기억장치에 저장된 프로그램을 프로그램 카운터( CPU의 내부 레지스터) 가 지정하는 순서대로 실행시킨다 . 

CPU는 산술논리연산장치 (ALU라고 표현한다) 와 레지스터 세트 및 제어 유니트로 구성되어있다 . 

[CPU 내부 레지스터]

-프로그램 카운터(PC) : 다음에 인출될 명령어의 주소를 가지고 있는 레지스터이다 . 각 명령어가 인출된 후에는 그 내용이 자동적으로 1(혹은 명령어 길이에 해당하는 주소 단위의 수만큼)이 증가되며 , 분기 (branch) 명령어가 실행되는 경우에는 그 목적지 주소로 갱신된다 . 

뉴산기 :(Accumlator: AC) :데이터를 일시적으로 저장하는 레지스터이다. 이 레지스터의 비트 수는 CPU가 한 번에 연산 처리할 수 있는 데이터 비트의 수 즉 단어 길이와 같다.

명령어 레지스터(Instruction Register: IR): 가장 최근에 인출된 명령어가 저장되어 있는 레지스터이다 .

기억장치 주소 레지스터(Memory Address Register : MAR) : 프로그램 카운터(PC)에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터이다 . 즉, 이 레지스터의 출력 선들이 주소 버스 선들과 직접 접속된다 .

기억장치 버퍼 레지스터 (Memory Buffer Register : MBR) : 기억장치에 저장될 데이터 혹은 기억장치로부터 읽혀진 데이터가 일시적으로 저장되는 버퍼 레지스터이다 . 이 레지스터의 입력 및 출력 선들은 데이터 버스 선들과 직접 접속된다.

[ADD의 실행 사이클] 
ADD addr 명령어의 마이크로-연산이다 
t0 :  MAR <-- IR(addr)
t1 : MBR <-- M[MAR]
t2 : AC <-- AC + MBR

첫번째의 주기(T0) 동안에 명령어의 오퍼랜드(addr)를 주소버스를 통하여 기억장치로 보낸다

 두번째 주기에서 해당 기억 장소로부터 데이터를 인출하여 MBR에 적재한다. 

세번째 주기에서 그 데이터와 AC 레지스터의 내용을 더한 후에 결과값을 다시 AC 레지스터에 저장합니다 


[주의 이 그림에서 T0 T1 T2는 옳바르지 않으므로 위에 써놓은 경로를 생각하며 그림을 봐주세요 ]

오퍼랜드 : 연산을 수행하는 데 필요한 데이터 혹은 데이터의 주소를 나타낸다. 


ADD X  ; AC<-- AC + M[X]

여기서 X는 데이터가 저장되어 있는 기억장치 주소를 나타낸다 .
뜻 : 기억장치 X 번지의 내용과 누산기(AC)의 내용을 더하고 , 그 결과를 다시 AC에 저장하라는 명령어이다 .

이와 같이 한 개의 오퍼랜드 (ADD [X] < X가 오퍼랜드)만 포함하는 것을 1-주소 명령어라고 한다 .

문제 예제 1) 길이가 16비트인 1-주소 명령어에서 연산 코드가 5비트일 때의 명령어 형식을 정의하고, 주소지정 가능한 기억장치 용량을 결정하라. 단, 주소가 지정되는 각 기억 장소에는 한 바이트씩 저장된다고 가정한다.
(A) 방식 명령어 형식
     5                  11
연산코드       기억장치 주소
(B) 주소지정 가능한 기억장치 용량 2^11 = 2048바이트

ADD R1,R2 ; R1<--R1 + R2

뜻 : R1과R2 내용을 더하고 결과 레지스터 R1에 저장한다.
이와 같이 입력 데이터가 저장된 레지스터들 중의 하나에 연산의 결과값에 저장한다면 명령어에는 두 개의 오퍼랜드 필드만 존재하면되는데 이와 같은 명령어를 2-주소 명령어라고 한다 . 이 경우에 결과값이 저장되는 레지스터의 원래 내용은 지워진다.

문제 예제 2) 주소 명령어 형식을 사용하는 16-비트 CPU에서 연산 코드가 5비트이고 레지스터의 수는 8개이다 . 
(a) 두 개의 오퍼랜드들이 모두 레지스터 번호인 경우
(b) 오퍼랜드들 중의 하나는 기억장치 주소인 경우의 명령어 형식
(a) , (b)를 각각 정의하라 

풀이 - 16개의 명령어 비트들 중에서 연산 코드로 사용되는 5개를 제외하면, 오퍼랜드로 사용될 수 있는 비트로는 11개가 남게 된다. (a)의 경우에는 그림 [2-주소 명령어의 형식들(A)] 에서 보는 바와 같이 두 개의 레지스터 번호를 가리키기 위하여 각각 3비트씩 배정하면 마지막 5비트는 사용되지 않는다.
(b)의 경우에는 그림[2-주소 명령어의 형식들(B)]와 같이 기억장치 주소를 위하여 8비트가 배정될 수 있다.



ADD R1,R2,R3 ; R1<--R2+R3

이 명령어는 세 개의 오퍼랜드를 포함한다. 

ADD의 연산 코드를 0101이라고 가정한다 

예를 들어 명령어의 길이가 16비트라고 하면 각 필드의 각각 4비트씩 할당 할 수 있으므로 최대 16개의 레지스터들이 각 오퍼랜드를 저장하는 데 사용될 수 있다.



                                     [주소지정 방식]  

주소지정방식 = 주소 비트들을 이용하여 오퍼랜드의 유효 주소를 결정 하는 방법

명령어의 길이가 늘어나면 오퍼랜드 필드의 수와 각 필드의 비트 수가 증가될 수 있다.
일반적으로 명령어 비트의 수는 CPU가 처리하는 단어의 길이와 같도록 제한된다.
EA : 유효 주소 , 데이터가 저장된 기억장치의 실제 주소 
A  : 명령어 내의 주소 필드 내용 ( 오퍼랜드가 기억장치 주소인 경우)
R  : 명령어 내의 레지스터 번호 ( 오퍼랜드가 레지스터 번호인 경우 )
(A) : 기억장치 A번지의 내용
(R) : 레지스터 R의 내용

직접 주소지정 방식


명령어 내 오퍼랜드 필드의 내용이 데이터의 유효 주소로 사용되는 가장 간단한 방법.

장점 : 데이터 인출을 위하여 한번의 기억장치 액세스만 필요함
단점 : 연산 코드를 제외하고 남은 비트들만 주소 비트로 사용될 수 있기 때문에 직접 지정할 수 있는 기억장소의 수 제한

간접 주소지정 방식 


오퍼랜드 필드에 기억장치 주소가 저장되어 잇지만 , 그 주소가 가리키는 기억 장소에 데이터의 유효 주소를 저장해두는 방식이다 .

장점 : 최대 기억장치용량이 단어의 길이에 의하여 결정
-> 주소지정 가능한 기억장치 용량 확장
단어 길이가 N비트라면 최대 2ⁿ개의 기억 장소 주소지정이 가능    

단점 : 실행 사이클 동안에 두 번의 기억장치 액세스가 필요
첫 번째 엑세스 : 주소 인출
두 번째 엑세스 : 그 주소가 지정하는 기억 장소로부터 실제 데이터 인출


간접 비트가 포함된 명령어 형식
명령어 형식에 간접비트 (i)가 필요하고 
만약 I = 0 이면 , 직접 주소지정 방식이고 
만약 I = 1 이면 , 간접 주소지정 방식이다 .

                           즉시 주소지정 방식 
데이터가 명령어에 포함되어 있는 방식 ( 오퍼랜드 필드의 내용이 연산에 사용할 실제 데이터 )

용도 - 프로그램에서 레지스터나 변수의 초기 값을 어떤 상수값(constant value)로 세트하는데 사용된다
장점 - 데이터를 인출하기 위하여 기억장치를 액세스할 필요가 없음 
단점 - 상수값의 크기가 오퍼랜드 필드의 비트 수에 의해 제한된다 .

                            레지스터 주소지정 방식

명령어의 오퍼랜드가 가리키는 레지스터에 저장되어 있는 데이터를 연산에 사용하는 방식 
                                     EA = R 

주소지정에 사용될 수 있는 레지스터들의 수 = 2ⁿ (단 N은 R 필드의 비트 수 )
장점 = 오퍼랜드 필드의 비트 수가 적어도된다.
      = 데이터 인출을 위하여 기억장치 액세스가 필요 없다

단점 = 데이터가 저장될 수 있는 공간이 CPU 내부 레지스터들로 제한되어있다.

                              레지스터 간접 주소지정 방식

오퍼랜드 필드(레지스터 번호)가 가리키는 레지스터의 내용을 유효 주소로 사용하여 실제 데이터를 인출하는 방식 EA = (R)

장점 : 주소지정 할 수 있는 기억장치 영역이 확장 

레지스터의 길이 = 16 비트라면, 주소지정 영역 : 2^16 = 64K 바이트
레지스터의 길이 = 32 비트라면, 주소지정 영역 : 2^32 = 4G 바이트

                              상대 주소지정 방식

프로그램 카운터(PC)를 레지스터로 사용 (주로 분기 명령어에서 사용)
EA = A+(PC) 단, A는 2의 보수
A > 0 : 앞(forward) 방향으로 분기 
A < 0 : 뒷(backward) 방향으로 분기 

장점 : 전체 기억장치 주소가 명령어에 포함되어야 하는 일반적인 분기 명령어보다 적은 수의 비트만 있으면 된다 .
단점 : 분기 범위가 오퍼랜드 필드의 길이에 의해 제한된다.

                                   인덱스 주소지정 방식
인덱스 레지스터(IX) : 인덱스 값을 저장하는 특수 레지스터 
인덱스 레지스터의 내용과 변위 A를 더하여 유효 주소를 결정 EA =(IX) + A
주요 용도 : 배열 데이터 액세스 

자동 인덱싱
명령어가 실행될 때마다 인덱스 레지스터의 내용이 자동적으로 증가 혹은 감소
이 방식이 사용된 명령어가 실행되면 아래의 두 연산이 연속적으로 수행됨
EA(IX) + A IX < IX +1 

[예]
데이터 배열이 기억장치의 500번지부터 저장되어 있고 , 명령어의 주소 필드에 
'500'이 포함되어 있을 때  , 인덱스 레지스터의 내용 (IX) = 3 이라면 >데이터 배열의 4 번째 데이터 액세스 


논리 연산을 위한 하드웨어 모듈


입력 비트들은 모든 논리 게이트들을 통과

선택 신호들에 의하여 멀티플렉서의 네 입력들 중의 하나를 출력


4-비트 논리 연산장치 


논리 묘듈을 병렬로 접속

순환 시프트(circular shift)

회전(rotate)이라고도 부르며, 최상위 혹은 최하위에 있는 비트를 버리지 않고 반대편끝에 있는 비트 위치로 이동

 순환 좌측-시프트(circular shift- left) 

 최상위 비트인 A4가 최하위 비트 위치인 A1으로 이동

부호 없는 2진수 곱셈기의 구성도

M 레지스터 : 피승수(multiplicand) 저 장 

Q 레지스터 : 승수(multiplier) 저장 

두 배 길이의 결과값은 A 레지스터와 Q 레지스터에 저장


                                    Booth 알고리즘

하드웨어 구성 -부호 없는 정수 승산기의 하드 웨어에 다음 부분을 추가 

M 레지스터와 병렬 가산기 사이 에 보수기(complementer) 추가 

Q 레지스터의 우측에 Q-1 이라 고 부르는 1-비트 레지스터를 추가하고, 출력을 Q0와 함께 제어 회로로 입력 Q 레지스터가 우측 시프트 될 때 Q0 비트가 이 레지스터에 저장된다.


예 ] Booth 알고리즘을 이용하여 2진수 곱셈 {(-7)x3}을 수행하라 .

M레지스터에 피승수 -7에 대한 2의 보수 표현인 '1001'을 저장하고 승수 '0011'은 Q 레지스터에 저장한다. 4- 비트 데이터들 간의 곱셈이므로 계수(n)은 4로 세트하고 ,Q_1은 0으로 초기화 한 다음에, 그림 3-14의 알고리즘에 따라 아래와 같은 연산들을 순차적으로 수행하면 된다.


부동소수점 수의 표현

부동소수점 표현(floating-point representation) : 소수점의 위치를 이동시킬 수 있는 수 표현 방법  ---> 수 표현 범위 확대 

부동소수점 수(floating-point number)의 일반적인 형태 N = (-1)^S M × B^E

단, S : 부호(sign), M : 가수(mantissa), B : 기수(base), E : 지수(exponent) 

 10진 부동소수점 수(decimal floating-point number)

 [예] 274,000,000,000,000 ---> 2.74 ⅹ10^14 

0.00000000000274 ---> 2.74 ⅹ10^-12 

2진 부동소수점 수(binary floating-point number) 

기수 B = 2 

단일-정밀도(single-precision) 부동소수점 수 : 32 비트 

복수-정밀도(double-precision) 부동소수점 수 : 64 비트


+ Recent posts