2023.08.26 컴퓨터구조
C의 컴파일과정
전처리기 컴파일러 어셈블러 링커의 과정을 거친다.
.c파일로 시작한다.
전처리를 거치면 전처리 결과물이 나온다. .i
본격적으로 컴파일하기전에 처리할 작업들
외부에 선언된 다양한 소스코드 라이브러리 포함
프로그래밍 편의를 위해 작성된 매크로 변환
컴파일할 영역 명시
컴파일과정
전처리가 일어나도 여전히 소스코드이다.
전처리 완료된 소스코드를 접근언어(어셈블리어)로 변환한다.
어셈블과정
어셈블리어를 기계어로 변환한다.
목적 코드를 포함하는 목적파일이된다.
목적파일 vs 실행파일
링커
4. CPU의 작동원리
4.1 ALU와 제어장치
CPU는 ALU 제어장치 레지스터로 이루어져잇다.
ALU는계산하는 장치
제어장치는 제어신호를 발생시키고 명령어를 해석하는 장치
4.1.1 ALU
ALU와 제어장치가 어떤 것을 받아들이고 내보내는지
계산을 하기위해서는 피연산자와 수행할연산이 필요하다.
ALU는 제어장치로부터 제어신호 레지스터로부터 피연산자를 받아들인다.
이 것을 계산하고 결과값을 레지스터로 보낸다.
숫자, 문자, 주소가 될 수 도있다.
레지스터에 저장하는 이유가 뭘까?
CPU가 메모리에 접근하는 속도보다 레지스터에 접근하는게 더빠르기 때문이다.
플래그도 플래그 레지스터로 보내는데 연산결과에 대한 부가정보를 보내게 된다.
양수인지 음수인지 등이 여기에 포함된다. 특수한 레지스터에 저장하게 되는 것이다.
연산결과가 결과를 담을 레지스터에 비해 너무 켜도 플래그에 명시된다.
플래그의 종류도 CPU마다 다르지만 대부분은 공통의 플래그를 가지고 있다.

부호, 오버플로우발생시 발생했는지 등등
이밖에도 ALU내부에는 여러 계산을 위한 회로들이 있다.
덧셈을 위한 가산기 뺄셈을 위한 보수기 시프트 연산을 수행해주는 시프터 오버플로우를 대비한 오버플로우 검출기 등이 있다.
4.1.2 제어장치
cpu의 클럭신호를 받아들인다.
클럭신호는 컴퓨터의 모든 부품을 일사분란하게 움직일수 있게하는 시간단위
박자에 맞춰 움직일 수 있게하는 것
다음으로 해석할 명령어를 명령어 레지스터로부터 받아들인다.
플래그레지스터로부터 플래그도 받아들인다.
명령어를 받아들일때 음수인지 아닌지 그런것도 받아야하기 때문이다.
주변장치도 제어신호를 발생시키기 때문에 이 신호를 인식하기 위해 제어신호도 받아들인다.
제어장치는 제어신호를 내보낸다.
alu와 레지스터에 전달하는 제어신호 메모리와 입출력장치에 전달하는 제어신호가 있다.
cpu내부 외부로 제어신호를 내보낸다.
4.2 레지스터
레지스터란
cpu내부에 있는 임시 저장장치이다.
프로그래머 입장에서는 조금 더 중요하다.
명령어와 데이터가 실행전후로 레지스터에 저장되서 실행되는 원리등을 관찰할 수 있다.
row level사람들은 이 레지스터에 어떤게 담기는지 보는 경우가 많다.
그래서 프로그래머 입장에선 더 중요한 부품이라고 볼 수 있다.
cpu마다 레지스터가 다르고 이름이 다르기도 하지만
반드시 알아야하는 레지스터는 다음과 같다.
1.프로그램카운터
2.명령어레지스터
3.메모리주소 레지스터
4.메모리버퍼 레지스터
5.플래그 레지스터
6.범용 레지스터
7.스택 포인터
8.베이스 레지스터
모두 외울 필요는 없고 설명을 따라가다보면 알게된다고 한다.
4.2.1 프로그램카운터
메모리에서 가져올 명령어의 주소 다음 메모리에서 뭘 읽어들일지를 저장한다.
4.2.2 명령어 레지스터
해석할 명령어 방금 메모리에서 읽어들인 명령어를 저장한다.
4.2.3 메모리주소 레지스터
메모리의 주소를 저장한다. cpu가 주소버스를 사용해야할때 cpu가 메모리로부터 주소를 읽어들이고자하면 이 것을 메모리에 쏴줘야하는데
여기에 저장해둔다.
4.2.4 메모리 버퍼 레지스터
메모리와 주고받을 값 cpu가 정보를 데이터버스로 주고받을때 거치는 레지스터이다.
예를 들어서보자.
메모리안에 실행할 프로그램이 1000번지~1500번지까지 있다고하자.
첫번째 명령어를 실행해보자.
1.프로그램 카운터에 1000번지가 저장된다.
2.이것을 메모리로부터 값을 읽어오기 위해 주소를 메모리주소 레지스터에 1000번지를 담는다. 메모리한테 읽기신호와함께 몇번지 주소를 읽고싶은지를 쏴준다.
3.데이터버스를 통해서 데이터를 메모리 버퍼 레지스터에 저장한다. 이때 프로그램카운터에서는 번지가 증가된다.
4.가져온 데이터를 해석하기 위해서 명령어 레지스터에 저장한다.
이게 진행되면서 프로그램 카운터가 증가함으로써 프로그램이 순차적으로 실행되는 원리가 된다.
물론 프로그램 카운터가 마냥 증가만되는게아니다.
순차적 실행흐름이 끈힉는 경우가 있다.
특정 메모릐 주소로 실행흐름을 이동하는 명령어 실행시(JUMP등)
명령어에 명시된 특정 명령어로 가게된다.
인터럽트가 발생시에도 끊기데 된다.
4.2.5 플래그레지스터
연산결과 또는 CPU상태에 대한 부가적인 정보를 저장한다.
어떤 연산을 하고있는지 알 수 있다.
4.2.6 범용레지스터
다양하고 일반적인 상황에서 자유롭게 사용한다.
주소 명령어 데이터 다 담을 수 있다.
4.2.7 스택포인터 & 베이스 레지스터
특정 특별한 주소 지정에 사용한다.
스택 포인터는 스택주소지정방식에 사용돈다.
스택의 꼭대기를 가리키는 레지스터이다. 스택이 어디까지 차있는지를 표시한다.
스택이 4번지까지 담겨있다면 4번지까지 채워져있음을 스택포인터가 알려주게 되는 것이다.
그럼 스택은 어디에 있나?
메모리안에 스택처럼 쓸수잇는 영역이 이미 있다. -> 운영체제 에서 설명
베이스 레지스터는 변위주소지정방식에 사용한다.
오퍼랜드 필드 값과 특정레지스터의 값을 더하여 유효주소를 얻을 때 사용한다.
이때의 명령어는 어떤 연산할지 레지스터 오퍼랜드로 이루어져있다.
CPU의 종류에따라 사용하는 방식이 다른데 크게 두가지가잇다.
값을 더하는 것, 오퍼랜드와 베이스 레지스터를 더하는 방식이 있다.
상대주소지정방식 오퍼랜드와 프로그램카운터의 값을 더하여 유효주소를 얻는 것이 있다.
다음으로 얻을 명령어의 3번지이전 이런식으로 저장하는 경우도 있다.
베이스레지스터 지정방식은 오퍼랜드와 베이스레ㅐ지스터의 값을 더하여 유효주소를 얻는다.
베이스 200에서 50번지 떨어진 코드 실행하는 것이 담긴다.
기준으로부터 얼마나 떨어져있는지가 저장되는 것이다.
6장에서 주소변환의 빌드업이니 간단하게 이해하고 넘어가자.
실제주소와 CPU가 인식하는 주소는 다르다.
2023.08.26
오버클럭 이런말을 많이 들어봣지만
클럭이 시계라고 하는 것은 처음 알게 되었다.
재밌는 상식이다.