eax에는 1234567이 들어있고


imul        eax

하게 되면 eax 제곱한 결과가 edx:eax에 들어가잖아

1234567의 제곱이 32비트론 표현이 안되고 64비트로 표현할 수 있는 값이거든

근데 플래그 레지스터 값을 찍어보니까 오버플로우랑 캐리플래그가 set 됐더라고

캐리플래그야 32비트로 표현 못하니까 당연한데

오버플로우는 발생 안해야 하는것 아닌가? 원래 32비트를 기준으로 오버플로우 플래그가 set/unset 되는

건가?

-------------------------------------------------------

cf 하고 of 의 차이는 부호비트를 어떻게 해석하느냐의 문제다. 1234567^2 는 당연히 1조가 넘으니 32비트 기준으로 부호비트를 음수로 해석하던 안하던 관계없이(즉 signed/unsigned 관계없이) 무조건 초과니까 CF하고 OF 둘 다 set 되는게 정상이지.

아 물론 이건 어떤 인스트럭션을 사용했느냐에 따라서도 차이가 있는데, 

그냥 mul eax 라고 할 경우 만약 연산 결과가 30억 정도라고 하면 CF 와 OF 둘 다 unset 이고, imul eax 라고 하면 연산 결과가 30억 정도이면 CF 와 OF 둘 다 set 된다

가령 add 연산 같은 경우 부호 비트에 따른 연산이 따로 있지 않기 때문에 원래 0x7FFFFFFF 를 안넘던 어떤 값이 연산 후 0x7FFFFFFF 를 넘기는 순간 OF 만 set 되고 CF는 set 되지 않지. 





Posted by huammmm1
,