2013-01-10 22 views
54

Trong mã lắp ráp x86, là JEJNE chính xác giống như JZJNZ?Sự khác biệt giữa JE/JNE và JZ/JNZ

+38

Long trả lời: yes. –

+6

Câu trả lời ngắn gọn: không. (Nhưng chúng tương ứng với * chính xác * cùng một mã máy, vì vậy chúng làm * chính xác * cùng một thứ. Chúng chỉ có các phép ghi nhớ khác nhau để so sánh tương tự.) –

+3

JE có nghĩa là nhảy nếu bằng nhau, bằng nếu so sánh trước có z cờ đặt, JZ có nghĩa là nhảy nếu cờ z được thiết lập. Họ là chính xác như nhau, một số folks muốn suy nghĩ/viết về so sánh của tôi là bằng nhau hoặc không bằng nhau. Một số người suy nghĩ và viết về mặt là cờ z hoặc z cờ rõ ràng. –

Trả lời

75

JEJZ là tên chỉ khác nhau cho chính xác những điều tương tự: một bước nhảy có điều kiện khi ZF (các "zero" cờ) là bằng 1.

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

bạn 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 gì bạn đang làm:

  • JZ/JNZ là thích hợp hơn khi bạn đang thử nghiệm một cách rõ ràng cho một cái gì đó là bằng zero:

    dec ecx 
    jz counter_is_now_zero 
    
  • JEJNE là thích hợp hơn sau khi một hướng dẫn CMP :

    cmp edx, 42 
    je the_answer_is_42 
    

    (Lệnh A CMP 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=1 khi toán hạng đều bình đẳng và ZF=0 khi họ không.)

30

Từ Intel's manual - Instruction Set Reference, các JEJZ có opcode cùng (74 cho rel8/0F 84 cho rel 16/32) cũng JNEJNZ (75 cho rel8/0F 85 cho rel 16/32) chia sẻ opcodes.

JEJZ cả hai đều kiểm cho các ZF (hoặc không có lá cờ), mặc dù hướng dẫn hơi khác trong mô tả của các JE rel8 đầu tiên và JZ rel8 ZF sử dụng, nhưng về cơ bản họ đều giống nhau.

Dưới đây là một đoạn trích từ các trang của nhãn hiệu 464, 465 và 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).