지난 글에서는 산술 연산과 그 결과에 따라 발생하는 Condition Code 의 종류에 대해 정리하였다. 산술 연산에 대표적으로 add 와 sub 가 있는데, 명령어에 cc 옵션(?)을 붙인 addcc, subcc 명령어는 연산 후 condition code를 반환한다. Condition Code에는 Z, N, V, C 4가지가 있었으며, Z는 연산 결과가 0인지 판별하고, N 은 연산 결과가 음수인지 판별한다. V는 오버플로우 여부를 판별하고, C는 캐리를 반환한다. 이번 글에서는 4가지 코드 중 V 와 C 에 대해 조금 더 자세하게 정리해보고자 한다. 그리고 이를 위해 먼저 Unsigned Integer 와 Signed Integer 에 대해 정리해보겠다. Unsigned Integer / Sign..
지난 글에서는 SPARC 언어에서 사용하는 메모리의 종류 Static, Heap, Stack 에 대하여 알아보았다. 전역 변수의 값은 Static 영역, 지역 변수의 값은 Stack 영역, 동적 할당 시에는 Heap 메모리 영역에 데이터가 저장되었다. 그 중 Stack을 자세하게 알아보았는데, Stack은 높은 메모리주소부터 감소하면서 할당되었다. (어셈블리 기준 직접 할당) 할당 명령어는 save, 반환 명령어는 restore 이었고, save 명령어를 통해 stack 과 32byte register 공간도 같이 할당 받았다. 스택의 할당시에는 스택 포인터를 이용해 할당 위치를 알 수 있었다. 이번 글에서는 산술 연산과 Condition Code에 대해 간단하게 살펴보고자 한다. 산술연산 C언어에서 사..
멀응수 전공과목을 아직 다 듣지는 않았지만, 배우다보니 점점 멀응수가 어떤 과목인지 알아가고 있다. 지금까지 공부하면서 이해한 멀응수는 정말 말 그대로 '응용수학' 이었다. 특히 '멀티미디어' 분야에 응용이 되기 좋다는 느낌이다. 멀티미디어 분야라고 한다면 게임 그래픽, 카메라 이미지 처리와 같은 곳에서 쓰이는 느낌이다. 그래서 보통 '빛' 을 다루곤 한다. 빛은 직진하다가 어떤 물체에 닿고, 그 빛이 다시 반사되거나 꺾인다. 우리가 카메라로 물체를 보고, 게임에서 그래픽 처리를 하는 과정도 이 '빛' 을 수학적으로 처리하여 얻게 된다. 한 줄기 빛을 '벡터'로 하여 어떤 물체로 뻗어 나갈 때 그 빛이 물체에 닿는지 아니면 물체에 닿고 반사되었을 때 어디로 반사되는 지 등을 계산할 수 있다. 이를 위해 ..
지난 포스팅에서는 배열을 이용한 큐를 구현해보았다. front, back 변수를 모두 0으로 초기화 하였을 때, push: back 변수가 가리키는 인덱스에 데이터 추가, back >= size 이면 오버플로우 pop: front 변수가 가리키는 인덱스의 데이터를 제거, front >= back 이면 언더플로우 와 같이 구현할 수 있었다. 그러나 이렇게 구현하면 push 를 최대 N번, pop은 push 횟수 이하로만 할 수 있다는 문제가 있었다. 이번에는 Size N 이라는 메모리 공간에 중간중간 여유가 생긴다면 그 여유공간까지 활용하여 push 를 더 많이 할 수 있도록 기존의 큐를 개선하여 보겠다. 그림과 같이 사이즈 5인 큐에 모든 값이 다 들어있는 상황을 생각해보자. 현재 front 는 2이고,..
지난 포스팅에서는 어셈블리 언어의 명령어 타입 3가지를 정리해보았다. 의사 명령어 / 기계 명렁어 / 합성 명령어 이렇게 3가지 종류의 명령어가 있었으며, 의사 명령어 = 기계어 번역 x, 어셈블러에게 추가 정보 전달 기계 명령어 = 기계어로 1:1 번역 합성 명령어 = 기계 명령어 형태로 바뀐 뒤 기계어로 번역 이렇게 정리할 수 있었다. 이번에는 SPARC에서 사용하는 메모리 종류에 대해 정리해보겠다. 프로그램에서 사용하는 메모리의 종류 프로그램에서 사용하는 변수는 크게 3가지가 있다. 1. 전역 변수 (Global Variable) 2. 지역 변수 (Local Variable) 3. 동적 할당 변수 (Heap) 전역 변수는 말 그대로 global 한 범위에서 사용이 가능한 변수이다. 전역 변수는 전역..
https://www.acmicpc.net/problem/9370 9370번: 미확인 도착지 (취익)B100 요원, 요란한 옷차림을 한 서커스 예술가 한 쌍이 한 도시의 거리들을 이동하고 있다. 너의 임무는 그들이 어디로 가고 있는지 알아내는 것이다. 우리가 알아낸 것은 그들이 s지점에서 www.acmicpc.net 한 노드에 대한 최단 경로에 특정 경로가 포함되어 있는지를 확인하는 문제이다. 아이디어는 어렵지 않은데, 구현이 복잡하다. 나는 처음에 다익스트라를 한번 돌리면서, 그 과정에 간선이 포함되는지를 체크하려고 하였다. 그런데 최단경로가 여러개인 경우, 간선이 포함된 최단 경로를 먼저 고르는 것을 구현하기가 어려워서 이 방법은 포기했다. (나중에 난이도 기여 내역을 보니 이렇게 푼 사람도 있었다...
이번에는 큐를 배열을 통해 구현하는 과정을 정리하고자 한다. 구현에 앞서 '큐'의 개념을 살펴보자. 큐의 개념 이번에도 구글 번역기로한번 번역부터 해 보았다. 이번에는 번역기가 번역을 해준다! 번역의 결과가 큐를 말 그대로 설명해주고 있다. 큐는 '대기줄' 이다. 대기줄의 특성을 생각해보자. 식당에 (학교에서는 교수님이 '하카타분코' 라는 라멘집을 예시로 들어주신다 ㅋㅋ) 손님이 많아서 대기줄이 길게 있다고 할 때, 신규로 오는 손님은 대기줄의 '뒤'에 서게 되고, (push) 식당에 빈자리가 생기면 대기줄 맨 앞에 있던 사람이 들어가게 된다. (pop) 큐는 이를 그대로 표방하는 자료구조이다. 먼저 들어왔던 데이터가 먼저 나가는 First In First Out (FIFO) 방식의 자료구조이다. 큐는 ..
지난 포스팅에서는 SPARC 에서 사용하는 레지스터의 종류 4가지와, 레지스터 윈도우에 대하여 정리하였다. 이번에는 어셈블리 언어 프로그래밍의 기본 문법과 어셈블리 언어 명령어의 분류를 정리한다. 어셈블리 언어 기본 문법 - 각 줄의 코드는 명령어 또는 데이터 정의이다. - 매 줄 끝마다 세미콜론은 사용하지 않는다. - 콜론(:) 으로 끝나는 문자열을 '레이블' 이라고 한다. 이는 프로그램의 지표가 된다. - /* */ 를 를 이용해 다중 라인 주석을 적거나 ! 을 이용해 한 줄 주석을 적을 수 있다. - 어셈블리 언어의 명령어는 크게 3가지로 나뉜다. 1. Pseudo-operation (의사 명령어) 2. Synthetic instruction (합성 명령어) 3. Machine instruction..
군대에서 HTML/CSS/JS 공부용으로 시작한 프로젝트를 이어서 계속 해보고자 한다. 이번에는 노래 재생 기능을 추가해보았다. 노래 재생은 다음과 같이 간단한 과정으로 이루어진다. 1. 노래 리스트에서 노래 클릭 2. 해당 노래 정보를 플레이어에 표시 3. 노래 음원 재생 내가 노래 재생 기능을 구현하는 과정에서 고민한 부분을 기록하고자 한다. 1. 노래 리스트에서 노래 클릭 이 부분의 구현은 어렵지 않다. 노래 리스트를 생성할 때, 해당 요소에 click 이벤트 리스너를 추가해주면 되기 때문이다. 2. 해당 노래 정보를 플레이어에 표시 노래 정보를 플레이어에 표시할 때, 처음 생각한 아이디어는 아래와 같았다. 노래를 클릭하면 >> 해당 노래 정보를 '현재 재생중인 노래 정보' 로서 전역적으로 저장하고..
지난 포스팅에서는 SPARC 라는 ISA의 특징과 SPARC가 사용하는 레지스터의 종류에 대해 정리하였다. 이번에는 SPARC 만의 특징인 Register Window 와 일반적으로 어셈블리 언어에서 사용하는 명령어의 포맷을 정리하고자 한다. 1. Register Window 레지스터 윈도우는 알고리즘 기법 중 하나인 Sliding Window 와 유사한 느낌이다. Sliding Window 는 보통 덱을 활용해 정해진 메모리 크기 안에서 데이터를 넣고 빼면서 마치 창문을 옆으로 옮기듯이 메모리 사용 공간을 옆으로 옮겨가며 사용함으로서 전체 메모리 사용량을 줄이는 메모리 최적화 기법이다. SPRAC도 유사하게, 한번에 32byte 라는 레지스터만을 사용 가능한데 이 32byte 라는 레지스터 공간을 전체..