정수(integers)와 부동소수점(floating point) 를 다루는 ALU 에 연산과정에 대해 알아보겠습니다.
교수님이 교재 PPT 저작권 문제에 대해 알려주셔서 이제 직접 그래야할거 같네요! (똥손의 눈물)
어쨌든 한 번 가보겠습니다.
-정수 표현법
1. 바이너리 표현법 : 이진수입니다. 41 = 00101001
2. Sign-Magnitude : 부호와 절댓값입니다.
3. Two's complement : 2의보수 입니다.
-SignMagnitude(부호와 절댓값)
왼쪽 비트가 '부호비트'입니다.
0은 양수를 의미하고
1은 음수를 의미합니다.
+18 = 00010010
-18 = 10010010
문제
- +,- 연산인지 -,-연산인지 구분을 해주어야합니다.
- 0의 표현이 00000000과 10000000 으로 두가지가 나옵니다. (+0 과 -0)
이는 비효율적입니다.
-Two's complement(2의 보수법)
N의 보수란 '두수의 합이 N이 되게 하는 수'를 의미합니다. 10진수에서 4의 10의 보수는 6이고 1의 10의 보수는 9입니다. 이는 컴퓨터에서 음의 정수 계산을 위해 고안되었습니다.
-> 1의 보수는 각 자릿값이 모두 1인 수에서 주어진 2진수를 빼면 얻을 수 있습니다.
-> 2의 보수는 1의 보수에서 1을 더해주면 됩니다.
ex)
+3 = 00000011
+2 = 00000010
+1 = 00000001
+0 = 00000000
-1 = 111111111 (+1의 값에서 0과 1을 반전시키고 +1을 해준 값)
-2 = 111111110
-3 = 111111101
2의 보수의 장점
- 0의 표현법이 하나입니다.
- 연산을 수행하기 쉽습니다.(밑에 나옴)
- 부정을 보이기 쉽습니다.
ex) 부정의 특별한 케이스1
0 = 00000000
Bitwise not 11111111 (1의 보수 취하기)
Add 1 to LSB +1
Result 100000000
오버플로우 발생 1 무시됨
즉 0의 부정은 0
ex) 부정의 특별한 케이스2
-128 = 10000000
Bitwise not 01111111
Add 1 to LSB +1
Result 10000000
128이 아니라 -128이 나옵니다. 잘못된 걸까요? 아닙니다. 애초부터 표현할 수 있는 최대 양수가 127이었기 때문에 맞는 계산입니다.
2의 보수로 나타낼 수 있는 수의 범위는 n비트 -2^n ~ 2^n - 1 까지입니다. 음수를 한 개 더 표현할 수 있습니다.
그리고 비트 확장을 시킬때는 왼쪽 수(MSB)를 확장 비트 수만큼 늘려주면 됩니다.
그럼 Addition and Subtraction에 대해 알아보겠습니다. 사실 뺄셈은 덧셈과 동일 합니다. A - B = A + (-B) 이기 때문입니다.
뺄셈기는 존재하지 않고 Complementer 로 B -> -B 로 만들어줌을 알 수 있습니다.
다음은 덧셈보다 조금 더 복잡한 Multiplication에 대해 알아보겠습니다. 사실 이 부분이 오늘의 핵심입니다.
곱셈은 partial products를 더함으로서 진행됩니다. parial products 는 부분 곱셈 값을 의미하는 데
1011 -> Multiplicand(곱하기를 당하는 수 = 피승수)
x1101 -> Multiplier( 곱하는 수 = 승수)
-----------
1011 Partial products 들
0000
-----------
1011
1011
-----------
10001111
n x n 비트 계산 결과값은 2n비트가 필요합니다.
다음은 곱셈에 대한 block diagram 입니다.
M : Multiplicand
A : Partial Product
Q : Multiplier
C : Carry
입니다.
보면 Shift and Add Control Logic이 Multiplier 의 하위비트를 확인하고 Add의 여부를 결정하게 됩니다.
실행 예시입니다.
1.하위비트를 본다.
2-1. 1이면 A = A + M 후 Shift
2-2. 0이면 Add 없이 Shift
3.Carry의 수를 A에 넣어준다.
Multiplicand 의 값은 유지가 됩니다. 하지만 Multiplier는 연산후 사라져버립니다. 이를 보면 매우 효율적인 연산 방식임을 알 수 있습니다.
음수의 곱셈은 이러한 방식으로 진행하면 안되고 Case 를 분류해주거나 'Booth's algorithm'을 이용해야합니다.
Booth's Algorithm
Q 와 Q-1 에 따라 다음 연산이 달라집니다.
여기서 Q-1 의 초기값은 0 이고 Q0 에 따라 다음 값이 결정됩니다.
Q0 | Q-1 | Q-1 - Q0 | operations |
0 | 0 | 0 | No operations |
1 | 0 | -1 | Subtract M from partial product |
1 | 1 | 0 | No operations |
0 | 1 | 1 | Add M from partial product |
7 x 3 예시 입니다.
A | Q | Q-1 | M | |
0000 | 0011 | 0 | 0111 | Initial Values |
1001 | 0011 | 0 | 0111 | A <- A - M |
1100 | 1001 | 1 | 0111 | Shift |
1110 | 0100 | 1 | 0111 | Shift |
0101 | 0100 | 1 | 0111 | A <- A - M |
0010 | 1010 | 0 | 0111 | Shift |
0001 | 0101 | 0 | 0111 | Shift |
나눗셈도 하고 싶지만 교수님이 학부생 수준을 벗어난다고 하지 않으셨습니다...
그럼 오늘은 여기까지! 수고많으셨습니다.
'공부 > 컴퓨터 구조' 카테고리의 다른 글
컴퓨터구조5 Internal Memory (0) | 2020.06.12 |
---|---|
컴퓨터구조4 Cache Memory (0) | 2020.06.05 |
컴퓨터구조3 CPU (0) | 2020.05.29 |
컴퓨터구조2 Process (0) | 2020.05.27 |
컴퓨터 구조1 개요 (0) | 2020.05.26 |