컴퓨터 시스템 설계, 논리설계 수업을 들으면서 NZCV flag를 활용한 대소비교를 자주 했는데 할 때마다 헷갈려 한 번 정리를 하고 가겠습니다.
일단 nzcv부터 정리하고 갈게요.
n: negative
z: zero
c: carry
v: overflow
A-B를 실행 했을 때의 결과입니다.
A,B가 signed,unsigned 일때 다르므로, 구분해서 정리하겠습니다.
Unsigned int의 경우
1. ==
동일한 비트인지 확인할 때는
Z=1인지로 확인합니다.
2. !=
==의 반대이기에 ~Z이면 됩니다.
3. >=
1. A,B의 MSB가 0일때
ex)A가 0100 이라면 B는 00xx가 됩니다. A-B == A+(~B)+1이므로 0100+11(~x)(~x)+1이됩니다. 필연적으로 캐리가 일어날 수 밖에 없습니다.
2. A의 MSB가 1, B는 0일때
A-B == A+(~B)+1 다음 과정에서 MSB가 둘 다 1이므로 carry가 발생합니다.
3.둘 다 1 일때
ex) A가 1100이면 B는 10xx이고 A-B == A+(~B)+1 후 1100 + 01(~x)(~x) + 1이 됩니다. carry가 발생하죠.
추가로 1-1을 하여도 캐리가 발생하므로 >=의 조건은 C입니다.
4. <
3번의 반대이므로 ~C입니다.
5. >
3번에서 ==을 제외하면 되므로 C &(~Z)입니다.
6. <=
4번이랑 ==을 합치면 되므로 ~C|Z입니다.
Signed int의 경우
나머지는 모두 동일하기에 <방식만 하겠습니다.
Negative이면 되므로 N이면 됩니다. 허나 overflow가 발생해서 negative이면 안되므로 N xor V을 해줍니다.
Unsigned에서는 캐리를, Signed에서는 overflow를 바탕으로 구한다는 것을 마지막으로 글 마치겠습니다.