ALU 명령어

ALU 명령어들은 모두 기계어로 해석될 때, 0번째 비트가 1이다.

ADD RA, RB RA와 RB를 더해서 RB에 연산 결과를 넣기
SHR RA, RB RA를 오른쪽 시프트한 후 결과를 RB에 넣기
SHL RA, RB RA를 왼쪽 방향으로 시프트하고 결과를 RB에 넣기
NOT RA, RB RA를 NOT 연산하고 결과를 RB에 넣기
AND RA, RB RA와 RB를 AND 연산하고 결과를 RB에 넣기
OR RA, RB RA와 RB를 OR 연산하고 결과를 RB에 넣기
XOR RA, RB RA와 RB를 XOR 연산하고 결과를 RB에 넣기
CMP RA, RB RA와 RB를 비교하고 결과를 RB에 넣기

 

로드/저장 명령어

로드 명령어: 램에 들어 있는 바이트 데이터를 레지스터로 이동할 때 사용한다. (기계어코드 0000)

저장 명령어: 레지스터에 들어 있는 바이트 데이터를 램으로 이동할 때 사용한다. (기계어코드 0001)

LD RA, RB RA가 가리키는 램의 주소에 들어 있는 데이터를 RB로 로드
ST RA, RB RB에 들어 있는 데이터를 RA가 가리키는 램의 주소에 저장

 

데이터 명령어

램의 어떤 주소에서 바이트 데이터를 하나 가져와서 레지스터에 로드하는 역할인데, 이렇게만 보면 로드 명령어와 차이점이 없어 보인다. 그러나 로드 명령어와 크게 다른 점은 데이터 명령어로 바이트 데이터를 가져오기 위해 지정하는 램의 주소는 로드 명령어에서 지정하는 주소와 다른 공간을 사용한다는 사실이다. (기계어코드 0010)

DATA RB, xxxx xxxx RB에 8비트 데이터 로드

 

레지스터 분기 명령어

특정 레지스터에 들어 있는 내용을 IAR로 옮기는 역할을 한다. (기계어코드 0011)

JMPR RB RB에 들어 있는 램의 주소로 분기

 

직접 분기 명령어

어떤 명령어를 실행하고 싶을 때 그 명령어가 있는 램의 번지수를 알고 있을 때 유용하다. (기계어 코드 0100)

JMP Addr 특정 램 주소로 직접 분기

 

단일 조건 분기 명령어

조건(플래그)에 맞으면 분기한다. (기계어코드 0101)

JC Addr 자리 올림이 발생하면 분기
JA Addr A>B이면 분기
AE Addr A=B이면 분기
JZ Addr 결과가 0이면 분기

J(Jump): 분기

C(Carry): 올림

A: A가 더 큼

E(Equal): 같음

Z(Zero): 연산결과가 0

 

복합 조건 분기 명령어

단일 조건 분기 명령어 들을 복합적으로 엮은 명령어 들이다. (기계어코드 0101)

 

플래그 레지스터 초기화 명령어

(기계어코드 0110)

CLF Flags의 모든 플래그 비트를 0으로 초기화

 

 

클록은 NOT 게이트로 만든다.

NOT 게이트로 연결을 하게 되면 계속해서 자기 자신을 부정하므로 0과 1을 반복할 것이다.

 

지연된 클록을 만드는 이유는?

그렇게 하지 않으면 너무 빨라져서 그렇다.

 

그냥 클록과 지연된 클록으로 새로운 클록 두 가지를 만들었다. 그 이유는 클록의 "완벽한 타이밍"을 위해서이다.

 

 

 

예시와 함께보기 (두 숫자를 더하는 일을 해보자)

 R0의 숫자와 R1의 숫자를 더해서 R0에 덧셈 결과를 저장하는 상황이 있다고 해보자. 덧셈 연산을 수행할 때는 2회 이상의 클록 사이클이 필요하다.

첫 번째 클록 사이클 동안 R1의 출력을 허가 (출력클록clk e = 1)
TMP 입력을 허가 (입력클록clk s = 1)

이렇게하면 R1의 데이터가 데이터 버스를 타고 TMP 안으로 들어가게 된다.
두 번째 클록 사이클 동안 R0의 출력을 허가 (출력클록clk e = 1)
ALU 연산의 종류를 ADD로 설정
ACC 입력을 허가 (덧셈 결과가 ACC에 저장)
세 번째 클록 사이클 동안 ACC 출력 제어 비트를 on (덧셈 결과를 R0 으로 보냄)

op 입력으로 여덟 가지 코드 조합을 선택할 수 있다. 이 중 7개는 특정한 산술 장치나 논리 장치를 선택하는 데 이용하지만, 마지막 코드 조합은 어떤 장치도 연결되어 있지 않으므로 아무런 바이트를 출력하지 못한다. 그러나 여덟 번째 연산을 선택해도 a>b 나 a=b 비트는 여전히 작동하기 때문에, 비교 연산만 수행하고 싶을 때 여덟 번째 코드 조합을 선택하면 된다. 참고로 op 코드의 의미는 다음과 같다.

000 ADD 덧셈 연산
001 SHR 오른쪽 시프트 연산
010 SHL 왼쪽 시프트 연산
011 NOT NOT 연산
100 AND AND 연산
101 OR OR 연산
110 XOR XOR 연산
111 CMP 비교 연산

 

 

 

컴퓨터 CPU의 종류에는 두 가지가 존재한다. 그것이 바로 CISC (Complex Intruction Set Computer) 와 RISC (Reduced Instruction Set Computer) 이다.

 

 

 

CISC (Complex Intruction Set Computer)

말 그대로 복잡한 명령어를 사용한다. 이 방식의 장점은 '하나의 명령어'로 '강력한 기능'을 구현할 수 있다는 점이며, 컴파일이 단순하여 컴파일된 프로그램의 크기가 작다는 것이다. 이 방식은 명령어의 길이가 가변적이고 하나하나의 명령어들이 묵직하기 때문에 복잡할 수 밖에 없다.

 

 

 

RISC (Reduced Instruction Set Computer)

반면, RISC의 경우 CISC에 비해 명령어들이 가볍다. 명령어의 길이가 고정적이고 또 제한된 포맷을 지니기 때문에 그렇다.

 

 

 

아키텍쳐 구분 CISC RISC
명령어 길이 다양함 (가변길이) 모두 동일한 길이 (고정길이)
명령어 종류 많음 적음
컴파일러 여러종류의 명령어로 복잡함 고정길이와 작은종류로 단순함
소프트웨어 의존성 작음 (cpu명령어 선에서 처리) 많음 (cpu에서 처리하지 못한 명령을 소프트웨어가 처리함)
메모리 적게 사용 많이 사용

 

 

>> 표 출처 : https://blog.naver.com/makeflood/222412112306

 

CPU 아키텍쳐 : CISC , RISC

CPU 아키텍처란 CPU내부의 명령어 처리 과정이 조화롭게 운영되도록 설계된 시스템이다. 그 시스템의...

blog.naver.com

 

 

 

 

>> (유용한) 참고 링크

https://kldp.org/node/56072

 

[컴퓨터구조론] CISC , RISC 장단점 비교 | KLDP

CISC(Complex Instruction Set Computer) 모든 고급언어 문장들에 대해 각각 기계 명령어가 대응되도록 하는것 RISC(Reduced Instruction Set Computer) CISC의 많은 명령어중 주로 쓰이는것만을 추려서 하드웨어로 구

kldp.org

 

기억장치와 중앙처리장치가 버스로 연결되어 있으며, 순차적으로 연산을 수행하는 전통적인 컴퓨터 설계기법을 의미한다. 명령어와 데이터 메모리의 구분이 없는 것이다. 폰노이만 아키텍처는 현대 컴퓨터의 시작이라고도 볼 수 있다. 

1비트 가산기

a b 자리 올림
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

 

 

 

2비트 가산기

자리 올림
입력
a b c d e 자리 올림
출력
0 0 0 0 0 0 0 0
0 1 1 0 0 1 0
1 0 1 0 0 1 0
1 1 0 0 1 0 1
1 0 0 0 0 0 1 0
0 1 1 1 0 0 1
1 0 1 1 0 0 1
1 1 0 0 1 1 1

자리 올림 입력이 0 일시에는, 올림 수가 존재하지 않는 가산이라는 의미이다. 그렇게 되면 d의 결과는 항상 0이 된다. 그러면 자연스럽게 1비트 가산기의 역할만을 하게 되는 것이다. 반면, 자리 올림 입력이 1 일시에는, 올림 수가 존재하는 가산이라는 의미이다. 그렇게 되면 d의 결과는 a, b의 합을 끝낸 결과와 자리올림수 1의 값으로 다시 1비트 가산이 시작된다. 2비트 가산기는 그런식으로 짜여있다.

2비트 가산기 (단순화)

 

 

 

8비트 가산기

8비트 가산기는 2비트 가산기를 엮어 만들었다. 이런 형태로라면 255비트, 혹은 그이상도 연산을 수행할 수 있다.

8비트 가산기 (단순화)

CPU가 일을 처리하기 위해서는 연산을 수행해야 한다. 이러한 연산은 CPU 내부에서 바이트 단위로 처리를 해야한다. 그렇다면, 구체적으로 어떻게 일을 처리하는 것일까? 그 것을 위해서 CPU 내부에는 다양한 장치들이 존재한다.

 

 

 

하나의 레지스터에서 다른 레지스터로 바이트를 이동할 때 바이트 안에 들어 있는 내용물, 즉 '데이터'를 바꿀 수 있는 세 가지 연산 장치들

 

 

비트 시프트 장치 (bit-shift device)

비트 시프트 장치 (단순화)
(좌) 왼쪽 비트 시프트 장치 (우) 오른쪽 비트 시프트 장치

만약 시프트 출력과 시프트 입력이 연결되어 있다면, 재귀형식으로 말단에서 시프트되어 사라지는 비트가 시프트되어 또 다른 말단으로 들어오는 입력 비트로 추가될 것이다.

 

 

인버터 (inverter)

인버터 (단순화)

 

 

제로 검사기

 

 

 

 

 

바이트 데이터를 2개 입력해서 어떤 상호 작용을 거친 후 새로운 바이트를 출력할 수 있는 네 가지 연산 장치들

 

 

AND 장치

AND 장치 (단순화)

AND 장치는 여러 군데 쓰일 수 있지만, 하나만 소개하자면, 어떤 아스키 문자 코드를 대문자로 변환할 때 사용한다. 아스키 코드의 모든 알파벳 대문자와 소문자는 (의도적으로) 세 번째 비트의 부호만 다르게 구성되어 있다. 따라서 AND 장치를 이용하면 모든 알파벳 문자를 쉽게 대문자로 변환할 수 있다. 예를 들어, 알파벳 'e'를 나타내는 코드는 0110 0101 이고 대문자 'E'를 나타내는 코드는 0100 0101이다. 따라서 두 알파벳을 AND 하게 되면 대문자 코드인 0100 0101이 된다.

 

 

OR 장치

OR 장치 (단순화)

OR 장치도 여러 군데에서 쓰일 수 있지만, 앞서 설명한 AND 장치가 하는 일의 반대의 역할을 할 수도 있다. 알파벳 대문자 E를 나타내는 코드는 0100 0101인데, 이때 이 글자를 알파벳 소문자 e를 나타내는 코드인 0110 0101로 바꾸고 싶다면 0010 0000 이라는 비트 패턴과 함께 OR 연산을 수행하면 된다. 아스키코드의 알파벳 대문자와 소문자가 세 번째 비트의 부호만 다르게 설계되어 있기 때문에 OR 장치를 이용하면 쉽게 알파벳 대문자를 소문자로 변환할 수 있다.

 

 

XOR 장치

XOR 장치 (단순화)

XOR 장치는 서로 다른 어떤 두 개의 코드가 서로 같은지 다른지를 판별할 수 있다. 만약, 같은 비트 패턴이 들어 있다면 XOR 장치에 넣었을 때의 결과는 0000 0000 일 것이다.

 

그런데, XOR 장치로도 충분히 두 코드가 같은지 다른지를 판별할 수 있지만, 이를 담당하는 장치가 하나 더 있다. 그것은 바로 비교기이다.

비교기

1비트 비교기

다만, XOR 장치가 1바이트 크기의 출력을 다루는 반면, 비교기는 1바이트 크기가 아닌 오직 2비트 크기로 된 출력을 생성하는 장치이다. 비교기의 기능은 크게 세 가지 인데, 버스에서 들어오는 1바이트 입력 2개가 정확히 같은지 판단하는 능력, 입력 2개가 다른지 판단하는 능력, 입력이 다르다면 버스 입력 a로 들어온 데이터가 버스 입력 b로 들어온 데이터보다 이진수로 큰 수인지 판단하는 능력이다.

바이트 비교기

 

바이트 비교기 (단순화)

 

 

가산기

https://jinn-o.tistory.com/144

 

[논리회로] 가산기

1비트 가산기 a b 합 자리 올림 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 2비트 가산기 자리 올림 입력 a b c d e 합 자리 올림 출력 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1..

jinn-o.tistory.com

Endian 엔디안?

엔디안은 컴퓨터 메모리와 같은 1차원 메모리 공간에 여러 개의 연속된 대상을 배열하는 방법을 말하며, 바이트를 배열하는 방법을 특히 바이트 순서(Byte order)라 한다.

 

 

 

Big Endian 빅 엔디안

빅 엔디안은 큰 단위가 앞에 배열되는 방식이다.

 

 

 

Little Endian 리틀 엔디안

리틀 엔디안은 작은 단위가 앞에 배열되는 방식이다.

 

 

 

정리 (예시)

종류 0x1234의 표현 0x12345678의 표현
빅 엔디언 12 34 12 34 56 78
리틀 엔디언 34 12 78 56 34 12

Shift 연산?

컴퓨터 연산 중에는 shift 연산이 있다. shift 연산이란, 비트 부호를 오른쪽으로 혹은 왼쪽으로 한 칸씩 이동하는 것을 말하는 데, 통상적으로 왼쪽으로 이동하면 x2 의 효과가 나타나고 오른쪽으로 이동하면 /2 의 효과가 나타난다. 이러한 Shift 연산은 두 가지로 나뉘는 데, 그게 바로 Arithmetic shift 와 Logical shift 이다.

 

 

 

Logical Shift 논리적 시프트

왼쪽으로 이동하든 오른쪽으로 이동하든간에 이동이 완료되어서 비어버린 자리에 0을 채워주는 기법을 말한다.

 

 

Arithmatic Shift 산술적 시프트

만약 시프트하려는 수가 Unsigned number, 즉 양수라면 논리적 시프트였을 때와 같이 0을 채워넣어주면 된다. 그러나 만약 시프트하려는 수가 signed number, 즉 음수라면 이야기가 다르다. 음수인 경우, 오른쪽으로 이동한다면 빈 자리에 1을 채워주어야 한다.

먼저 램(RAM)이란?

RAM 은 Random Access Memory 혹은 Rapid Access Memory 의 약자로써 임의의 영역에 접근하여 데이터를 읽을 수 있는 주기억장치이다. 다만, 전원이 off 되면 데이터가 날아가는 휘발성 메모리이다. RAM은 어느 위치에 저장된 데이터이든지 접근하는 시간이 달라지지 않기 때문에 랜덤이라는 명칭이 주어졌다. (반면 디스크의 경우는 가장 최근에 접근한 데이터의 위치나 시간에 따라서 데이터마다 그때그때 접근하는 시간이 달라진다.)

 

 

 

256바이트 램의 구조

왼쪽 상단에 보이는 것은 레지스터이다. 해당 레지스터에 값이 들어오면 비트가 4개씩 이분열이 되어 각각 4x16 다중 입력 게이트에 들어간다. 다중 입력 게이트는 출력되는 값들을 단 한개의 값만 TRUE 를 출력한다. 따라서 램 내부에 존재하는 256개의 격자 중에 단 한 개의 격자만이 선택되는 것이다.

 

 

 

그렇다면 격자 하나가 선택된 이후에는 어떻게 되는걸까?

AND게이트인 x는 단 한 개의 격자에서만 1을 출력할 것이며, 또 그렇게 입력된 데이터가 새로운 입력으로 허락될 때는 s인자가 1로 변할 것이며 s2가 TRUE가 되어 오른쪽에 해당하는 R(레지스터)에 값이 입력될 것이다. 그리고 현재 R(레지스터) 내부에 있는 값의 출력을 원할 때는 e인자가 1로 변할 것이며 자연스럽게 e2가 TRUE가 되어 R의 현재 값이 레지스터를 벗어나 데이터가 흐르고 있는 버스로 흘러들어가게 될 것이다.

 

>> 레지스터 뜯어보기

https://jinn-o.tistory.com/118?category=967431 

 

[논리회로] 레지스터(register) 구조 (바이트 메모리 + 출력 제어기)

바이트 메모리 (Byte Memory) 컴퓨터는 바이트(Byte)단위로 일을 처리한다. 그림에 나와있는 M 은 비트메모리이다. 비트메모리가 8개가 모여서 바이트 메모리가 된다. >> 비트메모리? https://jinn-o.tistory.

jinn-o.tistory.com

 

 

 

결론

그래서 256바이트인 램의 경우, 257개의 레지스터가 들어있을 것이다. 그 중 256개는 바이트를 저장하는 데에 쓰이고, 나머지 하나는 저장 장치에서 특정한 바이트의 위치를 가리키는데 사용된다. 그것을 MAR(Memory Address Register)라고 부른다. 즉, 지금까지 살펴본 MAR는 컴퓨터의 주소와 같은 것이다. 이 주소를 이용해서 램의 특정한 위치에 들어있는 바이트에 접근할 수 있다.

+ Recent posts