프로그램이 실행되려면 반드시 '메모리' 에 저장되어 있어야 합니다.
1101
-> 모든 0과 1 뒤집기
0010
-> 1 더하기
0011
-> 각각의 값을 더해서 0이 되는지 확인하기
1101 + 0011 = (1)0000 = 0
- CPU (Central Processing Unit): 중앙처리장치
: 메모리로부터 저장된 명령어와 데이터를 읽으며, 해석 및 실행하는 부품으로 컴퓨터의 두뇌로 여겨진다.
: CPU를 구성하는 부품들로는 ALU(산술논리연산장치, Arithmetic Logic Unit), 레지스터, 제어장치가 존재한다.
: 제어장치는 '제어 신호'라는 전기 신호를 내보내어 컴퓨터 부품들의 실행을 관리한다.
- 메모리: 주기억장치
: 메모리는 크게 RAM(Random Access Memory)과 ROM(Read Only Memory)가 존재한다. 평소에 주로 언급되는 메모리는 RAM을 의미한다.
: 명령어와 데이터가 주소의 개념 내에 저장되고, 이를 CPU와 교류하며 프로그램을 실행한다.
: 가격이 비싸 저장 용량이 적고, 전원이 끊기면 저장된 내용을 잃는 휘발성을 가진다는 특징이 있다.
- 보조기억장치
: 메모리보다 저장용량이 크고, 전원이 꺼져도 저장된 내용을 잃지 않는 저장 장치이다.
: 메모리가 '현재 실행중'인 프로그램을 저장한다면, 보조기억장치는 '앞으로 보관될' 프로그램을 저장한다.
- 입출력장치
: 마이크, 스피커, 프린터, 마우스 및 키보드와 같이 컴퓨터 외부에 연결되어 컴퓨터 내부와 교류하는 장치이다.
위의 장치들은 메인보드(마더보드)라는 사각형의 판에 설치되고, 메인보드에 내재된 시스템 버스(System Bus)라는 신호 통로를 통해 서로 정보를 교환한다.
- 주소 버스(Address Bus): 주소(of 메모리)를 주고받는 통로.
- 데이터 버스(Data Bus): 실행 중인 프로그램의 명령어와 데이터를 주고받는 통로.
- 제어 버스(Control Bus): 제어 신호를 전달하는 통로.
1Byte = 8bit
1kB = 1000Byte
1MB = 1000kB
1GB = 1000MB
1TB = 1000GB
// 1kB는 1,024Byte이고, 1MB는 1,024kB...등 하위 정보 단위의 양에 대해 위의 내용과 다르게 표현되는 것을 본 적이 있다. 이는 정보의 양을 표현하는 단위를 결정하는 과정에 있어서 어떤 수 표현법을 결정할지에 대한 관점의 차이로 인해 발생하는 것이며, 자세한 정보는 아래의 링크를 첨부한다.
https://thrillfighter.tistory.com/250
십진법(decimal): 우리가 평소 사용하는 수 체계. 0~9 사이의 수를 사용.
2의 보수법(two's complement)
: 이진법으로 음수를 표현하기 위한 방법.
1) 이진법으로 표현된 수에서 모든 0과 1을 각각 1과 0으로 뒤집는다.
2) 그 값에 1을 더한다. 값을 더했을 때 자릿수를 초과한다면 비트를 추가한다.
: 2진법으로 표현했을 때, 이게 양수인지 음수인지 눈으로만 판단했을 때는 구분되지 않는다. 이를 위해 컴퓨터 내부에서는 플래그(flag)라는 상태 정보를 사용한다.
십육진법(hexadecimal)
: 수를 2진법으로 표현했을 때 큰 수는 그 길이가 너무 길어진다는 불편함이 있다. 이를 간단히 표현할 때 사용하는 표현법이다.
: 0~9의 수를 포함하여, 10~15까지 알파벳 A~F를 통해 표현한다.
: 15를 넘어가는 수에서 자릿수를 올림한다.
십육진수와 이진수의 변환
: 십육진법은 한 단위로 16개의 수 정보를 표현할 있으며, 이는 이진법 한 단위의 표현가능 수의 네제곱배를 대신할 수 있다 (2^4 = 16).
: 16진수로 표현된 하나의 자릿수를 이진수 네자리로 변환할 수 있다.
ex) 1A2B(16) = (0001) (1010) (0010) (1011)(2)
: 같은 방식으로, 2진법으로 표현된 네자릿수를 16진법의 한 자릿수로 변환할 수 있다.
컴퓨터는 우리가 코드로 입력하는 알파벳, 단어 그 자체를 데이터와 명령어로 이해하지 못한다. 컴퓨터는 그러한 알파벳과 단어로 이루어진 소스 코드를 0과 1의 비트로 바꾸어 실행한다.
저급 언어(low-level programming language)
: 컴퓨터가 이해할 수 있는 직접적인 정보 단위(언어)인 기계어(machine code)와, 기계어를 최소한 우리가 읽을 수 있게 번역한 언어인 어셈블리어(assembly language)로 존재한다.
고급 언어(high-level programming language)
: 우리가 대부분 코드를 짤 때 사용하는 프로그래밍 언어에 해당한다. 해당 언어로 코드를 짠 후 실행하면 해당 코드 내용이 저급 언어로 번역된 후 명령어로써 실행된다.
: 번역되는 방식에 따라 컴파일(compile) 언어와 인터프리터(interpreter)언어로 구분된다.
: 한 번에 전체를 번역하므로, 하나의 오류만 존재하더라도 코드는 실행되지 않는다.
: 대표적인 컴파일 언어로는 C가 있다.
: 한 줄씩 번역하여 실행하기 때문에 N번째 라인에 오류가 발생하더라도 N-1 번째 라인까지는 실행이 가능하다. 이로 인해 일반적으로 컴파일 언어에 비해 처리 속도가 느리다.
: 대표적인 인터프리터 언어로는 python이 있다.
- 명령어 = 연산 코드 필드 (연산 코드가 담기는 영역) + 오퍼랜드 필드(오퍼랜드가 담기는 영역)
: 데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력 제어 등
: 많은 경우 데이터 그 자체보다는 데이터 저장 위치인 메모리 주소나 레지스터 이름이 오퍼랜드 필드에 담긴다. 이로 인해 오퍼랜드 필드를 주소 필드로 지칭하기도 한다.
: 오퍼랜드는 명령어 내에 하나도 존재하지 않을 수 있고(오퍼랜드 0개), 여러 개일 수도 있다. 이 때 담겨있는 오퍼랜드의 개수(n개, n = 0, 1, 2...)에 따라 명령어를 'n-주소 명령어'라고 칭한다.
: 오퍼랜드에 연산에 직접적으로 사용될 데이터 대신 데이터가 저장된 주소를 대입하는 이유는 '명령어의 길이' 때문이다.
: n비트로 구성된 명령어에서 m비트(n >= m)로 구성된 연산 코드가 존재한다면, k개의 오퍼랜드 필드가 차지하는 영역은 (n-m)비트가 되고, 해당 (n-m)비트를 다시 오퍼랜드의 개수에 따라 1/k배를 해야 한다. 결국 오퍼랜드가 늘어날수록 각 오퍼랜드가 표현할 수 있는 범위는 줄어드는 셈이다.
: 데이터 자체를 표현하는 대신, 데이터가 담겨 있는 위치(유효 주소)를 표현한다면, 더 넓은 범위를 가진 위치 정보를 통해 데이터를 표현할 수 있다.
즉시 주소 지정 방식(immediate addressing mode)
: 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방법
: 표현할 수 있는 데이터의 범위가 줄어들 가능성이 있지만, 다른 방식보다 처리 속도가 빠르다.
직접 주소 지정 방식(direct addressing mode)
: 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방법
: 표현할 수 있는 데이터의 범위는 증가했지만, 유효 주소는 명령어에서 연산 코드의 범위를 제외한 범위만큼만 표현할 수 있다.
: 한 번의 메모리 접근이 필요하다.
간접 주소 지정 방식(indirect addressing mode)
: 오퍼랜드 필드에 유효 주소의 주소를 명시하는 방법
: 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 더 넓어진다.
: 두 번의 메모리 접근으로 인한 시간이 요구된다.
레지스터 주소 지정방식(register addressing mode)
: 오퍼랜드 필드에 데이터를 저장한 레지스터를 명시한다.
: 표현할 수 있는 레지스터의 범위에 제한이 생길 수 있다는 점에서 직접 주소 지정 방식과 비슷하다.
레지스터 간접 주소 지정 방식(register indirect addressing mode)
: 연산에 사용할 데이터를 메모리에 저장하고, 해당 데이터의 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 명시한다.
: 간접 주소 지정 방식과 과정이 비슷하지만, 메모리에 접근하는 횟수가 한 번으로 줄어든다.