컴퓨터의 사칙연산 처리

 

 

덧셈

 

 

carry flag로 다음 자릿수에 넘겨주는 방식으로 관리한다.

 

 

 

 

뺄셈

 

2의 보수를 통해 음수를 더하는 방식으로 연산을 수행한다.

 

 

 

 

 

overflow

 

계산 결과가 너무 커서 범위를 벗어나 경우 오버플로우가 발생한다.

(캐리 플래그가 오버플로우 됐다는 뜻은 아님. 연산할 수 있는 비트가 더 없을 경우를 말함)

 

 

 

이를 방지하기 위해 우리는 부호없는 숫자의 명령어를 사용한다.

addu, addui, subu 명령어들을 사용함

 

 

 

 

곱셈

 

 

 

곱셈 알고리즘은 productor가 1인지를 테스트하면서, multiplicand를 곱셈 결과에 추가할지 결정한다.

 

 

  • 곱셈 과정:
    • 만약 multiplier의 가장 오른쪽 비트(Least Significant Bit, LSB)가 1이면, multiplicand 를 현재 곱셈 결과에 더한다.
    • multiplicand 는 한 비트 왼쪽으로 이동(shift)한다.
    • multiplier는 한 비트 오른쪽으로 이동한다. 
  • 반복 및 조건 테스트:
    • 곱셈 과정을 최대 32번 반복한다.(32bit를 사용하기 때문)
      매 반복마다 multiplier의 LSB를 테스트하여 multiplicand를 곱셈 결과에 추가할지 결정한다.
    • 곱셈이 완료되면, 결과는 product 레지스터에 저장한다.

 

 

 

 

글씨가 개판이긴한데 1010 X 1100 과정 예시

 

 

 

 

 

나눗셈

 

 

dividend(피제수) 1001010과 divisor(제수) 1000을 사용하여 예시를 들어보겠다.

우리의 목표는 quotient(몫)와 remainder(나머지)를 구하는 것이다.

 

 

 

 

 

00010100 / 0010 과정. remainder와 Quotient가 어떻게 변하는지를 설명함

 

 

 

위에 지렁이처럼 쓴 글이랑 밑에 과정 단계랑 완전히 같지 않음. 대략적인 흐름만

 

 


  • 첫 번째 단계
    :
    • divisor를 dividend의 가장 왼쪽 비트부터 비교한다.
    • divisor가 dividend 부분보다 작거나 같다면, 1을 몫에 기록하고 divisor를 뺀다.
      이 경우, 1000을 1001에서 빼서 10이 남는다.
  • 두 번째 단계:
    • 다음 비트를 내리고, 새로운 부분(101)을 만든다.
    • divisor가 이 새로운 값보다 크므로 몫에 0을 추가한다.
    • 그 다음 비트를 내려 1010을 만든다.
  • 세 번째 단계:
    • 1010에서 divisor 1000을 뺄 수 있다.
    • 빼고 난 후 결과는 10이다. 몫에 1을 기록한다.
  • 네 번째 단계:
    • 다음 비트를 내리고 100을 만든다.
    • divisor보다 작기 때문에, 몫에 0을 추가한다.
    • 비트를 더 내리고 1000을 만든다.
  • 다섯 번째 단계:
    • 1000에서 divisor를 빼고, 결과는 0이다.
    • 몫에 1을 기록한다.