[ARM 아키텍처] 32bit ALU 가산 감산의 원리
본문 바로가기
펌웨어/ARM

[ARM 아키텍처] 32bit ALU 가산 감산의 원리

by Macgyvering2 2020. 10. 2.

ARM CPU의 ALU 안에는 32bit 가산기가 들어있다.

 

여기서 가산기는 논리회로 시간에 배우는 가산기와 같은 원리이다.

 

컴퓨터에서는 덧셈 연산도 하지만 뺄셈 연산도 필요하다.

 

 

근데 여기서 한가지 기억할 점은 보수 체계를 이용하면 뺄셈을 간단하게 구현할 수 있다는 점이다. 

 

예를 들어 10 - 6을 계산하고자 한다면

 

보수 체계를 이용하여 가산 연산을 한다는 것은 10 + (-6)을 한다는 것이다.

 

이 때 +6을 -6으로 바꾸는 작업이 "n의 보수를 취한다" 라고 말한다. (n진수에서)

 

여기서 n은 진수이고 통상 컴퓨터는 2진수로 연산하기 때문에 2의 보수를 취한다.

 

2의 보수는 1의 보수에 1을 더한 값으로 구할 수 있다.

 

1의 보수는 단순히 0을 1로 바꾸고 1을 0으로 바꾼 것이다.

 

 

8비트를 예를 들어보자.

 

10과 6을 각각 2진수로 표현하면 00001010과 00000110이다. 

 

여기서 맨 앞자리의 수는 부호 비트로 0이기 때문에 +임을 의미한다.

 

6을 2의 보수를 취한다는 것은 1의 보수를 취하고(00000110 -> 11111001)

 

거기에 +1을 하는 것(11111001+1 = 11111010)이다.

 

이것이 6을 2의 보수를 취한 값이 되고, 이는 -6을 의미한다.

 

결국 10+(-6)의 결과는 00001010+11111010 = 1_ 00000100이 된다.

 

앞의 1은 8비트 체계를 넘어서는 자리올림(Carry Out)이 발생한 것이다.

 

이를 그냥 무시하면 4라는 결과가 나오는 것을 확인할 수 있다.

 

마이너스 연산을 할 때는 결국 가산기에 보수 연산된 결과를 추가적으로 넣어주면 되는 것이다.

 

 

회로도를 살펴보자.

 

MUX와 Adder는 전부 표시하면 복잡해보이기 때문에 블랙박스 처리하였다.

 

a와 b에 피연산자가 들어가게 되고

 

Select에 0을 넣으면 가산연산(a+b)을, 1을 넣으면 감산연산(a-b)을 실행한다.

 

주목할만한 아이디어는 Select 신호에 1을 넣으면 Carry-in에도 1이 들어가도록하여

 

~b + 1(2의 보수 연산)을 취하여 가산연산을 한다는 점이다.

 

 

댓글