Mano의 컴퓨터시스템구조

[mano의 컴퓨터시스템 구조] 10장 컴퓨터 산술 연산

studyingalone 2025. 2. 26. 19:55

10.2 덧셈과 뺄셈

부호절대값 데이터를 이용한 덧셈과 뺄셈

부호절대값 숫자의 덧셈과 뺄셈

 

  • 덧셈과 뺄셈을 수행할 때, 숫자의 크기를 각각 A와 B로 지정하고, 부호 및 연산 종류에 따라 총 8가지 경우를 고려해야 한다.
  • 두 개의 같은 숫자를 뺄 때 결과는 -0이 아니라 +0이 되어야 한다.
  • A와 B의 부호가 같다면(다르면), 두 크기를 더하고 A의 부호를 결과에 적용한다.
  • A와 B의 부호가 다르면(같다면), 두 크기를 비교하여 작은 숫자를 큰 숫자에서 뺀다. 결과의 부호는 A > B이면 A의 부호를 따르고, A < B이면 A의 부호를 반대로 한다.
  • 만약 A와 B의 크기가 같다면, B를 A에서 빼고 결과의 부호를 양수로 한다.

하드웨어 구성

 

A와 B는 숫자의 크기를 저장하는 레지스터, As와 Bs는 각각의 부호를 저장하는 플립플롭

  1. 병렬 가산기(parallel-adder) – A + B 연산 수행
  2. 크기 비교기(comparator) – A > B, A = B, A < B 판별
  3. 병렬 감산기(parallel-subtractor) – A - B 및 B - A 연산 수행
  4. 배타적 논리합(XOR) 게이트 – As와 Bs의 입력을 비교하여 부호 관계 결정

부호절대값 덧셈과 뺄셈을 위한 하드웨어

  • A, B 레지스터 및 부호 플립플롭(As, Bs)
  • 2의 보수를 이용한 뺄셈 → A + (B의 2의 보수)
  • 출력 캐리 → 플립플롭 E로 전달하여 숫자의 크기 비교
  • 오버플로우(overflow) → AVF 플립플롭에 저장

덧셈 및 뺄셈 과정

  • M = 0: B를 그대로 가산기에 전달, 입력 캐리 0 → 결과: A + B
  • M = 1: B의 1의 보수를 가산기에 전달, 입력 캐리 1 → 결과: A + B + 1 (즉, A - B)

하드웨어 알고리즘

덧셈과 뺄셈 연산을 위한 흐름도

 

  1. 부호 비교
    • As와 Bs를 XOR 게이트에 입력하여 비교
    • 출력이 0이면 부호가 동일, 1이면 부호가 다름
  2. 덧셈 연산
    • 부호가 동일하면 크기를 직접 더함
    • 결과는 EA ← A + B (EA는 E와 A를 포함하는 레지스터)
    • 연산 후 E의 캐리 비트가 1이면 오버플로우 발생, 이를 AVF 플립플롭에 저장
  3. 뺄셈 연산
    • 부호가 다르면 크기를 더함
    • 부호가 같으면 크기를 비교한 후 작은 값에서 큰 값을 뺌
    • 연산 방식: A + (B의 2의 보수) (A - B)
    • 뺄셈에서는 오버플로우가 발생하지 않으므로 AVF = 0
  4. 결과 처리
    • E = 1이면 A > B → 결과값은 A 그대로 유지
    • A = 0이면 부호를 양수(As = 0)로 설정하여 -0 방지
    • E = 0이면 A < B → A의 2의 보수를 취해 결과값 보정
      • 이때, A의 2의 보수를 계산하는 마이크로연산 A ← -A + 1 수행
    • 부호 결정:
      • A > B이면 원래 A의 부호 유지
      • A < B이면 A의 부호를 반전(As 보수 연산)
  5. 최종 결과
    • 연산 결과는 A 레지스터에 저장, 부호는 As에 저장
    • 오버플로우 여부는 AVF 플립플롭을 통해 확인
    • E의 최종 값은 중요하지 않음 (결과에 영향 없음)

 


부호가 있는 2의 보수 데이터를 이용한 덧셈과 뺄셈

부호가 있는 2의 보수로 표현된 숫자의 덧셈과 뺄

 

부호 있는 2의 보수 표현은 숫자의 부호와 크기를 함께 표현하는 방식으로, 최상위 비트(왼쪽 첫 번째 비트)가 부호를 나타낸다.

  • 0이면 양수, 1이면 음수
  • 음수는 2의 보수 형태로 저장됨
    • 예: +33 → 00100001, -33 → 11011111 (2의 보수 관계)

 

덧셈 및 뺄셈 연산

  • 덧셈: 두 숫자를 그대로 더하고, 부호 비트도 일반 비트처럼 처리
    • 최상위 비트에서 캐리가 발생하면 버림
  • 뺄셈: 뺄셈할 숫자의 2의 보수를 취한 후 덧셈 수행
    • 예: A - B = A + (B의 2의 보수)

 

오버플로우(Overflow) 검출

  • n비트 숫자 두 개를 더한 결과가 n+1비트가 되면 오버플로우 발생
  • 검출 방법: 최상위 자리의 두 캐리 비트를 XOR 게이트에 입력
    • 출력이 1이면 오버플로우 발생

10.3 곱셈 알고리즘

곱셈은 연속적인 이동(Shift)과 덧셈(Add) 연산을 통해 수행됨

 


부호절대값 데이터에 대한 하드웨어 구성

  1. 부분 곱(Partial Product)을 누적 저장
    • 여러 개의 이진수를 한 번에 더하는 대신, 하나씩 누적하여 계산
  2. 부분 곱을 왼쪽으로 이동하는 대신, 오른쪽으로 이동
    • 피승수는 고정하고, 부분 곱과 승수만 오른쪽으로 이동
  3. 승수가 0일 때는 덧셈을 수행하지 않음
    • 0을 더하는 연산은 불필요

곱셈 연산을 위한 하드웨어

 

  • A 레지스터: 부분 곱 저장
  • B 레지스터: 피승수 저장
  • Q 레지스터: 승수 저장
  • Qs 플립플롭: 승수의 부호 저장
  • E 플립플롭: 추가적인 이동 연산을 위한 저장 공간
  • SC (Sequence Counter): 승수의 비트 수만큼 반복 횟수를 관리

 


하드웨어 곱셈 알고리즘

곱셈 연산을 위한 흐름

 

 

  1. 초기화
    • 피승수(B)와 승수(Q)를 각각 저장
    • 부호 비교 후, 결과(A, Q)의 부호 설정
    • A와 E를 0으로 초기화
    • SC를 승수의 비트 수로 설정
  2. 반복 연산 (SC ≠ 0일 때까지)
    • 승수(Q)의 최하위 비트 확인
      • 1이면 피승수(B)를 A에 더함
      • 0이면 아무 작업 없이 진행
    • EAQ 레지스터를 오른쪽으로 이동 (shr EAQ)
    • SC 값을 1 감소 후, SC = 0인지 확인
    • 0이 아니면 반복
  3. 연산 종료
    • 최종 결과는 A(상위 비트)와 Q(하위 비트)에 저장됨

 


10.5 부동 소수점 산술 연산

 

  • 가수(mantissa)와 지수(exponent)로 구성
  • m × r^e(r은 기수)

 

부동 소수점 산술 연산을 위한 레지스터

  • 덧셈 결과는 AC에 저장
  • 뺄셈 결과는 BR에 저장
  • 위 연산 결과는 AC에 저장

덧셈과 뺄셈 

부동 소수점 숫자의 덧셈과 뺄

  1. 0인지 여부 조사:
    • 만약 BR이 0이면 연산을 종료하고 AC에 저장된 값이 결과가 된다. 만약 AC가 0이면 BR의 값을 AC로 옮기고 부호를 반전시켜서 연산을 계속한다.
  2. 가수 위치 조정:
    • 두 지수가 다르면 작은 지수를 가진 가수를 오른쪽으로 이동시켜 두 지수를 일치시킨다.
  3. 가수 덧셈/ 뺄셈:
    • 덧셈과 뺄셈은 고정소수점 연산과 유사하게 가수의 절댓값을 더하거나 뺀다. 덧셈 시 오버플로우가 발생하면, 오버플로우 비트는 E로 이동하고, E가 1이면 A의 비트를 오른쪽으로 시프트하며 지수를 증가시킨다.
  4. 결과 정규화:
    • 뺄셈 시 언더플로우가 발생하면, 가수를 왼쪽으로 이동시키고 지수를 감소시킵니다. 가수의 첫 번째 비트가 1이 될 때까지 이 과정을 반복하여 정규화합니다.

곱셈

부동 소수점 숫자의 곱셈

 

  1. 0인지 여부를 조사: 두 피연산자 중 하나가 0이면 결과는 0
  2. 지수 더한다.: 두 지수를 더하고, 바이어스를 고려해 수정된 지수를 계산
  3. 가수 곱한다: 고정소수점 방식처럼 가수를 곱하고, 그 결과는 AC에 저장. 오버플로우는 발생하지 않으므로 따로 처리할 필요가 없다.
  4. 결과를 정규화한다: 결과가 정규화되지 않으면, 가수를 왼쪽으로 시프트하고 지수를 감소시켜 1번만 정규화

 


나눗셈

부동 소수점 숫자의 나눗셈

 

  1. 0인지 여부 조사: 제수가 0이면 나누기 연산을 할 수 없으므로 오류를 발생시킨다.
  2. 레지스터를 초기화하고 부호를 결정
  3. 피제수 위치 조정: 나누는 수의 가수가 제수보다 크면, 피제수의 가수를 오른쪽으로 시프트하여 정렬. 
  4. 지수 차이 계산: 두 수의 지수 차이를 계산하여 바이어스를 제거하고 지수 차이를 구한다.
  5. 가수 나누기: 두 가수를 나누고, 결과는 QR에 저장.
  6. 나머지 처리: 나머지는 A 레지스터에 저장

 


10.6 십진 산술 장치

BCD 가산기

 

  • BCD (Binary-Coded Decimal) 덧셈기는 두 개의 BCD 숫자를 더하고 결과를 BCD 형식으로 출력
  • 두 BCD 숫자(각각 4비트)의 합은 이진수로 계산됩니다. 합이 9(1001)보다 크면 BCD 형식으로 변환
  • 이진 덧셈기에서 9 + 9의 합은 19로, 19는 BCD 형식으로 표현할 수 없기 때문에, 0110(6)을 더하여 변환하고, 그에 따라 출력 캐리가 발생

BCD가산기

덧셈 과정

 

  1. 첫 번째 4비트 덧셈기: 낮은 자리수 BCD 숫자들이 더해지고, 결과가 10(1010) 이상일 경우, 0110을 더하여 BCD 형식으로 변환
  2. 두 번째 4비트 덧셈기: 높은 자리수 BCD 숫자들이 더해지며, 결과가 10(1010) 이상이면 다시 0110을 더해 BCD 형식으로 변환
  3. 이 과정을 반복하여 모든 자릿수를 더한다.

BCD 감산

  • BCD (이진화된 십진수) 뺄셈은 BCD 덧셈과 달리 빼는 수를 9의 보수로 변환한 후 더하는 방식
  • BCD는 자가 보수 코드가 아니기 때문에 각 BCD 숫자의 9의 보수를 구할 때 비트 보수만으로는 안 되며, 별도의 회로를 통해 각 자릿수를 9에서 빼야 한다
  • BCD 뺄셈기는 9의 보수를 구하는 회로를 포함한 BCD 덧셈기를 사용하여 구현.
  • 모드 비트 M에 따라 덧셈 또는 뺄셈이 결정.
    • M = 0: 두 숫자를 더합니다.
    • M = 1: 뺄셈을 위해 첫 번째 숫자에 두 번째 숫자의 9의 보수를 더합니다.