지난 포스팅까지 각 CPU 타입마다 주어진 연산을 어떤 과정과 명령어들로 처리하는지 정리하여보았다. 이번에는 이 각각의 명령어 하나하나를 어떤 과정으로 처리하는지 정리하고자 한다. 1. 명령어 처리 하나의 명령어를 실행하는 과정을 Instruction Cycle 이라고 한다. (실행주기 or 실행과정) 이를 간단하게 수도코드로 표현하면 아래와 같다. pc = 0; // pc => program counter do { instruction = memory[pc++]; // Instruction fetch (명령어 인출) decode(instruction); // Instruction decoding (명령어 해석) fetch(operands); // Operand fetch (피연산자 인출) execute..
3글자의 알파벳으로 이루어진 이름과, 4글자의 숫자로 이루어진 번호 쌍을 저장하는 주소록 프로그램이 있다고 해보자. 이 프로그램에서 이름과 번호쌍을 어떻게 관리할 수 있을까? 대부분의 언어에서 기본으로 제공하는 '배열' 자료구조를 이용하여 구현한다면 아래와 같이 구현할 수 있을 것이다. 1. 두 배열을 이용하여 데이터를 저장하기 첫 번째 방법은 두 배열을 이용해서 이름과 번호를 저장하는 방법이 있다. 이름과 번호를 연결짓는 기준은 '배열의 인덱스' 가 된다. 이렇게 저장한 자료에서 이름을 기준으로 번호를 찾는다고 하면 아래와 같이 코드를 짤 수 있다. #include char name[10][3]; char number[10][4]; char find_name[3]; int main() { printf(..
지난 포스팅에서 CPU Machine 의 타입으로 Stack Machine, Single Register Machine, Multiple Register 이렇게 3가지가 있다고 정리하였다. 이번에는 각 타입마다 (A+B) * (C+D) 의 연산을 어떤 과정으로 수행하는지 자세히 보면서 각 머신의 특징을 정리하고자한다. 1. Stack Machine 스택 머신은 말 그대로, 레지스터 대신 스택을 사용하여 연산을 수행한다. 스택에는 Push, Pop 2가지 연산이 있다. 스택 머신은 어떤 데이터가 필요한지 명시할 필요가 없다는 특징이 있다. add 를 한다고 하면, 그냥 스택에서 pop을 두 번 수행해서 나온 값들을 더하면 된다. 스택 머신에서 (A+B) * (C+D) 연산을 수행하는 과정은 다음과 같다. ..
지난 포스팅에서는 ISA 의 큰 두가지 분류 CISC, RISC의 특징과 RISC에 속하는 SPARC ISA의 멍령어 타입에 대해 정리하였다. 이번에는 컴퓨터 구조를 조금 더 들어가서, 기본적인 CPU가 연산 과정과 CPU Machine Type을 정리하고자 한다. 1. 메모리의 표현 32bit CPU 는 명령어(데이터) 의 사이즈가 32bit = 4byte = 1word 임을 의미한다. 연속된 메모리 공간의 칸을 나눠서 한칸에 1byte 라고 하였을 때 32bit 컴퓨터는 4byte 단위의 데이터를 처리하므로 4칸씩 묶어서 메모리 구조를 생각할 수 있다. => 한칸에 8bit 면 주소값이 8씩 증가하는게 맞지 않나 순간 궁금했는데, 메모리 주소는 '논리적인' 부분이니까 한 칸을 8bit 의 1byte ..
지난 포스팅에서 어셈블리언어는 CPU가 이해할 수 있는 0과 1로 구성된 기계어에 인간이 보기 쉽게 의미를 부여한 언어라고 하였고, ISA 는 CPU 가 다룰 수 있는 명령어 종류 셋으로서, CPU에 종속되어있는 일종의 카탈로그라고 하였다. 그렇다면 ISA마다 명령어 종류가 다르다는 것은 ISA마다 어셈블리언어가 다르다고 봐도 무방할 것이다. ISA는 크게 2가지 종류가 있다. CISC 와 RISC (리스크 라고 읽는다.) CISC (Complex Instruction Set Computer) 는 말 그대로 명령어 종류가 복잡하다. 명령어의 종류가 많아 지난 포스팅에 적었듯 그래서 할 수 있는 기능이 RISC에 비해 많다. 각 종류마다 명령어의 크기가 가변적이다. (1byte ~ 15bytes) 그래서 ..
- What's Assembly Language CPU는 전기 신호를 받아들이는 '회로' 이다. 따라서 CPU로 명령을 전달할 때는 전기 신호로 전달하는데, 이 신호를 전압에 따라 0과 1로 표현할 수 있다. 이 0과 1로 구성된 신호를 '기계어' 라고 한다. 프로그램은 CPU에게 일련의 명령을 내리는데, 사람이 CPU에게 내릴 명령을 작성할 때 0과 1로 구성된 기계어로 명령을 작성하는 것은 매우 어렵다. 따라서 프로그램을 작성하는 사람의 편의를 위해 만들어진 High Level Language 가 C, Python 같은 언어이다. 물론 High Level Language 는 CPU 같은 회로가 이해할 수 있는 형태가 아니기에 이를 변환하는 과정이 필요하고, 이를 '컴파일' 이라고 한다. 컴파일의 과정..
군대를 갔다와서 컴퓨터를 사고나니 플러터 버전이 달라져있어 프로젝트를 처음부터 다시 만들기로 했다. 그래서 새 컴퓨터에서 새 개발환경을 다시 세팅해 기존 소스코드를 참고하여 처음부터 개발을 시작했다. 방학이 끝나고 개강한 뒤 학교 기숙사로 왔다. 데스크탑을 가져올까 하다가 그냥 노트북만 들고왔는데, 노트북에는 플러터 2.0 버전과 구버전의 안드로이드 스튜디오가 깔려 있는 상황 2021년에 처음 이 앱을 개발하던 시기의 개발환경이 세팅되어 있는 상태였다. 안드로이드 스튜디오에서 제공하는 flutter 업데이트 기능을 이용해 flutter를 업데이트하고, chocolate 를 이용해 dart-sdk 도 설치했다. flutter doctor 를 검색해보니 분명 자바가 이미 깔려있는데 java version 을..
집에서 데스크탑으로 작업을 하다가, 학교 기숙사에 오면서 노트북으로 작업을 하려고 하는 상황이었다. 노트북에는 구버전 안드로이드 스튜디오와 플러터 2.x 버전이 깔려있었다. 플러터를 3.x 버전으로 업데이트하고 실행을 하기 전 flutter doctor 를 실행시켰는데 이런 오류가 나왔다. [√] Flutter (Channel stable, 2.5.3, on Microsoft Windows [Version 10.0.19042.1348], locale en-IN) [!] Android toolchain - develop for Android devices (Android SDK version 31.0.0) X Could not determine java version [√] Chrome - develop ..
https://www.acmicpc.net/problem/28458 28458번: Mahjong Tenpai 3통을 가져왔을 경우 3삭 2개를 머리로 사용한 후 3삭 4삭 5삭의 슌쯔를 몸통1, 3삭 4삭 5삭의 슌쯔를 몸통3, 1통 2통 3통의 슌쯔를 몸통3, 3통 3통 3통의 커쯔를 몸통4로 볼 수 있다. 6삭을 가져왔을 경 www.acmicpc.net 주어진 마작패가 대기패인지 아닌지 판별하고 대기패라면 완성패가 되기 위해 추가해야 하는 패를 출력하는 문제이다. 일단 대기패의 구성 숫자가 13장이고, 완성패의 구성숫자가 14장으로 크지 않고 패의 종류도 많지 않아서 브루트포스를 돌리면 되겠다고 생각했다. 그래서 34종류의 모든 패를 하나씩 대기패에 추가해보고 그렇게 구성한 패가 완성패인지 아닌지 판..
https://www.acmicpc.net/problem/28457 28457번: Every? Only One's Marble 첫 번째 줄에는 보드의 크기 $n$, 시작 시 가지는 돈 $S$, 시작점을 지나면 받게 되는 월급 $W$, 황금 열쇠 카드의 개수 $G$가 주어진다. ($3\leq n\leq 10$, $1\leq G\leq 4n-8$, $1\leq S,W\leq 10^7$) 그다음 $G$개의 www.acmicpc.net 부루마블 게임을 구현하는 문제다. 그래도 플레이어가 1명이라 구현 난이도가 엄청 높진 않다. (플레이어가 여러명인 Yut Nori 같은 문제 구현에 비하면..) 구현할 때 다음과 같은 2가지 사항에 주의해야했다. 1. 보드의 사이즈가 작을 때는 주사위 한번으로 2바퀴를 돌 수도 ..