Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • DFS
  • django
  • 백트래킹
  • boj
  • Kubernetes
  • docker
  • Network
  • BFS
  • 프로그래머스
  • 다이나믹 프로그래밍

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

[컴퓨터 구조] 산술 연산(덧셈, 곱셈)
CS/Computer Architecture

[컴퓨터 구조] 산술 연산(덧셈, 곱셈)

2021. 12. 4. 00:11
덧셈

덧셈을 수행하는 하드웨어를 병렬 가산기라고 부른다. 병렬 가산기는 비트 수만큼의 전가산기들로 구성된다.

 

반가산기

1비트 2진수 2개를 더한 합과 올림수를 구하는 하드웨어

1 + 1 => 결과값 1과 올림수 1을 출력한다.

 

전가산기

1비트 2진수 2개와 이전 단게의 올림수 1개, 총 3개의 이진수를 더하여 합과 올림수를 구하는 하드웨어

이전에 올라온 비트 1 + (0 + 1) 현재 위치의 비트 => 결과값 1과 올림수 1을 출력한다.

 

전가산기는 올림수 비트를 전송하는 선에 의해 서로 연결된다. 따라서 많은 비트를 연산하기 위해서 같은 방법으로 전가산기들을 계속 연결해 구성할 수 있다.

 

 

병렬 가산기

 

상태 레지스터

V : 오버플로우(oVerflow) 비트 (1인경우 오버플로우가 발생했다는 뜻이다)

Z : 영(Zero) 비트(결과 값이 0인 경우 1이 된다)

S : 부호(Sign) 비트(양수이면 0, 음수이면 1이 된다)

C : 올림수(Carry) 비트

 

 

0110 + 0011을 계산해 보자 (6 + 3) = 9

 

계산한 결과는 1001으로 -7이 된다.

이때 비트가 부족해서 오버플로우가 난걸 어떻게 확인하는지 알아보자.

마지막 비트의 올림수와 그 전 비트의 올림수를 XOR 연산해주면 오버플로우가 발생했는지 알 수 있다.

 

어떻게 XOR을 통해서 오버플로우를 감지할 수 있을까?

일단 음수와 양수의 덧셈같은 경우에는 오버플로우가 발생할 수 없는 구조이다.

그런데 음수 + 음수, 양수 + 양수 같은 경우에는 부호 비트가 변했는지를 확인하면 오버플로우를 감지할 수 있기 때문에 마지막 비트의 올림수와 그 전 비트의 올림수의 XOR 연산을 통해서 부호가 변했는지 확인할 수 있다.

 

 

뺄셈

빼고자 하는 숫자를 보수기에 통과시켜 음수로 변환시킨 후 가산기를 통해 계산한다.

보수기 연산 = ~A + 1
0011 => 1101

 

 

부호없는 2진수 곱셈

부호없는 2진수 곱셈기

1101 * 1011 (13 * 11)

 

  C A Q M 동작
초기 0 0000 1011 1101  
사이클 1 0 1101 1011 1101 Q0가 1이므로 A <- A + M
  0 0110 1101 1101 A, Q 레지스터 Right Shift
사이클 2 1 0011 1101 1101 Q0가 1이므로 A <- A + M
  0 1001 1110 1101 A, Q 레지스터 Right Shift
사이클 3 0 0100 1111 1101 Q0가 0이므로 'A, Q 레지스터 Right Shift' 만 수행한다.
사이클 4 1 0001 1111 1101 Q0가 1이므로 A <- A + M
  0 1000 1111 1101 A, Q 레지스터 Right Shift

result : 1000 1111 (143)

 

 

부호 있는 2진수 곱셈

2의 보수들 간의 곱셈은 특별한 알고리즘이 개발되었다. 그 중에서 Booth 알고리즘을 사용해 곱셈을 하는 과정을 알아보자

 

1001 * 0011 (-7 * 3)

  A Q Q-1 N M 동작
초기 0000 0011 0 4 1001  
사이클 1 0111 0011 0 4 1001 Q0 Q-1이 10이므로 A <- A - M 을 수행한다.
  0011 1001 1 3 1001 Arithmetic Right Shift를 수행하고 계수에서 1을 뺀다.
사이클 2 0001 1100 1 2 1001 Q0 Q-1이 11이므로 Arithmetic Right Shift와 계수-1만 수행한다.
사이클 3 1010 1100 0 2 1001 Q0 Q-1이 01이므로 A <- A + M 을 수행한다.
  1101 0110 0 1 1001 Arithmetic Right Shift를 수행하고 계수에서 1을 뺀다.
사이클 4 1110 1011 0 0 1001 Q0 Q-1이 00이므로 Arithmetic Right Shift와 계수-1만 수행한다.

result: 1110 1011 (-21)

 

 

부호 없는 2진수 나눗셈

A ÷ B = q ... r

위 식에서 A는 나누어지는 수인 피제수(dividend)이고, B는 나누는 수인 제수(divisor)이다. 그리고 q과 r은 각각 몫(quotient)과 나머지 수(remainder)를 나타낸다.

 

 

위 그림은 피제수 10010011을 제수 1011로 나누는 과정을 보여준다. 먼저, 피제수의 비트틀을 좌측에서부터 우측으로 차례대로 검사하여, 제수가 피제수를 나눌 수 있게 될때까지 한 비트씩 이동하면서 검사를 반복한다.

 

 

부호 있는 2진수 나눗셈

0111 ÷ 1101 (7/(-3))

  A Q M 동작
초기 0000 0111 1101  
사이클 1 0000 1110 1101 A, Q 레지스터 Left Shift
  1101 1110 1101 A와 M의 부호가 다르므로 A <- A + M
  0000 1110 1101 A의 부호가 바뀌었으므로(연산 실패), Q0를 0으로 세팅하고 A값 복구
사이클 2 0001 1100 1101 A, Q 레지스터 Left Shift
  1110 1100 1101 A와 M의 부호가 다르므로 A <- A + M
  0001 1100 1101 A의 부호가 바뀌었으므로(연산 실패), Q0를 0으로 세팅하고 A값 복구
사이클 3 0011 1000 1101 A, Q 레지스터 Left Shift
  0000 1000 1101 A와 M의 부호가 다르므로 A <- A + M
  0000 1001 1101 A=0이므로(연산 성공), Q0 를 1로 세팅
사이클 4 0001 0010 1101 A, Q 레지스터 Left Shift
  1110 0010 1101 A와 M의 부호가 다르므로  A <- A + M
  1110 0010 1101 A의 부호가 바뀌었으므로(연산 실패), Q0를 0으로 세팅하고 A값 복구

몫은 Q레지스터의 비트에 대한 2의 보수인 1110 (-2)

나머지는 A레지스터인 0001 (1)

 

'CS > Computer Architecture' 카테고리의 다른 글

[컴퓨터 구조] 기억 장치 기본  (0) 2021.12.29
[컴퓨터 구조] 제어 유니트 (Control Unit)  (0) 2021.12.26
[컴퓨터 구조] 산술 연산 (Shift)  (2) 2021.12.01
[컴퓨터 구조] 컴퓨터 시스템 개요  (2) 2021.11.24
[컴퓨터 구조] Addressing Mode  (0) 2021.06.12
    'CS/Computer Architecture' 카테고리의 다른 글
    • [컴퓨터 구조] 기억 장치 기본
    • [컴퓨터 구조] 제어 유니트 (Control Unit)
    • [컴퓨터 구조] 산술 연산 (Shift)
    • [컴퓨터 구조] 컴퓨터 시스템 개요

    티스토리툴바