시작하기 전
이 글은 필자가 수업시간에 들은 내용과 강의록을 토대로 정리한 글입니다.
수업 필기이다 보니, 오류가 있거나 설명이 부족한 부분이 있을 수 있습니다.
궁금하신 점이나 지적하실 점이 있다면 댓글로 달아주세요! 확인 후 내용을 추가하거나 답변해드리도록 하겠습니다 :)
곱셈(Multiplication)
곱셈 하드웨어(Multiplication Hardware)
- 위의 그림의 회로도는 다음과 같은 알고리즘으로 작동한다.
- 전체적으로 보면, 덧셈 연산 후 피승수와 승수를 시프트하는 형태를 띄고 있다.
최적화된 곱셈 연산기(Optimized Multiplier)
- 더하는 과정과 시프트하는 과정을 병렬적으로 수행한다.(동시에 수행한다고 보면 될 것 같다. 모든 것은 한 클럭 기준이다.)
- Product의 우측 32비트에 승수(Multiplier)를 먼저 저장해둔다.
- 그것을 이용하여 피승수를 더하거나, 그러지 않는 연산을 수행한다.
- 그 연산의 결과는 칠해진 왼쪽 32비트에 반영된다.
- 연산이 끝나면 오른쪽으로 한번 시프트한다. 즉, 원래의 하드웨어에서 따로 하던 연산을 한번에 수행하는 것이다.
더 빠른 곱셈 연산기(Faster Multiplier)
MIPS 곱셈(MIPS Multiplication)
-
결과값(Product)은 64비트까지의 값을 가질 수 있다.
-
그런데 MIPS의 레지스터는 기본적으로 32비트이다.
-
따라서, 결과값을 온전히 담아내기 위해 특별한 레지스터 2개를 사용한다.
- HI : 가장 상단의(most-significant) 32비트
- LO : 가장 하단의(least-significant) 32비트
-
명령어들(Instructions)
mult rs, rt
/ multu rs, rt
- rs와 rt의 값을 곱해서 64비트 결과값을 HI와 LO를 사용하여 저장한다.
mfhi rd
/ mflo rd
- HI 혹은 LO의 값을 rd로 옮긴다.
- 32비트의 연산값을 원했을 경우, 오버플로우가 발생했는지 확인해보기 위해 HI의 값을 테스트해볼 수 있다.
mul rd, rs, rt
- 결과값의 가장 하단의(least-significant) 32비트만 rd에 저장한다.
나눗셈(Division)
- 곱셈과 마찬가지로, 우리가 어떻게 나눗셈을 수행하는지 생각해보면 된다.
-
먼저, 제수(Divisor)가 0인지 확인해야 한다.(0으로 나누는 끔찍한 만행을 저질러서는 안된다.)
-
그러고선, 우리가 초등학생 때 배운 나눗셈을 똑같이 수행하면 된다. 2진수라고 쫄 필요가 없다.
- 만약 제수(Divisor) 비트들이 피제수(Dividend)비트들보다 작거나 같으면, 몫에 1을 적고, 빼면 된다.
- 아니면, 몫에 0을 적고, 피제수(Dividend)의 비트를 하나 더 가져온다.
-
복원 나눗셈(Restoring Division)
- 근데 위의 과정을 컴퓨터가 한다고 생각해보자. 컴퓨터가 어떻게 뺄 수 있는지 없는지 알겠는가? 결국 한번 빼 본 후 0보다 작으면 복원하는 식으로 진행하는 수 밖에 없다.
-
음수를 어떤 수로 나누면 어떻게 할래?
- 예를 들어, (10진수에서) -7 / 2를 수행한다고 가정하자.
- 이 경우, Q = -3, R = -1 이 나오거나,
- Q = -4, R = 1 이 나올 수 있다.
- 위의 경우에서, 정답은 Q = -3, R = -1이다.
- 나눗셈에서는 피제수(Dividend)와 나머지(Remainder)의 부호가 같아야만 한다.
복원 나눗셈 예시(Restoring Division Example)
- 위의 나눗셈 과정에서, Skip하는 부분에 빼 본 후, 그것이 음수인 것을 확인하고 복원하는 과정을 추가하면 된다. 그닥 어려울 것이 없다.
- 이 나눗셈에 사용되는 회로는 아래와 같다.
- 나머지(Remainder)가 들어가는 부분에 맨 처음 피제수(Divident)가 들어간다.
나눗셈 하드웨어(Division Hardware)
- 전체적으로 곱하기와 비슷한 모습이다.
- 순서도 : <추가 예정>
최적화된 나눗셈 연산기(Optimized Divider)
- 곱셈 연산기와 비슷, 아니 거의 똑같은 수준이다.
- 차이점은 시프트가 오른쪽 뿐 아니라 왼쪽으로도 이루어진다는 것이다. 이를 통해서 복원 나눗셈이 가능해진다.
MIPS 나눗셈(MIPS Division)
-
곱셈과 마찬가지로 HI와 LO를 사용한다.
-
명령어들(Instructions)
div rs, rt
/ divu rs, rt
- 0으로 나누는 것을 확인하거나 오버플로우를 확인하지 않는다
- 따라서, 만약 필요하다면 소프트웨어가 이를 먼저 확인해야만 한다.
mfhi
와 mflo
를 통해서 결과값에 접근할 수 있다.