2012-03-20 2 views
6

방금 ​​IDA Pro에 파일을 열었고 완전히 쓸모없는 코드를 발견했습니다. 그러나, 나는 그것이 약간의 사용을 가지고 있을지도 모른다라고 생각했다. sub eax,0은 eax에서 0을 뺍니까?sub eax, 0 - 아무것도합니까?

코드 :

hinstDLL= dword ptr 4 
fdwReason= dword ptr 8 
lpReserved= dword ptr 0Ch 

mov  eax, [esp+fdwReason] 
sub  eax, 0 
jz  short loc_10001038 
+3

예, eax에서 0을 뺍니다. 그러나 그것은 * 무언가를한다. 깃발을 세운다. 예를 들어, 0으로 끝나는 유일한 방법은 eax가 0부터 시작하는 것입니다. – harold

답변

13

sub 지시 플래그 세트 (OF, SFZFdocumentation 따른 AF, PFCF는 참조) - mov 지시하지 않는다. jz은 제로 플래그 (ZF)가 설정된 경우에만 점프하므로 eax의 값을 기반으로 점프하려는 경우 해당 플래그를 적절히 설정해야합니다.

+0

TEST 명령어를 사용해야한다고 생각했습니다. 감사! –

+1

'test'는 암시 적 비트 AND를 수행하지만 모든 동일한 플래그에 영향을 미치지 않습니다. 'test' 문서에서 :'OF'와'CF' 플래그는'0'으로 설정되고 결과에 따라'SF','ZF'와'PF' 플래그가 설정됩니다 ... 'AF' 플래그는 정의되지 않았습니다. " –

6

sub 명령은 결과가 0이면 제로 플래그를 설정합니다. 이 경우 eax가 0이면 제로 플래그가 설정됩니다.

이렇게 세 명령어는 [esp+fdwReason]이 0인지 확인하고이 경우 loc_10001038으로 점프합니다.