CS/컴퓨터 구조론

컴퓨터 구조론 3장 [컴퓨터 산술과 논리 연산3]

devrabbit22 2025. 3. 24. 15:59

시프트 연산

논리적 시프트(logical shift)

논리적 시프트 연산이란 레지스터 내의 데이터 비트들을 왼쪽 혹은 오른쪽으로 한칸씩 이동시키는 것을 말한다.

4-비트 레지스터에서의 좌측-시프트

좌측 시프트 연산을 수행하면, 비트들이 왼쪽으로 한 칸씩 이동된다. 그리고 맨 우측 비트로는 0이 들어온다.

 

  • 4-비트 레지스터는 네 개의 플립-플롭들로 구성되므로, 좌측-시프트는 각 플립-플롭의 출력이 왼편의 플립-플롭으로 입력된다는 것을 의미한다. 
  • 유의사항 : 최하위 비트(A1)로는 0이 들어오고, 최상위 비트(A4)는 버리게(drop out)된다는 점이다.
  • 반대 방향의 연산인 우측 시프트 연산에서는 모든 비트들이 우측으로 한 칸씩 이동하게 된다. 이 경우에는 최상위 비트(A4)로 0이 들어오고, 최하위 비트(A1)는 버린다.
  • 어떤 레지스터에 '0100'이 저장되어 있을 때, 우측-시프트 연산을 수행하면 '0010'이 되어서 원래의 수를 2로 나눈 값이 된다. 이와 같이 시프트는 간단한 곱셈과 나눗셈에도 사용될 수 있다.

시프트 레지스터(shift register)

데이터 비트들을 좌측 혹은 우측 방향으로 이동시키는 기능을 가지고 있는 레지스터

4-비트 시프트 레지스터의 내부 구성도

D 플립-플롭을 이용한 시프트 레지스터의 내부 구성도이다. 좌측 시프트를 원하는 경우에는 제어신호 L을 1로 세트하면, 그 신호가 접속된 AND 게이트들의 한쪽 입력이 1로 세트되어서, 각 프립-플롭은 우측 플립-플롭의 출력을 D 입력으로 받을 수 있게 된다. 맨 우측 AND 게이트로는 0이 입력된다. 입력되는 값들은 클록 신호가 들어오는 순간에 각 플립-플롭에 저장된다. 우측-시프트의 경우에는 제어 신호 R을 1로 세트하면, 각 D 플립-플롭이 좌측 플립-플롭의 출력을 입력으로 받게 된다. 그리고 맨 좌측 AND 게이트로는 0이 입력된다.

시프트 연산은은 논리적 시프트라고 부른다.

순환 시프트(circular shift)

좌측 혹은 우측 시프트 후에 최상위 혹은 최하위 비트를 버리지 않고 반대편 끝으로 이동시키는 시프트 연산

회전(rotate)이라고도 부르는 순환 시프트 연산은 논리적 시프트와 근본적으로 같지만, 최상위 혹은 최하위 비트를 버리지 않고 반대편 끝에 있는 비트 위치로 들어가게 한다는 것이 다르다. 

즉, 순환 좌측-시프트 연산은 최상위 비트인 A4가 최하위 비트인 A1으로 이동한다.

4-비트 레지스터에서의 순환 좌측-시프트

순환 우측 시프트 연산의 경우에는 비트들 간의 이동이 A4->A3,  A3->A2,  A2->A1, A1->A4와 같이 이루어진다. 즉, 논리적 시프트와는 달리 외부로부터 0은 들어오지 않게 된다.

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

두 레지스터들 간에 접속된 하나의 선을 통하여 데이터를 한 번에 한 비트씩 전송하는 동작

 

논리적 시프트 연산과 순환 시프트 연산을 이용하면, 두 레지스터들 간에 직렬 데이터 전송(serial data transfer)이 가능해진다. 이 동작은 시프트 연산을 데이터 수만큼 연속적으로 수행함으로써 두 레지스터들 사이에 한 개의 선을 통하여 전체 데이터를 이동시키기 위한 것이다.

시프트 레지스터를 이용한 직렬 데이터 전송

직렬 전송에서는 각 클록 주기마다 한 번씩의 시프트 연산이 일어난다. 따라서 4-비트 레지스터들 간의 직렬 전송을 위해서는 A 레지스터에서 네 번의 순환 시프트가 연속적으로 수행되고, B레지스터에서는 네 번의 논리적 시프트가 수행되어야 한다. 

산술적 시프트(arithmetic shift)

  • 부호를 가진 데이터에 대한 시프트 동작으로서, 부호 비트는 변겨오디지 않도록 해야 한다.
  • 산술적 시프트 연산은 레지스터에 저장된 데이터가 부호를 가진 정수인 경우에 부호 비트를 고려하여 수행되는 시프트를 말한다. 
  • 이 연산에서 중요한 것은 시프트 과정에서 부호 비트는 그대로 두고, 수의 크기를 나타내는 비트들만 시프트 시킨다는 점이다.

ex) 2의 보수로 표현된 4-비트 데이터에서 맨 좌측 비트(A4)가 부호 비트인 경우에 산술적 시프트

산술적 좌측-시프트(arithmetic shift-left) 
A4 (불변), A3 ← A2, A2 ← A1, A1 ← 0
산술적 우측-시프트(arithmetic shift-right) 
A4 (불변), A4 → A3, A3 → A2, A2 → A1

이와 같이 두 방향의 시프에서 모두 부호 비트는 변하지 않는다. 특히 산술적 우측-시프트에서는 부호 비트가 그 우측의 비트로 복사되는데, 이것은 부호-비트 확장과 같은 결과를 얻게 해준다.

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

  • 실제 CPU에서는 일반적으로 시프트 연산에 올림수(C) 플래그가 포함된다.
  • C 플래그를 포함한 좌측 시프트 연산에서는 최상위 비트인 A4가 버려지지 않고 C 플래그로 이동된다. 이때 원래의 C 플래그 값은 지워진다. 그리고 C 플래그를 포함한 우측-시프트 연산의 경우 C 플래그의 값이 A4로 이동하고, 다른 비트들은 모두 우측으로 한 칸씩 이동한다. 이 경우에 최하위 비트인 A1은 버린다.

C-플래그를 포함한 좌측 및 우측 시프트 연산

  • C 플래그를 포함하는 순환 시프트, 즉 회전 연산의 경우 회전 방향에 따라 C 플래그로 데이터의 최상위 비트 혹은 최하위 비트의 값이 들어온다. 그리고 C 플래그의 원래 값은 지워지지 않고 최상위 혹은 최하위 비트로 이동한다. RLC(rotate left with carry) 연산으로서, 비트 이동이 레지스터와 c 플래그가 포함된 전체 루프에 대하여 이루어지는 것을 볼 수 있다.
  • 레지스터의 최상위 비트인 A4가 C 플래그로 들어가고 C 플래그의 원래 값은 레지스터의 최하위 비트(A1)로 이동한다. 우측으로 회전하는 RRC(rotate right with carry) 연산에서는 방향만 반대일 뿐 모든 동작은 좌측회전의 경우와 같다.

C-플래그를 포함한 좌측 및 우측 회전 연산

  • 산술적 시프트 연산에서도 C 플래그가 포함될 수도 있다. 그러한 연산에서 비트들의 이동 동작은 논리적 시프트 연산과 동일하다.
  • 산술적 우측 시프트에서 C 플래그의 값이 포함되는 경우에, 그 값이 원래 푸보 비트 값과 다른 경우에는 데이터의 부호가 변경되는 문젝 발생한다. 이런 경우 오버플로우(V) 플래그를 세트함으로써 그 사실을 알리도록 하거나, C 플래그가 레지스터로 들어오지 못하게 함으로써 부호 비트가 그대로 유지되도록 해야 한다.

Reference

컴퓨터 구조론 개정 5판

https://yz-zone.tistory.com/73

 

[ 컴퓨터구조 ] 3.4 시프트 연산

시프트 연산 ▣ 논리적 시프트 (logical shift) ▪레지스터 내의 데이터 비트들을 왼쪽 혹은 오른쪽으로 한 칸씩 이동 ▪ 좌측 시프트(left shift) ➢모든 비트들을 좌측으로 한 칸씩 이동 ➢최하위 비

yz-zone.tistory.com