윗분께서 잘못 답변하신게 있는데요,
ax는 16비트이므로 오버플로우 플래그는 지정되지 않습니다.
부호를 고려한 범위는 -32,768 ~ +32,767이 되기에 (결과값은 -135니깐 부호를 고려한 범위를 충족하겠죠?)
Overflow flag는 Set되지 않습니다. (OF = 0)
다음으로 작성자님께서 의문을 가지는 add와 sub 연산은
본질적으로 결과가 동일하게 나타나는 산술연산에 대해서 CF가 정반대로 도출됩니다.
이게 무슨 말이냐 하면...
좀 더 쉽게 알아보기 위해서 예제를 직접 들어서 설명하겠습니다.
그 전에 편의상 먼저 언급하신 연산을 1번, 후자를 2번으로 언급하겠습니다.
우선, 결과값 자체로만 따지면 1, 2번 연산의 결과값은 둘 다 -130으로 동일한데요,
다만, -5 + (-125)와 -5 - 125는 커다란 차이가 있습니다.
1번을 봅시다.
125 앞에 마이너스가 있으며 add 연산을 통해 처리됩니다.
125를 보수 처리 시키기 때문에 16진으로 환산하면 다음과 같이 되겠죠?
0xFFFF FFFB (-5)
0xFFFF FF83 (-125)
위의 두 16진수를 순수하게 더하면, 16비트 밖으로 자리올림(Carry)이 발생합니다.
결과값: 0x 1 FFFF FF7E
이때, 캐리된 bit는 자연스럽게 CF으로 넘어가서 Set 됩니다.
그렇기 때문에, 1번 연산에서는 CF가 셋팅되는 것이구요
2번의 경우,
sub연산은 실질적인 계산이 위와 동일한 방법으로 이루어지지만,
단, 한가지 차이점은 연산이 종료된 뒤에 캐리플래그를 비트반전 시키는 작업을 합니다.
(sub 명령어 구현의 특성상 그렇습니다.)
결론적으로 말하자면, 1 sub 2와 1 add (-2)를 할때
두연산의 결과로 나오는 캐리플래그 값은 정반대로 뜬다고 보시면 됩니다.
음
carry flag는 연산시 자리올림이나 borrow가 생기면 set됩니다.
-5 - 125시에는 borrow가 발생하기때문에 set되는겁니다.
또한 -128 ~ 127의 범위안에 표시할 수 없으므로 Overflow flag도 set 될겁니다.
위 답변 내용을 지적해드리고 몇가지 더 첨가하자면...
윗분께서 잘못 답변하신게 있는데요,
ax는 16비트이므로 오버플로우 플래그는 지정되지 않습니다.
부호를 고려한 범위는 -32,768 ~ +32,767이 되기에 (결과값은 -135니깐 부호를 고려한 범위를 충족하겠죠?)
Overflow flag는 Set되지 않습니다. (OF = 0)
다음으로 작성자님께서 의문을 가지는 add와 sub 연산은
본질적으로 결과가 동일하게 나타나는 산술연산에 대해서 CF가 정반대로 도출됩니다.
이게 무슨 말이냐 하면...
좀 더 쉽게 알아보기 위해서 예제를 직접 들어서 설명하겠습니다.
그 전에 편의상 먼저 언급하신 연산을 1번, 후자를 2번으로 언급하겠습니다.
우선, 결과값 자체로만 따지면 1, 2번 연산의 결과값은 둘 다 -130으로 동일한데요,
다만, -5 + (-125)와 -5 - 125는 커다란 차이가 있습니다.
1번을 봅시다.
125 앞에 마이너스가 있으며 add 연산을 통해 처리됩니다.
125를 보수 처리 시키기 때문에 16진으로 환산하면 다음과 같이 되겠죠?
0xFFFF FFFB (-5)
0xFFFF FF83 (-125)
위의 두 16진수를 순수하게 더하면, 16비트 밖으로 자리올림(Carry)이 발생합니다.
결과값: 0x 1 FFFF FF7E
이때, 캐리된 bit는 자연스럽게 CF으로 넘어가서 Set 됩니다.
그렇기 때문에, 1번 연산에서는 CF가 셋팅되는 것이구요
2번의 경우,
sub연산은 실질적인 계산이 위와 동일한 방법으로 이루어지지만,
단, 한가지 차이점은 연산이 종료된 뒤에 캐리플래그를 비트반전 시키는 작업을 합니다.
(sub 명령어 구현의 특성상 그렇습니다.)
결론적으로 말하자면, 1 sub 2와 1 add (-2)를 할때
두연산의 결과로 나오는 캐리플래그 값은 정반대로 뜬다고 보시면 됩니다.
1 add 2 = 3 (CF = 0)
1 sub (-2) = 3 (CF = 1)
3 add 5 = 8 (CF = 0)
3 sub (-5) = 8 (CF = 1)
직접 테스트해보세요.
정정합니다.
부호를 고려한 범위는 -32,768 ~ +32,767이 되기에 (결과값은 -135니깐 부호를 고려한 범위를 충족하겠죠?)
-> -135가 아니라 -130입니다.
댓글 달기