맨위로

기타2011. 12. 23. 22:06

산술 연산 플래그  

-오버 플로우 플래그

 CF: 부호 있는 인자에 대한 오버플로우

 OF: 부호 없는 인자에 대한 오버플로우

 

CF (Carry Flag ) 와 OF (Overflow Flag) 는 오버플로우가 발생했음을 알리기 위한 플래그이다.

어떤 산술 연산의 결과가 너무 커서 그것을 인자에 완전히 표현하기 힘들 떄 프로그램에서 오버플로우를 알리기 위해서 사용된다.

두 플래그간의 차이점은 프로그램이 처리하는 데이터의 타입과 관계가 있다. MUL(곱하기)과 DIV(나누기) 같은 명령에서는 처리하는 인자가 부호 있는 값인지 부호 없는 값인지에 따라 다른 명령을 사용한다 .(인자의 타입에 따라 곱하기와 나누기 연산의 결과 값이 달라지므로) 오버플로우의 경우에도 부호 있는 값인지 없는 값인지가 고려 되어야 한다. 부호 있는 정수 값은 동일한 크기의 부호 없는 정수 값보다 1비트 작으므로 서로 다르게 인지되어야 한다.

이떄문에 캐리플래그 와 오버플로우 플래그가 각기 다르게 사용된다.

예를 들어

mov   ax, 0x1126    (10잔수 4390

mov   bx, 0x7200    (10진수 29184

add   ax, bx

이 연산은 목적지 인자가 부호 있는 값으로 처리되는지 부호 없는 값으로 처리되는지에 따라 다른결과를 만들어 낸다. 결과 값을 16진수로 표현하면 0x8326 이다 AX 레지스터의 값이 부호 없는 값이 라면 0x8326 10진수 33574가된다. 만약 AX 레지스터 값이 부호 있는 값이면 오버플로우가 발생한다.

부호 있는 16비트 인자가 가질수있는 수는 32767 이 최대인데 그범위를 넘었다. 따라서 AX레지스터는 오버플로우가 발생한다. 결국 인자를 부호 없는 값으로 봤을 때는 오버플로우가 발생하지 않지만 인자를 부호 있는 값으로 봤을 떄 오버플로우가 발생한다.  따라서 앞의 코드는 OF(부호 있는 인자에 대한 오버플로우)의 값이 1이되고 CF(부호 없는 인자에 대한 오버플로우)의 값은 0 이 된다.

 

-제로플래그 (ZF)

제로플래그는 산술연산의 결과 값이 0일떄 1이되고 그외의 경우에는 0이된다. 두인자값이 같은지 비교하는 경우에 가장 많이 사용된다.

 

-부호 플래그 (SF)

부호 플래그는 결과 값의 최상위 비트 값을 나타낸다. 부호 있는 정수의 경우에는 부호 플래그의 값이 해당 정수의 부호를 나타낸다. SF 값이 1이면 음수 0이면 양수를 나타낸다.

 

-패리티 플래그(PF)

패리티 플래그는 어떤 산술 연산결과 값의 하위 8비트의 바이너리 패리티를 나타낸다 . 바이너리 패리티는 값이 1인 비트의 수를 의미한다.

 

'리버싱 - 리버스 엔지니어링 비밀을 파헤지다' 를 바탕으로 작성됨

'기타' 카테고리의 다른 글

안티 리버싱 기술  (0) 2011.12.23
산술 연산 플래그  (0) 2011.12.23
PE 파일 포맷의 디렉토리  (0) 2011.12.23
리버싱 툴  (0) 2011.12.23

Posted by STIH

댓글을 달아 주세요