이전 글
2020/07/04 - [IT/컴퓨터 시스템 개론] - [Logic Gate] 4bit 가산기, 가감산기
Status Register
CPU에는 Instruction 결과의 상태를 알려주는 상태 레지스터가 있다.
상태 레지스터에는 대표적으로 아래의 flag bit들이 모여있다.
- N (Negative) : 연산 결과가 음수인 경우 참
- Z (Zero) : 연산 결과가 0인 경우 참
- V (Overflow) : 연산 결과가 표현될 수 있는 비트 범위를 넘긴 경우 참
- C (Carry) : 연산 결과가 최상위 비트(MSB)에서 그 위의 비트로 비트 범위를 넘어서 자리올림이 발생하는 경우 참
Overflow vs Carry
Overflow와 Carry를 종종 헷갈려하는 경우가 있어 둘의 차이점을 설명하자면,
Overflow는 연산 결과가 해당 시스템에서 표현 가능한 숫자 범위를 넘어가는 경우 발생하는 오류이다.
예를 들어 8bit 시스템에서는 -128 ~ 127까지의 숫자 표현이 가능하다.
01111111⑵ + 00000001⑵의 경우 127+1=128 이므로 표현 가능한 숫자 범위를 넘어섰다.
이를 overflow라고 한다.
Carry는 최상위 비트에서 그 위의 비트로 자리올림이 발생하는 경우이다.
예를 들어 8bit 시스템에서 1과 -1을 더해보자.
00000001⑵ + 11111111⑵ = 1 00000000⑵ 연산이 이루어진다.
결과에서 알 수 있듯이 carry가 발생하였지만, 8bit 시스템에서 표현이 불가능하므로 무시되고 정상적으로 0을 도출한다.
이렇듯 carry flag는 부호 없는(unsigned) 연산에서 의미가 있으며, 부호있는(signed) 연산에서는 별로 의미가 없다.
overflow는 양수+양수 또는 음수+음수인 경우에만 발생하게 된다.
당연하게도 overflow flag는 부호없는(unsigned) 연산에서는 의미가 없다.
4-bit 감가산기에서 Status Bits 구하기
이전 글에서 다룬 4-bit 덧셈 뺄셈 연산에서 NZVC bit를 구해보자.
N(음수)
위의 예제는 1-2를 연산한 결과이다.
2의 보수 표현에서 이진수의 첫 번째 bit가 0인 경우 양수, 1인 경우 음수이다.
따라서 연산 결과의 첫번째 bit를 그대로 N flag에 넣으면 된다.
Z(0)
연산 결과가 0인지 판단하는 것은 정말 간단하다. 결괏값의 모든 bit가 0이면 된다.
4개의 결과 bit를 OR 연산하면 4개 모두 0인 경우만 0이 출력되며, 하나라도 1인 경우 1이 출력된다.
따라서 4개의 결과 bit를 OR 연산한 후 NOT 연산을 하여 Z Flag에 넣으면 된다.
V(오버플로우)
위에서 언급했듯이 양수+양수 또는 음수+음수 연산의 경우에만 오버플로우가 발생할 수 있다.
양수 오버플로우의 경우 ⓐ carry가 1, ⓑ carry가 0이 된다.
음수 오버플로우의 경우 ⓑ carry가 1, ⓐ carry가 0이 된다.
위의 예제는 4bit 시스템에서 표현 가능한 숫자 범위(-8 ~ 7)를 넘는 연산이다.
양수 오버플로우와 음수 오버플로우를 동시에 판단하기 위해 ⓐ와 ⓑ를 XOR 연산하여 V flag에 넣으면 된다.
C(캐리)
최종 carry가 있는지 없는지만 판단하여 그대로 C Flag에 넣으면 된다.