본문 바로가기
CS/컴퓨터 구조

[Chapter 3.1 컴퓨터 구조 및 설계] 2의 보수의 덧셈 뺄셈, overflow detecting

by 베어 그릴스 2022. 7. 12.
본 정리는 CS422-컴퓨터 구조 및 설계 : 하드웨어/소프트웨어 인터페이스. David A. Patterson, 존 헤네시 책을 바탕으로 하고 있음을 미리 알립니다.

 

32bit 2의 보수 표현


앞서 2의 보수 표현을 다룬 적이 있는데, 컴퓨터에선 32비트의 수를 연산을 할 것이기 때문에 32비트의 수도 2의 보수로 표현할 수 있어야한다.

 

32비트의 부호있는 수의 표현은 다음과 같다.

32비트에서도 마찬가지로, 모든 비트를 반대로 바꾸고, 1을 더하면 그 수의 2의 보수가 된다.

 

 

MIPS ALU Unit


MIPS에서는 산술 연산 혹은 논리 연산을 가진 명령어가 매우 많다.

 

add, addi, addiu, addu
sub, subu
mult, multu, div, divu
sqrt
and, andi, nor, or, ori, xor, xori
beq, bne, slt, slti, sltiu, sltu

 

이러한 명령어들의 연산을 다음 ALU가 한다.

 

덧셈 및 뺄셈과 오버플로우


2진수의 32 비트가 ALU에 들어오게 되는데 덧셈과 뺄셈이 어떻게 이루어질까?

 

우리가 10진수 덧셈을 할 때와 똑같다.

 

최대 표현 가능한 수가 1이므로 1+1 이되면 1이 올림수가 되어 10이된다.

 

예를들어, 000111의 7과 000110의 6을 더한다고 생각해보자.

 

그렇다면 다음과 같이 될 것이다.

사람이 손으로 계산하는 것과 똑같이 해주면 된다.

 

그렇다면 뺄셈은 어떻게 될까?

 

2의 보수 표현법을 사용하여 더해주면된다.

 

즉, 6의 2의 보수가 111010이므로, 000111(7)과 111010(-6)을 더해주면, 맨 앞의 수는 버림 되고,000001이 될 것이다.

 

 

그렇다면 여기서 의문이 들 것이다.

 

컴퓨터는 32비트의 수 까지만 표현이 가능한데, 수끼리 더하여 32비트가 표현할 수 없는 수가 나오면 어떻게 하지?

 

이렇게 컴퓨터에서 표현할 수 있는 수의 범위를 넘어서서 표현하고 싶었던 수가 나오지 못하는 것을 overflow라고 한다.

 

그렇다면 이러한 overflow가 일어났는지 일어나지 않았는지 알 수 있는 방법을 알아보자.

overflow는 부호가 다른 수를 더했을때는 절대 일어나지 않는다.

 

즉, 부호가 같은 수를 서로 더해서 일어난다.

 

overflow 탐지하는 방법

 

2의 보수 덧셈 뺄셈에서도 마찬가지이다. 같은 부호를 가진 수를 더했을 때 sign bit가 달라지면, 이떄 overflow가 발생했음을 알 수 있다.

우리가 위와 같이 연산을 진행한다고 할 때, overflow 감지 식을 나타내면 다음과 같을 것이다.

또 이렇게도 나타낼 수 있다.

C는 carry bit 즉 올림수를 나타내고, xor연산을 한것이다.

즉, msb의 들어오는 carry bit과 나가는 carry bit이 다를 때, overflow가 나는 것을 확인할 수 있다.

 

 

컴퓨터 설계자는 연산 오버플로우를 어떻게 처리할지 결정해야한다.

ex) C에서의 무시, ada나 Fortan 같이 예외 처리

 

MIPS는 오버플로를 탐지하면 예외(인터럽트라고도 한다.)를 발생시킨다.

 

오버플로가 발생하면 EPC(exception program counter)라고 불리는 레지스터에 오버플로가 발생한 명령어의 주소가 저장되고, 컴퓨터는 적절한 처리를 하기위해서 해당 루틴으로 점프한다. 이렇게 명령어 주소를 기억해서 해당 루틴 처리 후 다시 재실행시킬 수 있게 한다.