Trong mã lắp ráp x86, là JE
và JNE
chính xác giống như JZ
và JNZ
?Sự khác biệt giữa JE/JNE và JZ/JNZ
Trả lời
JE
và JZ
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, JNE
và JNZ
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
JE
vàJNE
là thích hợp hơn sau khi một hướng dẫnCMP
: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 đượcZF=1
khi toán hạng đều bình đẳng vàZF=0
khi họ không.)
Từ Intel's manual - Instruction Set Reference, các JE
và JZ
có opcode cùng (74
cho rel8/0F 84
cho rel 16/32) cũng JNE
và JNZ
(75
cho rel8/0F 85
cho rel 16/32) chia sẻ opcodes.
JE
và JZ
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).
Long trả lời: yes. –
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ự.) –
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. –