본문 바로가기
Major Review (학부)/Computer Architecture

3. 컴퓨터 산술과 논리 연산 (2)

by 삼준 2023. 2. 26.
반응형

- Read Me는 읽어보셨나요? -

2023.02.17 - [HakBu Review (학부)/Computer Architecture] - Read Me

 

시프트 연산

 

- 논리적 시프트(Logical Shift)

레지스터 내의 데이터 비트들을 한 방향으로 한 칸씩 이동시키는 것을 말함.

좌측 시프트 : 비트들이 왼쪽으로 한 칸씩 이동되고 맨 우측 비트로 0이 들어옴. 맨 좌측 비트는 버림. 결과값이 원래값에 2를 곱한 것과 같음.

우측 시프트 : 비트들이 오른쪽으로 한 칸씩 이동되고 맨 좌측 비트로 0이 들어옴. 맨 우측 비트는 버림. 결과값이 원래값에 2를 나눈 것과 같음.

 

- 순환 시프트(Circular Shift, Rotate)

논리적 시프트와 근본적으로 같지만, 기존에 버려졌던 비트가 반대편 끝에 있는 비트 위치로 들어가는 것이 다름. 이를 이용하여 두 레지스터들 간에 직렬 데이터 전송이 가능해짐.

직렬 데이터 전송 : 시프트 연산을 데이터 수만큼 연속적으로 수행함으로써 두 제리스터들 사이에 한 개의 선을 통하여 전체 데이터를 이동시키기 위한 것. 

 

- 산술적 시프트(Arithmetic Shift)

부호 비트를 고려하여 수행되는 시프트. 부호 비트는 그대로 두고, 수의 크기를 나타내는 비트들만 시프트가 됨.

ex) 1110 --좌측--> 1100 --좌측--> 1000 --우측--> 1100 --우측--> 1110

 

- C플래그를 포함한 시프트

실제 CPU에서는 C(Carry:올림수)플래그가 포함됨. C플래그를 포함한 좌측-시프트(SHLC : Shift Left with Carry) 연산에서는 최상위 비트가 버려지지 않고 C플래그로 이동됨. 기존의 C플래그가 지워짐. SHRC에서는 C플래그가 최상위 비트로 이동하고 최하위 비트가 버려짐. RLC(Rotate Left with Carry)연산인 경우 C플래그가 지워지지 않고 최하위 비트로 들어오며, RRC인 경우 최하위 비트가 C플래그로 들어가게 됨.

산술적 시프트 연산에서 C플래그가 포함되는 경우 논리적 시프트연산과 동일하지만, 우측시프트시 C플래그의 값이 포함되고 원래 부호 비트 값과 다른 경우, 오버플로우 플래그(V)를 세트함으로써 알리거나, C플래그가 레지스터로 못들어오게 하여 부호 비트가 그대로 유지되도록 해야함.

 

정수의 산술 연산

 

- 덧셈

2의 보수로 표현된 수들의 덧셈인 경우, 두 수를 더하고, 올림수(Carry)가 발생하면 버리면 됨. 이러한 덧셈을 수행하는 하드웨어는 병렬 가산기라고 함. (병렬 가산기는 데이터 비트 수만큼의 전가산기들로 구성됨.) 

덧셈의 과정에서 수의 표현 범위를 초과하는 경우 틀린 결과를 산출하게 됨. 이를 오버플로우(Overflow)라고 함. 오버플로우는 최상위 비트들과 그 다음 비트들의 덧셈시 발생하는 올림수가 다른 경우 발생하기 때문에, XOR연산을 수행해 검출할 수 있음.

 

- 뺄셈

A-B인 경우, B를 음수화(2의 보수화)한 다음 A에 더하면 됨. 덧셈과 마찬가지로 올림수는 버림. 덧셈을 이용하여 수행되기 때문에 뺄셈을 위한 회로는 없고 가산기를 이용해 수행됨.

 

- 곱셈

 ㄴ 부호 없는 정수들의 곱셈

10진수 곱셈 계산과 동일함. 승수(multiplier)의 각 비트에 대하여 한 자리씩 좌측으로 시프트되면서 발생되는 부분 적(partial products)들을 모두 더하면 최종 결과가 산출됨. 결과값의 길이는 최대 2n 비트가 됨.

하드웨어 구성)

출처 : 컴퓨터구조론(개정5판) (생능출판)

C, A, Q 레지스터가 직렬로 연결되어 시프트되면서 연산이 이루어짐. 제어회로에 의해 피승수(multiplicand)만큼 더할지, 0을 더할지 결정됨.

 ㄴ Booth 알고리즘

앞선 곱셈 매커니즘에 보수기와 1비트 레지스터(Q_(-1)) 한 개가 추가됨.

제어회로는 Q_(0)와 Q_(-1)을 동시에 검사함. 두 비트의 값이 서로 같으면 모든 비트들을 우측으로 한 비트씩 시프트하지만, '01'인 경우에는 피승수를 A에 더하고 '10'일 경우에는 A에서 피승수를 뺀 후, A,Q,Q_(-1) 레지스터들에 대해 한 비트씩 산술적 우측-시프트를 수행함. 이러한 과정은 승수의 비트 수 만큼 반복됨.

 

- 나눗셈

곱셈과 마찬가지로 반복적인 시프트와 덧셈,뺄셈으로 이루어짐.

※ 이하 내용은 요약할 시 이해를 할 수 없다고 판단되어 불가피하게 책의 내용을 그대로 옮겼습니다.

 ㄴ 부호 없는 정수들의 나눗셈

피제수(dividend)의 비트들을 좌측에서부터 우측으로 차례대로 검사하여, 그 비트들이 나타내는 값이 제수보다 같거나 큰 경우가 될때까지 한 비트씩 이동하면서 검사를 반복함. 그렇게 될 때까지 몫은 0으로 채우며, 나눌 수 있게 되면 몫에 1을 채우고 부분 피제수(partial dividend)의 값에서 제수를 뺌. 그 결과를 부분 나머지 수(partial remainder)라고 함.

여기서부터 나눗셈은 사이클 형태를 이룸. 각 사이클에서 피제수로부터의 한 비트씩이 부분 나머지 수에 추가되며, 그 결과값이 제수와 같거나 커질 때까지 그 과정이 반복됨. 그리고 새로운 부분 나머지 수를 얻기 위하여 그 수로부터 제수를 뺌. 이 과정은 피제수의 모든 비트들에 대하여 적용될 때까지 계속됨.

 ㄴ 2의 보수로 표현된 수들 간의 나눗셈

과정)

초기세팅 : 제수는 M레지스터에, 피제수는 A와 Q레지스터에 저장함. 각 레지스터가 n비트일 때, 피제수는 2n비트 길이의 2의 보수로 표현함.

사이클1 : A와 Q레지스터를 좌측으로 한 비트씩 시프트함.

사이클2 : M과 A의 부호가 같으면 A ← A-M을 수행하고, 다르면 A ←A+M을 수행함.

사이클3 : 연산 전과 후의 A의 부호가 같거나 A=0이면, Q_(0)는 1로 세팅함. 부호가 다르거나 A!=0이면, Q_(0)으로 세팅하고, A를 이전의 값으로 복구함.

사이클4 : Q레지스터에 비트가 남아있다면, 2~4사이클을 반복함.

사이클5 : 나머지 수는 A에 남음. 만약 제수와 피제수의 부호가 같으면 몫은 Q레지스터의 값이 되고, 그렇지 않다면 Q 레지스터의 내용에 대한 2의 보수가 몫이 됨.

반응형

댓글