[assembly] JE / JNE와 JZ / JNZ의 차이점

86 어셈블리 코드에서 있습니다 JEJNE정확히 같은 JZJNZ?



답변

JE그리고 JZ때 조건부 점프 : 정확히 같은 것은 단지 다른 이름은 ZF(이하 “영”플래그)가 1과 같다.

(유사 JNE하며 JNZ때 조건부 점프 단지 다른 이름은 ZF0과 동일하다)

당신은 수있는 상호 교환을 사용하지만, 당신은 해야 당신이 무엇을하고 있는지에 따라 사용할 :

  • JZ/ JNZ는 0과 같은 것을 명시 적으로 테스트 할 때 더 적합합니다.

    dec  ecx
    jz   counter_is_now_zero
    
  • JE그리고 지시 JNE후에 더 적절 CMP합니다 :

    cmp  edx, 42
    je   the_answer_is_42
    

    ( CMP명령은 빼기를 수행하고 플래그를 유지하면서 결과 값을 버립니다. 이것이 ZF=1피연산자가 같고 같지 않을 때 얻는 이유 ZF=0입니다.)


답변

로부터 명령 세트 참조 – 인텔의 매뉴얼JEJZ(동일한 연산 코드가 74rel8에 대한 / 0F 84도 확인해 16/32를 들어) JNEJNZ( 75rel8에 대한 / 0F 85확인해위한 16/32) 공유 옵 코드.

JE그리고 JZ그들 모두에 대한 검사 ZF(또는 제로 플래그), 수동 약간 처음의 설명에서 다르지만 JErel8 및 JZrel8 ZF사용하지만, 기본적으로 그들은 동일합니다.

다음은 매뉴얼의 464, 465 및 467 페이지에서 발췌 한 것입니다.

 Op Code    | mnemonic  | Description
 -----------|-----------|-----------------------------------------------
 74 cb      | JE rel8   | Jump short if equal (ZF=1).
 74 cb      | JZ rel8   | Jump short if zero (ZF ← 1).

 0F 84 cw   | JE rel16  | Jump near if equal (ZF=1). Not supported in 64-bit mode.
 0F 84 cw   | JZ rel16  | Jump near if 0 (ZF=1). Not supported in 64-bit mode.

 0F 84 cd   | JE rel32  | Jump near if equal (ZF=1).
 0F 84 cd   | JZ rel32  | Jump near if 0 (ZF=1).

 75 cb      | JNE rel8  | Jump short if not equal (ZF=0).
 75 cb      | JNZ rel8  | Jump short if not zero (ZF=0).

 0F 85 cd   | JNE rel32 | Jump near if not equal (ZF=0).
 0F 85 cd   | JNZ rel32 | Jump near if not zero (ZF=0).


답변

  je : Jump if equal:

  399  3fb:   64 48 33 0c 25 28 00    xor    %fs:0x28,%rcx
  400  402:   00 00
  401  404:   74 05                   je     40b <sims_get_counter+0x51>


답변