사칙연산 원리

Integer 덧셈

오버 플로우가 발생하는 경우

  • 두 개의 양수를 덧셈하는 경우 (sign비트 값이 1이 되어서 음수가 되어버림)
  • 두새의 음수를 덧셈하는 경우 (sign비트 값이 0이 되어서 양수가 되어버림)

Integer 뺄셈

오버 플로우가 발생하는 경우

  • 양수와 음수를 뺄셈 하는 경우
  • 음수와 양수를 뺄셈하는 경우

오버플로우를 처리하는 방식은 언어마다 다 다름

C언어에서는 오버플로우를 무시. 프로그래머가 이를 책임져야 함

하지만 다른 언어에서는 오버플로우가 발생하면 exception을 발생시킴

Arithmetic for Multimedia

SIMD (Single-instruction, multiple-data)

그래픽이나 media processing 연산은 주로 8비트나 16비트 연산을 사용

만약 64비트 프로세서의 경우 명령어는 64비트를 사용하기에 한 번에 낭비가 심하므로 8비트 연산 8개 or 16비트 연산 4개, 32비트 연산 2개 붙여서 연산함

Saturating operations

오버플로우가 발생했을 때, 결과를 최댓값으로 변경

ex) RGB Hexcode 연산

0xFFFFFF(흰색)에 0xFFFFFF(흰색)을 더하면 0xFFFFFF

Multiplication (곱셈)

프로세서의 곱셈 하드웨어 구조

곱셈 동작 알고리즘

  1. Multuplier의 가장 오른쪽 비트가 1인지 0인지 체크
    1. 1인 경우 multiplicand를 product에 더한 후 product에 값을 저장
  2. Multiplicand를 왼쪽으로 1비트 시프트 연산
  3. Multiplier를 오른쪽으로 1비트 시프트 연산
  4. 1~3을 32번 반복

Optimized Multiplier

기본 Multiplier과 다르게 ALU, Multiplicand가 32비트이고 multiplier를 따로 저장할 필요가 없음

product의 하위 32비트에 multiplier가 저장되어 있다.

나눗셈 동작 알고리즘

  1. product의 최하위 비트의 값이 1이면 add 연산 (multiplicand와 product의 상위 32비트 add연산) 실행 0일 경우 다음 순서로 이동
  2. 오른쪽으로 1비트 시프트 연산
  3. 1~2를 32번 반복

Division (나눗셈)

division 하드웨어 구조

곱셈 하드웨어 구조와 비슷하지만, 시프트 연산이 다르다. 곱셈과 반대로 연산한다.

동작 알고리즘

  1. remainder에 dividend 삽입
  2. remainder에 divisor 값을 뺀다
    1. 뺀 후 값이 양수 또는 0일 경우
      1. Quotient비트를 왼쪽으로 1비트 시프트 연산하고 최하위 비트를 1로 세팅
    2. 뺀 값이 음수일 경우
      1. 원래 값으로 복원
      2. Quotient비트를 왼쪽으로 1비트 시프트 연산하고 최하위 비트를 0으로 세팅
  3. divisor을 오른쪽으로 1비트 시프트 연산

Optimized divider

구조는 Optimized multiplier과 동일

동작 방식은 Optimized multiplier 반대로 작동한다. Optimized multiplier가 한 사이클에 한 번의 덧셈을 한다면, Optimized divider는 한사이클에 한번의 뺄셈을 한다.

Remainder의 상위 32비트는 0으로 초기화하고, 하위 32비트에는 devidend가 들어감.

동작 알고리즘

  1. 왼쪽으로 1비트 시프트 연산
  2. remainder값에 divisor값을 뺸다.
    1. 뺸 값이 음수일 경우
      1. 최하위 비트값을 0으로 만들고 원 상태로 복구
    2. 뺀 값이 양수이거나 0일 경우
      1. 최하위 비트값을 1로 만듦
  3. 이를 32번 반복

'컴퓨터 구조' 카테고리의 다른 글

프로세서의 명령어 실행 과정  (0) 2023.07.07
실수의 표현과 연산  (0) 2023.07.06
Static Linking 부터 로드까지  (0) 2023.06.30
명령어 addressing  (0) 2023.06.30
함수 호출 작동 방식  (0) 2023.06.28