Computer Science 기본 지식/컴퓨터 구조 15

[컴퓨터 구조] 4. 명령어 실행

관련 포스트 2021.01.12 - [Operating System] - [운영체제] 명령어 구조와 사이클 / 인터럽트 / 커널 [운영체제] 명령어 구조와 사이클 / 인터럽트 / 커널 독학사- 운영체제 편을 공부하고 정리한 내용입니다. 명령어 구조 프로세서는 명령어에 따라 레지스터 값(피연산자)을 이용하여 연산을 실행한다. 연산 부호(명령부)와 피연산자들(주소부로)로 narakit.tistory.com 일반적인 명령어 사이클 1. 명령어 인출 Instruction Fetch 주기억장치의 지정된 주소에 저장된 명령어를 명령 레지스터 IR(Instruction Register)로 가져온다. 2. 명령어 해독 Instruction Decode 명령어를 해독하여 실행할 연산 opcode를 알아낸다. 3. 데이터..

[컴퓨터 구조] C++ 링커 동작 방식 확인

링커의 역할 Symbol Resolution 컴파일된 여러 모듈을 모아 각 목적 파일에서 해결되지 않은 심벌의 주소를 결정한다. 내부 목적 파일에서 참조되지 않는다면 외부 목적 파일에서 찾게 된다. 헤더 파일에서 정의된 변수는 컴파일 타임에 결정된다. - 주소가 결정되기 때문에 링커의 심벌 해결이 필요가 없다. // foo.h int a = 10; #include "foo.h" int main() { printf("%d\n", a); // foo.h의 a return 0; } 목적 파일의 외부 링크가 사용되는 경우 1. 클래스의 static 멤버 - can.obj // can.h class Can { public: static int var; }; #include "can.h" // can.cpp int..

[컴퓨터 구조] 3. 컴퓨터 연산

덧셈과 뺄셈 일반적인 이진수의 덧셈과 뺄셈 연산이 적용된다. 오버플로우가 발생하는 경우 표현되는 정수 범위가 최대 양의 범위 혹은 최대 음의 범위가 넘었을 때 오버플로우가 발생 덧셈의 경우 A + B 부호가 같은 두 피연산자를 더했을 때, 음수가 되는 경우 (부호 비트가 바뀌는 경우) 양수와 양수를 더했는데 부호 비트가 1이 되었다. (음수) 음수와 음수를 더했는데 부호 비트가 0이 되었다. (양수) 부호가 다른 두 피연산자를 더한 경우 두 피연산자의 큰 범위보다 넘을 수 없으므로 오버플로우가 발생하지 않는다. ex) 7 + (-5) < |7| : 결과의 크기는 항상 7보다 작다. 뺄셈의 경우 A - B 양수에서 음수를 뺏을 때 혹은 음수에서 양수를 뺏을 때 오버플로우가 발생할 수 있다. 부호가 같은 피..

[컴퓨터 구조] 2. 하드웨어 프로시저 지원 / 프로그램 번역과 실행

프로시저 - 제공되는 인수에 따라 특정 작업을 수행하는 서브 루틴 RISC-V는 프로시저를 호출할 때, 다음 레지스터 할당 관례를 따른다. x10-x17 : 전달할 인수와 결과값을 가지고 있는 인수 레지스터 8개 x1: 호출한 곳으로 되돌아가기 위한 복귀 주소를 가지고 있는 레지스터 1개 x0: 항상 0 으로 유지된다. - 지정된 주소로 분기 Jump and link // 다음 명령어는 지정된 주소로 분기하며 동시에 다음 명령어 주소를 목적지 레지스터 rd에 저장한다. ja1 x1, ProcedureAddress x1에 저장되는 주소는 루틴 종료 후 복귀할 주소가 담긴다. link는 프로시저 종료 후 올바른 주소로 돌아올 수 있도록 연결한다는 의미이다. - 프로시저의 복귀 jalr x0, 0(x1) x1..

[컴퓨터 구조] 1. 명령어

내장 프로그램 - 여러 종류의 데이터와 명령어를 메모리에 숫자로 저장할 수 있는 모든 프로그램 RISC-V: UC 버클리가 개발한 2010년대 이후 컴퓨터 구조 - 컴파일러는 C 프로그램을 RISC-V 어셈블리 언어 명령어로 바꾸는 작업을 한다. 1. 명령어 기초 피연산자 - 64 비트, 더블 워드 크기를 가지는 레지스터에 피연산자가 저장된다. - 레지스터 개수는 32개가 최대이다. --- 예시 f = (g + h) - (i +j); // f, g, h, i, j가 각각 레지스터 x19, x20, x21, 22에 할당되었다면, add x5, x20, x21 // x5에 g + h 결과를 저장한다. add x6, x21, x22 // x6에 i + j 결과를 저장한다. sub x19, x5, x6 // x..