> 이제 컴퓨터를 어떻게 사용할 것인지 고민하자 > 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>