오버플로우 플래그가 on 되는 바이너리/정수 연산도 두개다 :
1. 두 수의 합으로 부호 비트가 on 되었을때, "오버플러우" 플래그가 on된다.
0100 + 0100 = 1000 (overflow flag is turned on)
2. 두 수의 합으로 부호 비트가 off 되었을때, "오버플로우" 플래그가 on 된다.
1000 + 1000 = 0000 (overflow flag is turned on)
다른 경우, 오버플로우 플래그는 off 됨.
* 0100 + 0001 = 0101 (overflow flag is turned off)
* 0110 + 1001 = 1111 (overflow flag is turned off)
* 1000 + 0001 = 1001 (overflow flag is turned off)
* 1100 + 1100 = 1000 (overflow flag is turned off)
오직 세 숫자들의 부호 비트(최고왼편)를 보면 오버플로우 플래그가 on 이나 off 되는지 알 수 있다.
만약 2의 보수(signed) 연산을 수행한다면, 오버플로우 플래그는 이것이 잘못 됐는지를 나타낸다. - 두 양수를 더해서 음수를 얻거나 두 음수를 더해서 양수를 얻거나 하는 경우가 이를 나타낸다.
만약 unsinged 연산을 수행한다면, 오버플로우 플래그는 아무것도 의미하지 않으니 무시하면 되겠다.
이 규칙은 2의 보수 결과의 부호를 검사함으로서 에러를 검출하기 위함이다. 음수와 양수 간의 덧셈은 절대로 잘못될 수 없다. 왜냐면 두 수의 합이기 때문이다. 두 피연산자들이 각자의 숫자에 허용되는 값에 맞다면, 그 둘의 합의 결과도 적합하게 된다. 다른 부호간의 덧셈은 절대로 오버플로우의 플래그를 on 하지 않는다.
보통 overflow 를 흘러넘치다라는 표현으로 받아들이고, overflow랑 carry를 혼동하는 경우가 많다.
나같은 경우, 정확하기 이해하기 전에는 이 두 개념을 완전히 서로 반대로 이해하고 있었는데,
예를 들어 4-bit 연산을 한다고 했을 때,
1) 1000 + 1000 = 10000 (여기서 맨 앞에 있는 1은 사라지게 됨)
이런 경우 overflow가 되는 것이라고 생각했다. (왜냐하면 4개의 비트에서 흘러넘쳤으니깐)
하지만 이 경우에는 carry flag가 set되는 것이다.
즉, carry flag는 최상단 비트에서 캐리가 생겼을 때 set 된다!
반면,
2) 0111 + 0001 = 1000
그리고 이 경우에는 overflow flag가 set되는 것이다.
왜냐하면, 이들이 signed expression이라고 가정했을 때, 7+1 = 8이 나와야 하지만, -8이 나왔기 때문이다. (overflow로 인한 잘못된 결과)
즉, 부호가 있는 연산에서 최대 표현 숫자를 넘어서서 오버플로우가 난 경우 overflow flag가 set된다!
(같은 부호를 더했을 때 다른 부호가 나오는 것으로도 오버플로우를 인지할 수 있다.)
따라서, signed 에서만 overflow flag가 의미 있고,
unsigned 에서만 carry flag가 의미가 있는 것이다.
하지만 주의해야 할 점은 CPU는 signed/unsigned와 같은 의미를 모른다.
따라서, 내가 지금 무슨 연산을 하고 있던 간에 overflow flag가 set되야 할 때, carry flag가 set되야 할 때는 독립적인 사건이다.
즉, 1000 + 1000 = 10000과 같은 상황에서는 두 플래그가 모두 셋이 될 것이다.
왜냐하면, 부호가 있다고 생각하든 없다고 생각하든, 최상단 비트에서 carry가 생겼으며,
두개의 입력값 모두 최상단 비트는 1인데 결과는 최상단 비트가 0이 되었으므로 오버플로우 플래그도 세팅이 되는 것이다.
즉, 내가 지금 signed 연산을 하고 있더라도, carry flag는 의미는 없지만, set될 수도 있고 아닐 수도 있는 것이다.
왜 의미가 없냐 하면, 어차피 signed연산을 하는 시점에서는 최상단 비트는 오로지 부호의 역할만 하므로 그 이후 캐리가 생기고 말고는 의미가 없는 것이다.
출처: https://thinkpro.tistory.com/137 [THINK-PRO BLOG]
'PC리버싱 > (구)기초' 카테고리의 다른 글
어셈블리어에대해서 명령어 (0) | 2020.03.24 |
---|---|
진짜 간단한 리버싱의 기초 (0) | 2020.03.17 |
플래그(상태) 레지스터 (0) | 2020.03.15 |
레지스터 (0) | 2020.03.15 |
세그먼트 레지스터 (0) | 2020.03.15 |