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 되지 않지.
'Assembly > 공개글' 카테고리의 다른 글
MIPS jal nop branch delay slot (0) | 2015.07.11 |
---|---|
x86/gcc에서 relative jump 사용하는법 (0) | 2015.02.08 |
intel 문법과 AT&T 문법에서 주소 참조 차이 (1) | 2015.01.07 |
어셈블리어는 unsigned/signed를 구분해서 처리한다. (0) | 2014.07.30 |
부동소수점 예외(core dumped) 에러 (0) | 2013.04.07 |