2012-05-11 3 views
5

이 코드를 살펴본 결과 rep cmpsb 라인에 대해 혼란 스럽습니다.CMPSB 명령어와 혼동 됨

.LOOP: 
     push cx 
     mov  cx, 0x000B       ; eleven character name 
     mov  si, ImageName       ; image name to find 
     push di 
rep cmpsb           ; test for entry match 
     pop  di 
     je  LOAD_FAT 
     pop  cx 
     add  di, 0x0020       ; queue next directory entry 
     loop .LOOP 
     jmp  FAILURE 

나는 cmpsb cx 시간을 반복한다는 것을 알고 있지만 두 문자열을 어떻게 비교합니까? 예를 들어 "Hey \ 0"과 "hey \ 0"을 비교하고이 루프가 4 개의 문자열을 비교한다고 가정 해보십시오. 첫 번째 문자는 다르며 그에 따라 EFlags 레지스터가 설정됩니다. 그러나 cmpsb 명령이 반복되고 다음 문자는 동일합니다. cmpsb이 어떻게 작동하는지 오해 한 것일 수 있지만이 루프가 두 문자열을 올바르게 비교하지 못하는 것 같습니다. 사실이 루프가 작동합니까?

+1

음, CMPSB가 CPU 매뉴얼에서 어떻게 작동하는지 보시지 않겠습니까? –

+0

음 @Alex 내가 그랬어. 혼동은 ** REP ** 명령 때문이었습니다. –

+0

REP는 자체 명령이 아닙니다. 명령 접두사, IOW 명령 수정 자입니다. 설명서에도 설명되어 있습니다. –

답변

10

REP가 작동하는 이유는 rep에 REPE (F3h)과 동일한 인코딩이 있기 때문입니다. 원칙적으로 REPE은 여기서 옳은 것이지만 어셈블러에 따라 올바른 REP를 취할 수도 있습니다.

그래서 실제로 거기에 REPE cmpsb가 있습니다. 단지 (dis) 어셈블러가 실제로 알지 못하는 것입니다.

1

당신은 cmpsb와 함께 REPE 또는 REPNE 접두사를 사용해야한다고 생각합니다.

+0

맞습니다. 여러분은'repe' (동등한 반복) 또는'repne' (반복하지 않고 반복)을 사용합니다. –

1

맞습니다.이 코드는 작동하지 않습니다. repe cmpsb을 사용해야합니다 (같은 비교 문자열을 반복하는 동안 반복하십시오).

0

내 이해에서 브로커 스턴 (brokenthorn)에 관한 동일한 튜토리얼을 통해, Imagename의 첫 번째 바이트와 동일한 경우 뚱뚱한 항목의 첫 번째 바이트를 비교합니다.

첫 번째 차이는 11 문자 (파일 이름 및 확장자)까지 계속됩니다. ZF 플래그가 같고 ZF 플래그가 지워진 채로 유지됩니다.

따라서 전체 파일 이름을 비교 한 후에 동일한 경우 해당 뚱뚱한 항목을로드하기 위해 점프합니다. 그렇지 않으면 다음 항목을로드하고 해당 파일 이름을 비교합니다.