전체 글

개발은 좋은데 뭘로 개발할까
CS/어셈블리

[SPARC] 16. 비트 연산 명령어

지난 글에서는 논리연산 명령어에 대해 정리하였다. 논리 연산 명령어에는 and, or, xor 과 andn orn xnor 이 있었고, 각 명령어마다 cc 를 생성하는 명령어가 따로 있었다. 논리 연산에서 CC 는 N, V 만 사용한다. 합성 명령어로는 not, clr, tst, mov 와 같은 명령어가 있었다. not A = xnor A, %g0, A 로서 특정 비트와 1 의 xor 연산을 통해 0을 1로 1을 0으로 바꾸어 주었다. clr 은 0 과 and 연산을 함으로서 모든 비트를 0으로 초기화 시키고, tst 는 0과 orcc 를 한 값을 %g0 에 저장시키므로서 연산 결과를 버리고 cc 만을 보는 명령어였다. mov A, B 는 or %g0, A, B 연산으로 대체되어 A 를 그대로 B 에 넣..

CS/멀티미디어응용수학

[멀티미디어응용수학] 4. 직선과 평면, 점 사이의 최단 거리

지난 글까지 직선과 평면의 방정식을 내적과 외적을 이용해 구하는 과정을 정리하였다. 이번 글에서는 직선과 점 사이 최단거리, 직선과 직선 사이 최단거리, 점과 평면사이 최단거리를 구하는 방법을 정리한다. (직선과 평면의 경우, 최단거리가 존재하려면 반드시 직선과 평면이 평행해야하는데, 그 경우 직선 위 임의 점에서 평면과 최단거리를 구하면 되기 때문에 점과 평면사이 최단거리를 구하는 것과 같다.) 직선과 점 사이 최단 거리 우선 2차원에서 직선과 점 사이 최단 거리를 구하는 방법을 생각해보자 직선 밖의 점과 직선 사이의 최단 거리는 그 점에서 직선으로 수선의 발을 내렸을 때, 수선의 발과 해당 점 사이의 거리이다. 직선의 방정식을 내적을 이용하여 표현하면, 직선의 법선벡터를 쉽게 구할 수 있다. 이를 이..

CS/어셈블리

[SPARC] 15. 논리 연산 명령어

지난 글까지 산술 명령어를 정리하였다. 산술 명령어 (덧셈 뺄셈, 곱셈, 나눗셈, 나머지) 연산 중, 덧셈과 뺄셈은 기계 명령어로 구현되고, 특히 뺄셈은 2의 보수를 이용하여 덧셈 연산되는 것이 특징이었다. 연산 데이터에는 signed integer 와 unsigned integer 가 있었는데, 덧셈 / 뺄셈시 각 데이터 종류별로 연산 결과에서 나오는 CC의 의미가 달라지게 되었다. unsigned 데이터 연산에서는 Carry 가 중요한 의미를 지녔으며, 덧셈시 오버플로우, 뺄셈시 캐리가 존재한다면 A = B 의미를 지니는 것으로 해석하게 되었다. signed 데이터 연산에서는 oVerflow 와 Negative 코드를 통해 연산 결과의 부호를 알아낼 수 있고, 이를 통해 두 수의..

CS/자료구조

[자료구조 및 프로그래밍] 4. Linked List

지난 글까지 Array 를 이용한 스택과 큐의 구현에 대해 정리하였고, 지난 글에서는 특히 단순하게 구현한 큐에서 메모리를 제대로 활용하지 못하는 문제를 해결하기 위해 Circular Queue 를 구현하는 과정을 소개하였다. 이번 글에서는 Array 와 다른 Linked List 라는 새로운 자료구조를 정리하고자 한다. Linked List Linked List 는 한국어로 번역하면 '연결리스트' 라고 한다. 말 그대로 선으로 연결하여 나타낸 리스트를 의미하는데, 연결 리스트의 특징은 배열과 달리 데이터와 데이터가 메모리의 연속된 공간에 존재하지 않을 수 있다. 대신 연결된 다음 데이터를 나타낼 그 데이터의 주소를 같이 저장함으로서 데이터와 데이터의 연결관계를 나타내는 특징이 있다. 그림과 같이 저장할..

CS/멀티미디어응용수학

[멀티미디어응용수학] 3. 외적과 외적의 응용

지난 글에서는 내적과 내적의 응용 5가지에 대해 정리하였다. 이번 글에서는 외적과 외적의 응용에 대해 정리하고자 한다. 외적 내적때와 마찬가지로, 외적도 정의를 우선 깔고 시작하자. 외적은 a x b 로 표현하며, 이는 크기와 방향이 모두 있는 '벡터' 이다. 외적은 3차원에서만 사용가능하며, 아래와 같이 계산한다. a = (ax, ay, az), b = (bx, by, bz) a x b = (ay*bz - az*by, az*bx - ax*bz, ax*by - ay*bx) 식이 굉장히 복잡하다. 외적은 '방향' 이 존재하는 벡터인데, 외적의 결과 방향은 a와 b에 모두 수직인 방향이다. 이때 수직인 방향이 2개 존재하는데, 오른손을 기준으로 a, b 를 잡을 때 엄지손가락의 방향이 외적의 방향이다. (왼..

CS/어셈블리

[SPARC] 14. 곱셈과 나눗셈 그리고 서브루틴

지난 글에서는 큰 수 덧셈과 뺄셈에 대하여 정리하였다. 간단하게 요약하면 큰 수를 더하고 뺄 때는 cc 명령어를 사용해 캐리를 넘겨주고, x 명령어를 사용해 캐리를 받아 여러 레지스터를 사용해 큰 수를 연산하였다. 이번 글에서는 SPARC 프로세서의 곱셈과 서브루틴에 대해 정리하고자 한다. 곱셈 곱셈은 기본적으로 bitshift 와 덧셈의 조합이다. 예를 들어 101 x 204 를 한다고 해보자. 초등학교 때로 돌아가 어떻게 큰 수의 곱셈을 했는지 따져보면 101 x 4 x 1 101 x 0 x 10 101 x 2 x 100 이렇게 곱셈을 하고 다 더해서 곱셈을 계산했던 기억이 있을 것이다. 컴퓨터도 마찬가지로 이진수에 대해 위와같은 연산을 함으로써 곱셈을 구현한다. 이때 1, 10 100 처럼 1, 2..

CS/멀티미디어응용수학

[멀티미디어응용수학] 2. 내적과 내적의 응용

지난 글에서는 벡터로 표현한 서로 다른 두 직선의 교점을 구하는 방법을 정리하여 보았다. 이번 글에서는 내적의 개념과 내적의 응용 예시들을 정리해보겠다. 내적의 정의 벡터 a = (ax, ay, az), 벡터 b = (bx, by, bz) 라고 할 때, 벡터 a 와 벡터 b 의 내적은 아래와 같다. a · b = ax * bx + ay * by + az * bz 또한 내적의 정의로부터 벡터 a 의 크기와 같은 두 백터를 내적한 값은 같다. 만약 두 백터 a, b의 크기와 두 벡터가 이루는 사이각을 안다면 아래와 같이 구할 수도 있다. a · b = ||a|| * ||b|| * cos(세타) 이 식으로부터 내적은 일종의 '투사' 개념이며, 관점바꾸기에 사용됨을 이해할 수 있다. 벡터 a 를 벡터 b 의 방..

CS/어셈블리

[SPARC] 13. Hardware & 큰 수 연산

지난 글에서는 Unsigned Integer / Signed Integer 연산에 대해 정리하였다. Unsigned 연산에서는 덧셈 뺄셈시 Carry가 중요했다. 만약 덧셈을 했는데 Carry 가 발생했다면 오버플로우가 발생한 것이고, 뺄셈을 했는데 Carry가 발생했다면 빼는 수가 빼지는 수보다 더 큰 것임을 의미했다. (그래서 이것이 subcc 를 비교에 사용하는 이유이다.) Signed 연산에서는 덧셈 뺄셈시 Overflow 가 중요했다. 만약 양수와 양수를 더했는데 음수가 나온 것처럼 N 이 활성화 되었다면 오버플로우가 발생한 것이고, 원래 의도된 계산 값이 양수임을 알 수 있다. 만약 음수와 음수를 더했는데, 양수가 나온 것처럼 N 이 활성화되지 않았다면, 오버플로우가 발생한 것이고, 원래 의도..

CS/멀티미디어응용수학

[멀티미디어응용수학] 1. 직선의 교점 계산

지난 글에서는 벡터와 벡터를 이용한 직선식의 표현에 대해 정리하였다. 이번 글에서는 그렇게 표현한 직선식이 여러개 있을 때, 그 직선들이 서로 만나는 지 판별하고, 만난다면 좌표를 어떻게 구할 수 있는지 그 방법을 정리하고자 한다. 2D 직선의 교점 구하기 우선 간단하게 2D 평면에 존재하는 두 직선의 교점을 구해보자. 2D 평면에서 서로 다른 두 직선은 반드시 서로 평행하거나 교차한다. 우선 두 직선이 서로 평행한 경우를 따져보자 L1: y = 2x + 1 L2: y = 2x + 3 이렇게 두 직선이 있을 때, 두 직선을 parametric 표현으로 바꾸면 아래와 같이 바꿀 수 있다. (과정은 L1만 기록하였다) L1(t): (t, 2t+1) L2(t): (t, 2t+3) 저렇게 표현한 것은 사실 x ..

CS/어셈블리

[SPARC] 12. Unsigned/Signed Integer & Carry / Overflow

지난 글에서는 산술 연산과 그 결과에 따라 발생하는 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..

에버듀
Blog. 에버듀