Logical shift(논리적 시프트)
논리적 시프트 연산은 레지스터 내의 데이터 비트들을 왼쪽, 오른쪽으로 한 칸씩 이동시키는 동작이다.
110011을 left shift 하면 100110이 된다.
101011을 right shift 하면 010101이 된다.
시프트되어 갈 곳을 잃은 비트는 버려지게 되고, 비어있는 비트는 0으로 채워진다.
circular shift(순환 시프트)
최상위, 최하위 비트를 버리지 않고, 반대편 끝에 있는 비트 위치로 들어가게 한다.
1010을 circular left shift하면 0101이 된다.
1101을 circular right shift하면 1110이 된다.
논리적 시프트연산과 순환 시프트 연산을 이용하면, 두 레지스터들 간에 직렬 데이터 전송이 가능하다. 시프트 연산을 데이터 수만큼 연속적으로 수행함으로써 두 레지스터들 사이에 한 개의 선을 통하여 전체 데이터를 이동시킬 수 있다.
예를 들면 4비트 A레지스터의 값을 B레지스터로 옮긴다고 가정할 때 아래와 같은 움직임을 볼 수 있다.
A1 | A2 | A3 | A4 | -> | B1 | B2 | B3 | B4 | |
초기 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | |
t1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | |
t2 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | |
t3 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | |
t4 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 |
논리적 시프트를 구현하는 4비트 시프트 레지스터는 다음과 같다.
Arithmetic shift(산술적 시프트)
레지스터에 저장된 데이터가 부호를 가진 정수인 경우에 부호 비트를 고려하여 수행되는 시프트를 말한다.
시프트 과정에서 부호 비트는 그대로 두고, 수의 크기를 나타내는 비트들만 시프트 시킨다.
바로 예를 들어서 알아보자
-2에 대한 4비트 2진수에 대해 산술적 좌측 시프트를 수행하고, 두 번의 산술적 우측 시프트를 수행하라
A | 1 | 1 | 1 | 0 | -2 |
left shift | 1 | 1 | 0 | 0 | -4 |
right shift | 1 | 1 | 1 | 0 | -2 |
right shift | 1 | 1 | 1 | 1 | -1 |
C 플래그를 포함한 시프트
실제 CPU에서는 시프트 연산에 올림수C(Carry) 플래그가 포함된다. 그래서 쉬프트 연산에서 비트가 버려지는 대신 C플래그로 이동하게 된다. 이때 원래의 C 값이 버려지게 된다.
'CS > Computer Architecture' 카테고리의 다른 글
[컴퓨터 구조] 제어 유니트 (Control Unit) (0) | 2021.12.26 |
---|---|
[컴퓨터 구조] 산술 연산(덧셈, 곱셈) (0) | 2021.12.04 |
[컴퓨터 구조] 컴퓨터 시스템 개요 (2) | 2021.11.24 |
[컴퓨터 구조] Addressing Mode (0) | 2021.06.12 |
[컴퓨터 구조] Instruction Set (0) | 2021.06.12 |