2013-02-12 2 views
15

내가 잘못하면 나를 수정하십시오.JNZ 및 CMP 조립 지침

이것은 내 이해 JNZCMP입니다.

JNZ - Z 신고가되어 있지 않은 경우 점프가 일어날 것이다 제로 (1)

CMP - 두 값이 동일한 경우, Z 플래그 설정 (1) 그렇지 않으면이 설정되지 않은 (0)

Olly DBG

내가보고하고 플래시 튜토리얼입니다. 그것은 간단한 CrackMe에 대한 해결책을 가르치고 있습니다.

앞에서 살펴본 지침에서는 AL47h을 비교했습니다. 그들은 동등하고 Z 플래그를 설정했습니다. (오른쪽에있는 레지스터 창에서 볼 수 있습니다)

다음 명령어는 JNZ입니다. 나의 이해는 점프가 Z 플래그가 설정되면 일어날 것입니다. Z 플래그가 설정되었지만 점프가 수행되지 않습니다!

왜?

+1

@nrz 귀하의 의견은 분명하지 않습니다 - 진술서를보고 실수로 깨닫게 될 OP가 정말 정말 열심히입니까? –

+0

@nrz Jeez 남자는 나를 더 혼란스럽게하려고합니까?!?! 다른 답변에서 JNZ의 경우 점프는 제로 플래그가 (0) –

+1

@ 43.52.4D로 설정되지 않은 경우에만 발생한다는 것을 알았습니다. 죄송합니다. "JNZ - Z 플래그가 0이 아닌 경우 점프가 발생합니다."라는 문장을 읽으므로 결과가 혼동 스럽기 때문에 지금 삭제했습니다. [Intel x86 JUMP 빠른 참조] (http://www.unixwiz.net/techtips/x86-jumps.html)에는 여러 x86 조건부 점프의 분기 조건을 확인하는 유용한 테이블이 있습니다. – nrz

답변

24

JNZ는 "0이 아닌 경우 점프 (ZF = 0)"및 이 아닌 경우 "ZF가 설정된 경우 점프"의 줄임말입니다.

기억하기가 더 쉬운 경우 JNZ와 JNE (같지 않을 경우 점프)가 동일하다고 생각하십시오. 따라서 cmp al, 47을 수행 할 때 AL의 내용이 47이면 ZF가 설정되고 점프 (같지 않은 경우 - JNE)를 수행해서는 안됩니다.

11

여기에 좀 더 넓은 대답을하겠습니다.

일반적으로 86 조건부 점프의 두 가지 유형이 말하는 :

  1. 산술 점프 - JZ 같은 (점프 제로 경우), JC (점프 캐리 경우), JNC (수행하지 않을 경우 점프) 등 .

  2. 비교 점프 - JE (점프 동일한 경우), JB (점프 아래 경우) JAE (점프 상기거나 같은 경우) 등

따라서 만 연산 후의 제 1 타입을 사용 또는 논리적 인 지시 TIONS :

sub eax, ebx 
jnz .result_is_not_zero 

and ecx, edx 
jz .the_bit_is_not_set 

는 CMP 명령 후 두 번째 그룹을 사용

cmp eax, ebx 
jne .eax_is_not_equal_to_ebx 

cmp ecx, edx 
ja .ecx_is_above_than_edx 

이 방법을, 프로그램은 더 읽기되고 당신은 혼동되지 않습니다.

때때로 이러한 지침은 실제로 동의어입니다. JZ == JE; JC == JB; JNC == JAE 등등. 전체 테이블은 다음과 같습니다.당신이 볼 수 있듯이, 16 조건부 점프 명령하지만, 30 니모닉이 있습니다 - 그들은 더 많은 읽을 수있는 소스 코드를 생성 할 수 있도록 제공됩니다하지 제로 (0 경우 JNZ가 점프를 의미하는 것처럼 보인다 처음

Mnemonic  Condition tested Description 

jo    OF = 1   overflow 
jno    OF = 0   not overflow 
jc, jb, jnae CF = 1   carry/below/not above nor equal 
jnc, jae, jnb CF = 0   not carry/above or equal/not below 
je, jz   ZF = 1   equal/zero 
jne, jnz  ZF = 0   not equal/not zero 
jbe, jna  CF or ZF = 1  below or equal/not above 
ja, jnbe  CF or ZF = 0  above/not below or equal 
js    SF = 1   sign 
jns    SF = 0   not sign 
jp, jpe   PF = 1   parity/parity even 
jnp, jpo  PF = 0   not parity/parity odd 
jl, jnge  SF xor OF = 1  less/not greater nor equal 
jge, jnl  SF xor OF = 0  greater or equal/not less 
jle, jng (SF xor OF) or ZF = 1 less or equal/not greater 
jg, jnle (SF xor OF) or ZF = 0 greater/not less nor equal 
2

을), 제로 플래그가 1/설정이면 점프와 같습니다.

하지만 현실에서는 점프 (if)가 0이 아닌 (설정 됨) 것을 의미합니다.

0이 설정되지 않은 = 경우 다음 설정 1 = 단지 기억 : 제로 플래그 (0) 실제로

0
JNZ  Jump if Not Zero ZF=0 

,이 혼란 잘 설정되지 않은 경우
JNZ가 이동합니다.

이해하기 쉽게하려면 0이 아님으로 설정하고을 지정하십시오. 설정되지 않음, 따라서

JNZ  Jump if Not Set  ZF=0 

(이 자신의 이해를위한 참고하시기 바랍니다)은 플래그 Z = 0 그래서 점프

세트 플래그 Z를 의미합니다 (설정되어 있지 않은 경우 이동) = 1을 의미한다 따라서 점프하지 마십시오