> 이제 컴퓨터를 어떻게 사용할 것인지 고민하자
> program = a sequential set of instructions
<br>
## 컴퓨터의 동작
- 컴퓨터란
- 데이터를 저장하고 검색하고 처리할 수 있는 **programmable**한 전자 장치
- 데이터를 처리하기 위한 명령어는 데이터와 함께 저장하고 같은 방식으로 다룰 수 있음
- 컴퓨터가 데이터에 대해 수행하는 일을 변경하려면, 우리가 명령어를 변경해야 함
<br>
## 기계어(machine code)
- **컴퓨터가 실제로 수행할 수 있는 (유일한) 프로그래밍 명령어**
- 컴퓨터 명령어의 표현 : 명령어의 수는 유한하기 때문에 단순히 명령어들의 목록을 만들어 명령어 각각을 의마하는 binary code를 할당함
- 각 기계어 명령어는 하나의 매우 low-level의 작업만을 수행함
- 사칙연산, 저장, 읽기, 삭제 등
- 2개의 수를 더하는 작업조차도 더 작은 단계로 나눠서 수행함 (레지스터에 숫자 입력, 레지스터에 숫자 더하기, 결과 저장)
- 요즘은 high-level 언어를 사용함
- 이조차도 결국에는 기계어로 번역한 후 실행됨
<br>
#### Pep/8 : 가상 컴퓨터
- 기계어는 기계마다 다르기 때문에 기계어를 이해하기 위해 실제 기계의 중요한 속성들을 기반으로 설계한 가상 컴퓨터를 활용할 수 있음
- 스펙
- Pep/8은 39개의 기계어 명령어가 있음
- 메모리 유닛은 65,536(2^16)개의 공간이 있음 (0x0000 ~ 0xFFFF)
- word 길이는 2bytes (16bits)
- ALU에 입출력되는 정보의 길이가 16비트
- 레지스터 7개 중 중요한 3개
- PC : program counter, 다음에 실행할 명령어의 주소 저장
- IR : instruction register, 현재 실행할 명령어 저장
- A : accumulator, 연산의 결과나 데이터를 저장하는 레지스터
<br>![[Pep8's_architecture.png]]
- **명령어 형식(Instruction Format)**
- 명령어 = 8-bit instruction specifier(명령어 지정자) + 16-bit operand specifier(피연산자 지정자)
→ 명령어는 operand 유무에 따라 1바이트 혹은 3바이트 길이임
- **instruction specifier의 형식**
- operation code (opcodes) specifier: 4-bits to 8-bits 길이
- register specifier (5섯번째비트): 항상 0
- 여기서는 A register 하나만 쓰기 때문에
- addressing mode specifier: 3-bits 길이
- 명령어의 피연산자 부분을 이해하는 방법을 표시하는 부분
- **immediate **addressing mode(i) : 000, 값을 지정하는 방식
- **direct** addressing mode(d) : 001, 주소를 지정하는 방식
<br>![[instruction_specifier.png]]
- **명령어 예시**
<br>![[subset_of_Pep9_instructions.png]]
###### 예시 프로그램 1
"Hello"를 화면에 출력하기
![[machine_code_example1.png]]![[machine_code_example1-1.png]]
###### 예시 프로그램 2
AB 바꿔 출력하기
![[machine_code_example2.png]]
<br>
## 어셈블리어 (Assembly Language)
- 어셈블리어는 mnemonic(니모닉) 문자 코드를 각 기계어 명령어에 할당함
→ 프로그래머가 기억하기 훨씬 쉬움
- 어셈블러(assembler)라는 프로그램을 통해 어셈블리어를 기계어로 번역함
- 컴파일러 = high → 기계어
- 인터프리터 = 기계어 생성 없이 실행
![[assembly_language_mnemonics.png]]
<br>
- 어셈블러 지시자(Directives) : 어셈블러에게 주는 명령어
![[assembler_directives.png]]
###### 예시 프로그램 1
세 개의 수를 읽어서 합을 출력하는 프로그램 작성하기
- PC는 0으로 초기화 (0x0000)
- 어셈블리어 실행이 끝나고 IR과 PC의 상태 파악하기
![[assembly_language_example1.png]]
###### 조건문 (Branching)
BR 명령을 통해 PC에 담긴 다음에 실행할 명령어의 주소를 바꿀 수 있음
![[assembly_language_BR.png]]
조건문을 활용해 이전 예제를 변형하기
→ 합이 양수일 경우 화면에 프린트하고 음수일 경우 에러 메시지 표시하기
![[assembly_language_example2.png]]
###### 반복문 (Loop)
지정된 수만큼 특정 코드 구간이 반복됨
루프를 반복할 때마다 반복한 횟수를 기록하고, 반복해야 할 루프의 횟수와 기록된 반복 횟수를 비교함
![[assembly_language_example3_loop.png]]
<br>
## 알고리즘의 표현
- 알고리즘 = 해결을 위한 계획
- 슈도코드 = 알고리즘을 표현하기 위해 설계된 언어
- 실제 컴퓨터에서 동작하는 언어는 아니지만, 이해하기 쉽게 알고리즘을 정리한 언어
- 특별한 문법이 없으나 기본적인 개념들은 존재함
- 변수
- 대입
- 입출력
- 선택
- 반복
<br>
<br>
<br>
<br>