뇌를 자극하는 윈도우즈 시스템 프로그래밍이라는 책과 해당 책의 저자이신 윤성우님의 강의를 통해 공부한 내용을 정리하는 글입니다.
컴퓨터 구조의 접근방법
⦁ 컴퓨터를 디자인하자
⦁ 프로그래머 관점
⦁ 컴퓨터 구조를 잘 아는 프로그래머도 컴퓨터 디자인에 참여
⦁ 컴퓨터 디자인은 레지스터와 명령어 디자인
⦁ 레지스터 디자인의 핵심
⦁ 레지스터는 몇 비트로 구성할 것인가?
⦁ 몇 개 정도로 레지스터를 구성할 것인가?
⦁ 레지스터 각각을 무슨 용도로 사용할 것인가?
위 그림은 공부 목적으로 디자인한 레지스터 구조이다. 16비트 시스템이고, 레지스터의 개수는 8개이다.
r4~r7은 특수 목적 레지스터로 설정했다.
레지스터와 명령어들은 ARM 형식을 참고하였다.
명령어 구조 및 명령어 디자인
레지스터를 디자인 하였으므로 이를 바탕으로 명령어를 디자인해야 한다..
⦁ 명령어의 기본 모델
⦁ 16비트 명령어 : 레지스터를 16비트로 설정했으므로 명령어가 CPU에 fetch 될때 하나의 명령어가 하나의 레지스터에 저장되기 떄문에 명령어도 16비트로 지정해주었다.
⦁ 사칙연산 명령어 구성
사칙연산을 진행하기 위해서는 연산자와 피연산자 둘이 필요하고, 그 결과를 저장하기 위한 피연산자 하나가 필요하다.
가령, 레지스터 r1에 있는 값과 숫자 7을 더해서 레지스터 r2에 저장해야하는 상황에서 이를 하나의 명령어에 담는다면,
하나의 명령어 안에 '덧셈', '레지스터 r1', '레지스터 r2', '숫자 7'의 총 4가지 정보를 담아야 한다.
따라서 아래 그림과 같은 구조로 명령어가 구성된다.
위 그림에서 ADD 연산자 뒤를 잇는 세 개의 비트에는 연산결과를 저장할 저장소 정보를 두고, 항상 연산 결과를 저장하는 레지스터만 와야 한다. 또한, 레지스터가 총 8개이므로, 세 비트만 할당하면 된다.
그 뒤로 4개의 비트와 또 4개의 비트에는 레지스터 정보와 숫자가 올 수 있도록 디자인하였다.
레지스터가 온다면, 그 레지스터 안에 저장된 데이터를 참조한다는 의미이다.
그리고 아래와 같이 연산자를 정의하였다.
⦁ 사칙연산에 대한 심볼과 코드
연산의 의미 | 심볼 | 2진 코드 |
덧셈 | ADD | 001 |
뺄셈 | SUB | 010 |
곱셈 | MUL | 011 |
나눗셈 | DIV | 100 |
각각의 레지스터를 나타내는 2진 코드는 아래와 같이 구성하였다.
⦁ 레지스터에 대한 심볼과 코드
레지스터 심볼 | 2진 코드 |
r0 | 000 |
r1 | 001 |
r2 | 010 |
r3 | 011 |
r4, ir | 100 |
r5, sp | 101 |
r6, lr | 110 |
r7, pc | 111 |
연산의 대상이 되는 피연산자는 숫자가 될 수도 있고, 레지스터가 될 수도 있는데, 저장된 데이터가 숫자인지 레지스터인지 구분하기 위해서 네 개의 비트 중에서 가장 첫번째 비트가 1이면 레지스터 정보를 담고 있는 것이고, 0이면 숫자 정보를 담은 것으로 설정할 것이다.
따라서 1001이면 레지스터 r1을 의미하는 것이고, 0001이면 숫자 1을 의미하는 것이다.
이러한 제약사항을 고려하여 [그림 4-3]의 내용을 2진 코드로 작성하면 아래와 같이 구성된다.
⦁ 어셈블리 언어 기반의 프로그램 구현
ADD r2, r1, 7
⦁ 어셈블러에 의한 바이너리 코드 생성
0000101010010111
이 명령어가 컨트롤 유닛으로 전달되어 해석되면, 컨트롤 유닛은 CPU의 각 모듈에 명령을 내린다.
그리고 CPU의 각 모듈은 이 명령에 따라 적절한 연산을 진행한다.
(다음 실행할 명령어는 레지스터 중에서 ir에 저장된다. )
연산결과는 메인 메모리에 직접 저장하지 않고 레지스터에 저장되어야 한다는 제약사항이 존재하는데, 만약 메모리에 저장하게 된다면 명령어 구조도 복잡해지고 하드웨어 구성도 복잡해진다. 뿐만 아니라 명령어를 처리하는 데 걸리는 시간도 명령어별로 달라질 수 있다.
RISC vs CISC
⦁ CISC(Complex Instruction Set Computer)
⦁ 복잡한 명령어 체계를 가지는 컴퓨터 : 수백 개의 명령어 구성이 가능한 CPU
⦁ 장점 : 수십 줄에 걸쳐서 구현해야 하는 기능을 한 줄로 완성시킬 수 있으며, 필요에 따라 명령어 길이가 유동적이므로 메모리 사용에 효율적이다.
⦁ 단점 : 명령어 수가 많고, 크기가 일정치 않으므로 CPU 구조가 복잡해진다.
⦁ RISC(Reduced Instruction Set Computer)
⦁ CISC 구조 CPU가 지니는 전체 명령어 중에서 주로 사용하는 명령어는 10% 정도밖에 되지 않는데서 착안된 구조. 따라서 명령어를 대폭 줄이고, 길이를 일정하게 디자인하였다. 인텔의 32비트, 64비트 CPU가 해당된다.
⦁ 장점 : 명령어 길이가 동일하고 처리하는 과정도 일정하므로 클럭당 둘 이상의 명령어 처리가 가능하다. (Pipelining)
⦁ 단점 : 단순화를 위해 코드밀도가 감소하여 같은 내용을 처리하는 데 더 많은 코드 용량이 필요하게 된다.
'윈도우즈 시스템 프로그래밍' 카테고리의 다른 글
윈도우즈 시스템 프로그래밍 4장 - Direct 모드와 Indirect 모드 (0) | 2021.07.21 |
---|---|
윈도우즈 시스템 프로그래밍 4장 - LOAD & STORE 명령어 디자인 (0) | 2021.07.21 |
윈도우즈 시스템 프로그래밍 3장 - 프로그램 구현 관점에서의 WIN32 vs WIN64/오류의 확인 (0) | 2021.07.21 |
윈도우즈 시스템 프로그래밍 3장 - WIN32 vs WIN64 (0) | 2021.07.20 |
윈도우즈 시스템 프로그래밍 2장 - MBCS와 WBCS의 동시 지원 (0) | 2021.07.19 |