[컴퓨터 구조] 컴퓨터의 연산

2020. 6. 12. 18:45컴퓨터 구조

덧셈


컴퓨터의 덧셈은 사람이 덧셈하는 것과 같다

 

LSB에서 MSB 쪽으로 한 비트씩 서로 더하고,

 

올림수가 생긴다면 왼쪽 자리에 더해주는 방식이다.

 

 

뺄셈


뺄셈은 따로 존재하지 않는다.

 

그러므로 덧셈을 이용하여 뺄셈을 수행한다.

 

ex)

a = a - b

a = a + (-b)

 

와 같이 부호를 바꿔 더하는 방식으로 뺄셈을 수행한다.

 

덧셈과 뺄셈을 수행한다면,

 

오버플로우가 발생할 수 있으므로 주의하자.

 

오버플로우(Overflow)


넘쳐 흐른다라는 뜻을 가지고 있다.

 

사칙연산의 결과가 레지스터의 범위를 넘어섰을 때 발생한다,

 

예를 들어

 

32bit의 두 수를 더할 때

 

마지막 31번째 비트에서 올림수가 발생한다면,

 

총 33bit가 된다.

 

이때 오버플로우가 발생했다고 한다.

 

이는 덧셈, 뺄셈 두 가지 모두 발생할 수 있다.

 

덧셈

부호가 다르면 발생하지 않는다.

같은 부호를 더했는데,
다른 부호 값이 나온다면 오버플로우가 발생한 것이다.

ex)

011 + 010 = 101

(양수를 더했지만, 음수가 나왔으므로 오버플로우)


뺄셈

부호가 같으면 발생하지 않는다.

양수 - 음수
or
음수 - 양수

에서 오버플로우가 발생한다.

 

 

2의 보수 표현법(음수, 양수 판별)


MSB의 값(31번째 bit)이

0이면 양수

1이면 음수

 

이다.

 

이렇게 부호를 판단하는 비트를 부호 비트(Sign bit)라고 한다.

 

이렇게 음수와 양수로 나눴다면,

 

음수를 읽는 방법을 알아보자.

 

10001001(음수)

앞에 1을 제외하고 9라고

쓰여있다고 -9라고 읽으면 안 된다.

먼저 모든 비트를 반전시킨다(0은 1로, 1은 0으로)

01110110

반전시킨 비트에 + 1을 해준다.

01110111

-119라고 읽어야 한다.

 

곱셈


맨 처음 설계된 알고리즘은

 

우리가 학교에서 배운 알고리즘과 유사하다.

하드웨어 곱셈 방식

피승수 레지스터의 64비트 중 앞에 32비트는 0으로

뒤에 32비트는 원래 피승수로 채워져 있다.

곱 레지스터는 0으로 채워져 있다.


매 단계마다 피승수를 왼쪽으로

승수를 오른쪽으로

한 자리씩 시프트 시킨다.

만약 승수의 시프트 된 값이 1이라면,

곱에 피승수를 더해준다.

이렇게 32번 수행한다.

제어(control test)는

승수와 피승수를 언제 시프트 시킬지,

언제 피승수와 곱을 더하는 연산을 수행할지

결정한다.


 

Optimized Multiplier


위의 곱셈 하드웨어에서 좀 더 발전된 형태

Product
앞 32비트와 뒤 32비트를 나누었다.


HI

앞 32 bit 피승수와 덧셈 연산을 하는 곳
초기에는 0으로 채워져 있다.

LO
뒤 32 bit 초기에 승수로 채워져 있다.

product값을 오른쪽으로 시프트 한다.

시프트 된 값이 1이라면,

HI에 피승수를 더해준다.

최종적으로 32번 시프트가 끝나면 연산이 끝나게 된다.

 

나눗셈


나눗셈은 고려해야 할 것이 많다

0으로 나눌 수는 없기 때문에 제수가 0인지 확인해야 한다.

제수가 피제수보다 큰지를 확인해야 한다.

크다면
피제수 - 제수를 수행하고,
몫에 1 bit를 주어야 한다.

작다면
몫에 0 bit를 주어야 한다.

그러나 기계는 이것을 식별할 방법이 없다.

그러므로 일단 무조건 빼기를 수행하고,

만약 피제수가 음수가 됐다면,
몫에 0 bit를 주고,
다시 제수를 더해주는 방식을 취하게 된다.

 

Optimized Multiplier


Product
앞 32비트와 뒤 32비트를 나누었다.


HI

앞 32 bit 제수와 뺄셈 연산을 하는 곳
뺄셈 후 이곳이 음수라면,

시프트 값을 0으로 바꾸고,
다시 제수를 더해준다.
초기에는 0으로 채워져 있다.
연산이 끝난 후 이곳에 채워진 값은
나머지이다.

LO
뒤 32 bit 초기에 피제수로 채워져 있다.
왼쪽으로 시프트를 수행한다.
HI에서의 연산 결과에 따라
오른쪽부터 1 or 0 이 채워진다.
연산이 끝난 후 이곳에 채워진 값은
이다.


최종적으로 32번 시프트가 끝나면 연산이 끝나게 된다.