[Computer Architecture] Ch.3 컴퓨터 산술과 논리연산(1)

2024. 4. 24. 02:55카테고리 없음

목차

3.1 ALU의 구성 요소

3.2 정수의 표현

3.3 논리 연산

3.4 시프트 연산

3.5 정수의 산술 연산

3.6 부동소수점 수의 표현

3.7 부동소수점 산술 연산

 

 

< 3.1 ALU의 구성 요소 >

- 산술 연산장치: 산술 연산들( +, -, ×, ÷ )을 수행

- 논리 연산장치: 논리 연산들(AND, OR, XOR, NOT, TRUE 등)을 수행

- 보수기(complementer): 2진 데이터를 2의 보수로 변환(음수화)

- 시프트 레지스터(shift register): 비트들을 좌측 혹은 우측으로 이동시키는 기능을 가진 레지스터

- 상태 레지스터(status register): 연산 결과의 상태를 나타내는 플래그(flag)들을 저장하는 레지스터(Z,N,C,V)

 

- ALU의 내부 구성 요소들

ALU의 내부 구성 요소들

 

< 3.2 정수의 표현 >

1. 정수의 표현

- 2진수 체계: 0, 1, 부호 및 소수점으로 수를 표현

2진수 체계의 예

- 부호 없는 정수 표현의 예

    00111001 = 57

    00000000 = 0

    00000001 = 1

    10000000 = 128

    111111111 = 255

- n-비트 2진수를 부호 없는 정수 A로 변환하는 방법:

n-비트 2진수를 부호 없는 정수 A로 변환하는 방법

 

2. 소수와 음수의 표현

- 최상위 비트인 a(n-1)의 좌측에 소수점이 있는 소수의 10진수 변환방법

최상위 비트인 a(n-1)의 좌측에 소수점이 있는 소수의 10진수 변환 방
소수의 표현 예

 

- 음수 표현 방법

> 부호화-크기 표현(signed magnitude representation)

> 1의 보수 표현(1's complement representation)

> 2의 보수 표현(2's complement representation)

 

< 3.2.1 부호화-크기 표현 >

- 맨좌측 비트는 부호 비트, 나머지 (n-1)개의 비트들은 수의 크기(magnitude)를 나타내는 표현 방식

[예]

+9  =  0 000 1001          +35  =  0 010 0011

-9   =  1 000 1001          -35   =  1 010 0011

 

- 부호화-크기로 표현된 2진수를 10진수로 변환

*참고: 2진수
부호화-크기로 표현된 2진수를 10진수로 변환하는 방법
예: 부호화-크기로 표현된 2진수를 10진수로 변환

 

- 결점

> 덧셈과 뺄셈을 수행하기 위해서는 부호 비트와 크기를 비교하여 처리하는 복잡한 과정 필요

> 0에 대한 표현이 두 개 존재

          0 000 0000 = +0

          1 000 0000 = - 0

중요

 

 

< 3.2.2 보수 표현 >

1. 보수 표현

- 1의 보수 표현

> 모든 비트들을 반전 ( 0 -> 1, 1 -> 0 )

- 2의 보수 표현

> 모든 비트들을 반전하고, 결과값에 1을 더한다

[예]

+9  =  0 000 1001                             +35  =  0 010 0011

-9   =  1 111 0110 (1의 보수)             -35   =  1 101 1100 (1의 보수)

-9   =  1 111 0111 (2의 보수)             -35   =  1 101 1101 (2의 보수)

 

- 8-비트 2진수로 표현할 수 있는 10진수의 범위

> 1의 보수: -(2^7 - 1) ~ +2^7   = -127 ~ 128

> 2의 보수: -2^7 ~ +(2^7 - 1)           = -128 ~ 127

10진수 1의 보수 2의 보수
127 0 111 1111 0 111 1111
126 0 111 1110 0 111 1110
... ... ...
2 0 000 0010 0 000 0010
1 0 000 0001 0 000 0001
+0 0 000 0000 0 000 0000
-0 1 000 0000 -
-1 1 111 1110 1 111 1111
-2 1 111 1101 1 111 1110
... ... ...
-126 1 000 0001 1 000 0010
-127 1 000 0000 1 000 0001
-128 - 1 000 0000

 

2. 2의 보수 -> 10진수 변환

- 2의 보수로 표현된 양수(an-1 = 0)을 10진수로 변환하는 방법

2의 보수로 표현된 양수를 10진수로 변환하는 방법

- 2의 보수로 표현된 음수(an-1 = 1)을 10진수로 변환하는 방법

2의 보수로 표현된 음수를 10진수로 변환하는 방법

예: 2의 보수표현 음수(a(n-1)=1)을 10진수로 변환

 

 

< 3.2.3 비트 확장 (Bit Extension) >

- 데이터의 길이(비트 수)를 늘리는 방법

> 필요성: 데이터를 더 많은 비트의 레지스터에 저장하거나, 더 긴 데이터와 연산을 수행하기 위해 필요

[예제 3-7]

- 2의 보수 표현의 경우: 확장되는 상위 비트들을 부호 비트와 같은 값으로 세트

- 부호-비트 확장(sign-bit extension)이라 함

[예제3-8]

 

 

< 3.3 논리 연산>

1. 기본적인 논리 연산들

A     B NOT A NOT B A  AND  B A  OR  B A  XOR  B
0     0 1 1 0 0 0
0     1 1 0 0 1 1
1     0 0 1 0 1 1
1     1 0 0 1 1 0

 

2. 논리 연산을 위한 하드웨어 모듈

- 하드웨어의 구성

> 입력 비트들은 모든 논리 게이트들을 통과

> 선택 신호들에 의하여 멀티플렉서의 네 입력들 중의 하나를 출력

 

* Selector가 0,1,2,3을 가리키고 출력할 것을 결정한다

3. N-비트 논리 연산장치

- N-비트 데이터들을 위한 논리 연산장치

> 기본 논리 모듈들을 병렬로 접속

[예] 4-비트 논리 연산장치

 

4. AND 연산  /  OR 연산

- AND 연산: 두 데이터 단어들의 대응되는 비트들 간에 AND 연산 수행

A = 1011 0101

B = 0011 1011

------------------

      0011 0001 (연산 결과)

 

- OR 연산: 두 데이터 단어들의 대응되는 비트들 간에 OR 연산 수행

A = 1001 0101

B = 0011 1011

-------------------

      1011 1111 (연산 결과)

 

5. XOR 연산  /  NOT 연산

- XOR 연산: 두 데이터 단어들의 대응되는 비트들 간에 exclusive-OR 연산을 수행

A = 1001 0101

B = 0011 1011

-------------------

      1010 1110 (연산 결과)

- NOT 연산: 데이터 단어의 모든 비트들을 반전(invert)

A = 1001 0101 (연산 전)

--------------------

      0110 1010 (연산 결과)

 

6. 선택적-세트 연산 / 선택적-보수 연산

- 선택적-세트(selective-set) 연산: B레지스터의 비트들 중에서 1로 세트된 비트들과 같은 위치에 있는 A레지스터의 비트들을 1로 세트 <OR연산 이용>

A = 1001 0010 (연산 전)

B = 0000 1111

--------------------

      1001 1111 (연산 결과)

 

- 선택적-보수(selective-complement) 연산: B레지스터의 비트들 중에서 1로 세트된 비트들에 대응되는 A레지스터의 비트들을 보수로 변환 <XOR연산 이용>

A = 1001 0101 (연산 전)

B = 0000 1111

-------------------

A = 1001 1010 (연산 결과)

 

7. 마스크 연산

- 마스크(mask) 연산: B레지스터의 비트들 중에서 값이 0인 비트들과 같은 위치에 있는 A레지스터의 비트들을 0으로 바꾸는(clear하는) 연산 <AND연산 이용>

> 용도: 단어 내의 원하는 비트들을 선택적으로 clear하는 데 사용

A = 1101 0101 (연산 전)

B = 0000 1111

-------------------

      0000 0101 (연산 결과)

 

8. 삽입 연산(삽입 연산 교재 다시 보기)

- 삽입(insert)연산: 새로운 비트 값들을 데이터 단어내의 특정 위치에 삽입

> 방법

1) 삽입할 비트 위치들에 대하여 마스크(AND) 연산 수행

2) 새로이 삽입할 비트들과 OR연산 수행

[예]

A = 1001 0101

B = 0000 1111 마스크 (AND연산)

-------------------

A = 0000 0101 첫 단계 결과

B = 1110 0000 삽입(OR연산)

-------------------

A = 1110 0101 최종(삽입) 결과

 

9. 비교 연산

- 비교(compare) 연산

> A와 B 레지스터의 내용을 비교 ~> XOR연산

~> 만약 대응되는 비트들의 값이 같으면, A레지스터의 해당 비트를 '0'으로 세트

~> 만약 서로 다르면, A 레지스터의 해당 비트를 '1'로 세트

~> 모든 비트들이 같으면(A = 00000000), Z플래그를 1로 세트

[예]

A = 1101 0101

B = 1001 0110

--------------------

A = 0100 0011 (연산 결과)

 

 

< 3.4 시프트(shift) 연산 >

1. 논리적 시프트(logical shift)

: 레지스터 내의 데이터 비트들을 왼쪽 혹은 오른쪽으로 한 칸씩 이동

- 좌측 시프트(left shift)

> 모든 비트들을 좌측으로 한 칸씩 이동

> 최하위비트(A1)으로는 '0'이 들어오고, 최상위 비트(A4)는 버림

- 우측 시프트(right shift)

> 모든 비트들이 우측으로 한 칸씩 이동

> 최상위 비트(A4)로 '0'이 들어오고, 최하위 비트(A0)은 버림

 

2. 시프트 레지스터(shift register)

- 시프트 기능을 가진 레지스터의 내부 회로

시프트 기능을 가진 레지스터의 내부 회로

 

3. 순환 시프트(circular shift)

: 회전(rotate)라고도 부르며, 최상위 혹은 최하위에 있는 비트를 버리지 않고 반대편 끝에 있는 비트 위치로 이동

- 순환 좌측-시프트(circular shift-left): 최상위 비트인 A4가 최하위 비트 위치인 A1으로 이동

순환 좌측-시프트(circular shift-left)

- 순환 우측-시프트(circular shift-right)

순환 우측-시프트(circular shift-right)

 

4. 직렬 데이터 전송(serial data transfer)

- 시프트 연산을 데이터 비트 수만큼 연속적으로 수행함으로써 두 레지스터들 사이에 한 개의 선을 통하여 전체 데이터를 이동하는 동작

직렬 데이터 전송

[예제 3-18]

예제 3-18: 직렬 데이터 전송

 

5. 산술적 시프트(arithmetic shift): 수(number)를 나타내는 데이터에 대한 시프트

- 방법: 시프트 과정에서 부호 비트는 그대로 유지시키고, 수의 크기를 나타내는 비트들만 시프트

(1) 산술적 좌측-시프트(arithmetic shift-left)

A4(불변), A3<-A2, A2<-A1, A1<-0

(2) 산술적 우측-시프트(arithmetic shift-right)

A4(불변), A4->A3, A3->A2, A2->A1

 

[예제 3-19]

예제 3-19

 

6. C플래그를 포함한 시프트 연산

- C플래그를 포함한 좌측-시프트(SHLC: shift left with carry)

- C플래그를 포함한 우측-시프트(SHRC: shift right with carry)

SHLC연산과 SHRC연산

- RLC(rotate left with carry): C플래그를 포함하는 좌측 순환 시프트(회전) 연산

- RRC(rotate right with carry): C플래그를 포함하는 우측 순환 시프트(회전) 연산

RLC연산과 RRC연산

 

< 3.5 정수의 산술 연산 >

- 기본적인 산술 연산들

기본적인 산술 연산들

 

< 3.5.1 덧셈 >

1. 덧셈

- 2의 보수로 표현된 수들의 덧셈 방법

> 두 수를 더하고, 만약 올림수가 발생하면 버림

[예제3-20]

예제 3-20: 덧셈

 

2. 병렬 가산기(parallel adder)

- 덧셈을 수행하는 하드웨어 모듈

- 비트 수만큼의 전가산기(full-adder)들로 구성

- 덧셈 연산 결과에 따라 해당 조건 플래그들(condition flags)를 세트

> C 플래그: 올림수(carry)

> S 플래그: 부호(sign)

> Z 플래그: 0(zeor)

> V 플래그: 오버플로우(overflow)

 

3. 4-비트 병렬 가산기와 상태 비트 제어회로

4-비트 병렬 가산기와 상태 비트 제어회로

 

4. 덧셈 오버플로우

- 덧셈 결과가 그 범위를 초과하여 결과값이 틀리게 되는 상태

- 검출 방법: 두 올림수(carry)들 간의 XOR를 이용

덧셈 오버플로우 검출식

[예제 3-21]

예제 3-21: 덧셈 오버플로우

 

< 3.5.2 뺄셈 >

1. 뺄셈

- 덧셈을 이용하여 수행(a: 피감수(minuend), B: 감수(subtrahend))

A - (+B) = A + (-B)

A - (-B)  = A + B

[예제 3-22]

예제 3-22: 뺄셈

 

2. 덧셈과 뺄셈 겸용 하드웨어의 블록 구성도

덧셈과 뺄섬 겸용 하드웨어의 블록 구성도

 

3. 4-비트 병렬 가감산기(4-bit parallel adder-subtracter)

- 4-비트 데이터들 간의 덧셈(A+B) 및 뺄셈(A-B)를 모두 수행하는 조합회로

- 제어신호 M=0: 덧셈, M = 1: 뺄셈(입력 B의 비트들을 반전하고, 최하위 올림수로서 M을 입력)

4-비트 병렬 가감산기

 

4. 뺄셈 오버플로우

- 뺄셈 결과가 그 범위를 초과하여 결과값이 틀리게 되는 상태

- 검출 방법: 덧셈과 동일

뺄셈 오버플로우

[예제 3-23]

예제 3-23: 뺄셈 오버플로우

 

< 3.5.3 부호 없는 정수의 곱셈 >

1. 방법

- 각 비트에 대하여 부분 적(partial product) 계산

- 부분 적들을 모두 더하여 최종 결과를 얻음

[예제 3-24]

 

2. 부호 없는 정수 승산기의 하드웨어 구성도

- M 레지스터: 피승수(multiplicand) 저장

- Q 레지스터: 승수(multiplier) 저장

- 두 배 길이의 결과값은 A레지스터와 Q레지스터에 저장

3. 곱셈이 수행되는 과정에서의 레지스터 내용들

4. 2의 보수들 간의 곱셈

- Booth 알고리즘(Booth's algorithm) 사용

- 하드웨어 구성

> 부호 없는 정수 승산기의 하드웨어에 다음 부분을 추가

~> M레지스터와 병렬 가산기 사이에 보수기(complementer) 추가

~> Q레지스터의 우측에 Q-1이라고 부르는 1-비트 레지스터를 추가하고, 출력을 Q0과 함께 제어 회로로 입력

5. Booth 알고리즘의 흐름도

6. Booth 알고리즘을 이용한 곱셈의 예 (-7x3)

 

< 3.5.4 나눗셈 >

1. 나눗셈

- 나눗셈의 수식 표현

A: 피제수(dividend)  /  B: 제수(divisor)  /  q: 몫(quotient)  /  r: 나머지 수(remainder)

 

- 부호 없는 2진 나눗셈

(그림)

 

2. 부호 없는 2진 나눗셈 알고리즘의 흐름도

 

3. 2의 보수 나눗셈 방법