스킬캠퍼스

오늘 끝나면

Shift와 비교

  • Shift와 비교의 핵심 문제를 한 문장으로 설명한다
  • 오른쪽 실습에서 Shift와이 어떻게 움직이는지 관찰한다
  • 다음 강의와 이어지는 한계를 말할 수 있다

실습 미션

밀고 회전하고 비교 — 상태 플래그가 생긴다 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.

성공 조건

  • 실습의 기본값을 먼저 관찰
  • 입력값이나 모드를 한 번 이상 바꿔 결과 비교
  • 왜 결과가 바뀌었는지 한 문장으로 설명

반도체 설계 · 08

Shift와
비교

비트를 통째로 한 칸 미는 것이 시프트다.
왼쪽으로 밀면 ×2, 오른쪽으로 밀면 ÷2가 된다. 빈 자리에 뭘 채우느냐가 핵심이다.
비교는 빼서 차를 버리고 플래그만 남기는 연산이다.

P.01반도체 설계 · 08

비트를 밀면 ×2 또는 ÷2

이진수는 자릿값이 2의 거듭제곱이다. 그래서 자리를 통째로 한 칸 옮기면 값이 두 배가 되거나 반토막이 된다.

왼쪽으로 한 칸 밀면 모든 비트의 자릿값이 두 배가 된다. 곧 ×2다.
오른쪽으로 한 칸 밀면 반대로 ÷2가 된다(소수점 아래는 버린다).
십진수에서 자리를 옮기면 ×10이나 ÷10이 되는 것과 똑같은 원리다. 밑이 2일 뿐이다.

곱셈기와 나눗셈기는 비싸다. 그런데 2의 거듭제곱 곱셈이나 나눗셈은 시프트 한 번으로 끝난다.
그래서 시프트는 ALU에서 가장 싼 산술이다. 컴파일러도 x*2를 보면 시프트로 바꾼다.

왼쪽 shift = ×2 · 오른쪽 shift = ÷2
한 칸 이동 = ×2 · ÷2
원래 값= 12
0
0
0
0
1
1
0
0
← 왼쪽 한 칸 (SHL)×2 = 24
0
0
0
1
1
0
0
0
오른쪽 한 칸 (SHR) →÷2 = 6
0
0
0
0
0
1
1
0
밑이 2라서 자리 한 칸이 두 배다. 십진수의 ×10, ÷10과 같은 원리다
P.02반도체 설계 · 08

빈 자리에 뭘 채우나, 논리 vs 산술

한 칸 밀면 반대편 끝에 빈 자리가 생긴다. 거기에 뭘 넣느냐로 시프트 종류가 갈린다.

논리 오른쪽(SHR)은 빈 MSB 자리에 무조건 0을 채운다.
부호 없는 수를 ÷2 할 때 맞다. 0…10100…0101이 된다.

산술 오른쪽(SAR)은 빈 자리에 원래 부호비트(MSB)를 복사한다.
음수를 ÷2 해도 음수로 남게 하려는 것이다. −8−4로 제대로 나온다.
만약 음수를 0으로 채우면 갑자기 큰 양수로 망가진다. 그래서 부호 있는 수에는 SAR을 쓴다.

왼쪽 시프트는 항상 LSB에 0을 채운다. 종류 구분이 없다.

오른쪽 shift: 0 채움 vs 부호 채움
같은 −8, 다른 채움
원래 (부호 있는 −8)= −8
1
1
1
1
1
0
0
0
SHR · 0 채움= 124 ✗
0
1
1
1
1
1
0
0

0을 넣으니 음수가 큰 양수로 망가진다

SAR · 부호(MSB) 채움= −4 ✓
1
1
1
1
1
1
0
0

MSB(1)를 복사하니 −8 ÷2가 −4로 맞다

강조 칸이 새로 채워진 MSB다. 0이냐 부호냐가 갈림길이다
P.03반도체 설계 · 08

rotate, 밀려난 비트를 반대편으로

시프트는 끝 비트를 밖으로 버린다. 회전(rotate)은 그 비트를 버리지 않고 반대편 끝으로 돌려 넣는다.

오른쪽 회전(ROR)은 밀려난 LSB를 빈 MSB 자리에 끼운다.
그래서 1의 개수는 절대 변하지 않는다. 비트가 고리처럼 돌 뿐이다.

회전은 암호와 해시, 비트 단위 데이터 처리에서 자주 쓴다.
버리는 시프트와 보존하는 회전을 한 ALU에 함께 넣어두면 쓰임새가 넓어진다. 시프트 유닛은 보통 이 네 종류(SHL, SHR, SAR, ROR)를 갖춘다.

버리지 않고 빙 돌려 넣는다
ROR · 오른쪽 회전
회전 전, 밀려날 LSB 강조
1
0
1
1
0
0
0
1
LSB → MSB
회전 후, LSB가 MSB로 들어온다
1
1
0
1
1
0
0
0
버리지 않고 고리처럼 돌린다. 1의 개수는 그대로 유지된다
P.04반도체 설계 · 08

직접 밀어보고 빈 자리를 예측한다

16비트 레지스터 R을 두고 SHL, SHR, SAR, ROR 중 하나를 골라 한 칸씩 민다. 실행 전에 빈 자리에 뭐가 들어올지 먼저 예측하고 결과와 맞춰본다.

CMP를 고르면 R−B를 계산해 차는 버리고 ZeroNegative 플래그만 세운다. B를 밀어 R과 같게, 작게, 크게 만들며 플래그가 어떻게 바뀌는지 본다.

16비트 R · 시프트 4종 + 비교
16비트 레지스터 R · 시프트와 비교
연산, 하나 고름

왼쪽 · ×2

R · 16비트부호 45 · 부호없음 45
0
0
0
0
0
0
0
0
0
0
1
0
1
1
0
1

b15 … b0 (왼쪽이 MSB)

예측 먼저, 빈 자리에 뭐가 들어올까?
근거 패널
방향
← 왼쪽
빈 자리 채움
0
밀려난 비트
?
들어온 비트
?
결과 R

실행하면 나옴

P.05반도체 설계 · 08

비교 = 빼서 플래그만 남기기

CPU에는 ‘같나? 작나?’를 직접 보는 회로가 없다. 빼본 뒤 결과의 흔적으로 판단한다.

비교(CMP) A−B는 가산기로 뺄셈을 한다. 단, 차 값은 저장하지 않고 버린다.
대신 결과에서 두 가지 흔적만 챙기는데, 이것이 플래그다.

Zero는 차가 0일 때 1이 되고, 두 값이 같다는 뜻이다.
Negative는 차가 음수일 때 1이 되며(차의 MSB), A가 더 작다는 뜻이다.
이 두 비트 조합으로 같다, 작다, 크다, 이하, 이상을 전부 가려낸다.

시프트도 비교도 결국 ALU 안의 부속이다. 여기서 만든 플래그를 분기(branch) 명령이 읽어 ‘같으면 점프’를 결정한다.

Q. 산술 오른쪽 시프트(SAR)가 빈 자리에 채우는 값은?정답은 부호 비트(MSB)다.
SAR은 원래 MSB를 복사해 채우므로 음수를 ÷2 해도 부호가 유지된다.
반대로 논리 오른쪽(SHR)은 무조건 0을 채워 부호 없는 수에만 맞다.
CMP → Zero · Negative
빼고 플래그만 남긴다

CMP A,B : A − B를 계산해 차는 버리고 Z와 N만 챙긴다

연산ZN의미
A − B10A = B (같음)
A − B01A < B (작음)
A − B00A > B (큼)
Z는 차가 0, N은 차의 부호비트다. 이 둘로 모든 비교를 가린다

3줄 요약

  1. 1밀고 회전하고 비교 — 상태 플래그가 생긴다
  2. 2Shift와 비교은 비트·게이트 → ALU → 시간·메모리 → 나만의 CPU → 메모리·GPU·SoC 흐름 안의 한 칸이다.
  3. 3개념을 외우는 것보다 입력을 바꾸면 무엇이 달라지는지 보는 것이 우선이다.

완료 전 점검

복습 카드

Shift와

밀고 회전하고 비교 — 상태 플래그가 생긴다

ALU

산술·논리 연산을 하는 회로

ISA

CPU가 이해하는 명령어 집합과 인코딩