Sự khác biệt giữa JE / JNE và JZ / JNZ


88

Trong mã hợp ngữ x86, có JEJNEchính xác giống với JZJNZkhông?


59
Câu trả lời dài: có.
Hans Passant

9
Câu trả lời ngắn gọn: không. (Tuy nhiên, chúng tương ứng với chính xác mã cùng một máy, vì vậy họ làm chính xác những điều tương tự Họ chỉ có việc nhớ mật khẩu khác nhau cho các so sánh tương tự..)

4
JE có nghĩa là nhảy nếu bằng nhau, nó bằng nếu so sánh trước có cờ z được đặt, JZ có nghĩa là nhảy nếu cờ z được đặt. Chúng hoàn toàn giống nhau, một số người muốn nghĩ / viết về sự so sánh của tôi là bằng hay không bằng. Một số người nghĩ và viết về cách đặt cờ z hoặc cờ z rõ ràng.
old_timer

Câu trả lời:


124

JEJZchỉ là các tên khác nhau cho cùng một thứ: bước nhảy có điều kiện khi ZF(cờ "không") bằng 1.

(Tương tự, JNEJNZchỉ là các tên khác nhau cho một bước nhảy có điều kiện khi ZFbằng 0.)

Bạn có thể sử dụng chúng thay thế cho nhau, nhưng bạn nên sử dụng chúng tùy thuộc vào những gì bạn đang làm:

  • JZ/ JNZthích hợp hơn khi bạn đang kiểm tra rõ ràng một cái gì đó bằng 0:

    dec  ecx
    jz   counter_is_now_zero
    
  • JEJNEthích hợp hơn sau khi có CMPhướng dẫn:

    cmp  edx, 42
    je   the_answer_is_42
    

    (Một CMPlệnh thực hiện phép trừ và ném giá trị của kết quả đi, trong khi vẫn giữ các cờ; đó là lý do tại sao bạn nhận được ZF=1khi các toán hạng bằng nhau và ZF=0khi chúng không bằng nhau .)


2
TL: DR: hoạt động của máy giống nhau, ngữ nghĩa khác nhau . Cũng giống như jb/ jc/ jnaetất cả thử nghiệm CF = 1. Xem felixcloutier.com/x86/jcc (hoặc cmovcc hoặc setcc)
Peter Cordes

36

Từ hướng dẫn sử dụng của Intel - Tham chiếu Bộ hướng dẫn , JEJZcó cùng một opcode ( 74cho rel8 / 0F 84cho rel 16/32) JNEJNZ( 75cho rel8 / 0F 85cho rel 16/32) cũng chia sẻ các opcode.

JEJZcả hai đều kiểm tra ZFcờ (hoặc cờ không), mặc dù hướng dẫn sử dụng khác nhau một chút trong mô tả về cách sử dụng rel8 JEvà rel8 đầu tiên , nhưng về cơ bản chúng giống nhau.JZZF

Đây là phần trích dẫn từ các trang 464, 465 và 467 của sách hướng dẫn.

 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).

-5
  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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.