Trong mã hợp ngữ x86, có JE
và JNE
chính xác giống với JZ
và JNZ
không?
Trong mã hợp ngữ x86, có JE
và JNE
chính xác giống với JZ
và JNZ
không?
Câu trả lời:
JE
và JZ
chỉ 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ự, JNE
và JNZ
chỉ là các tên khác nhau cho một bước nhảy có điều kiện khi ZF
bằ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
/ JNZ
thí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
JE
và JNE
thích hợp hơn sau khi có CMP
hướng dẫn:
cmp edx, 42
je the_answer_is_42
(Một CMP
lệ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=1
khi các toán hạng bằng nhau và ZF=0
khi chúng không bằng nhau .)
jb
/ jc
/ jnae
tất cả thử nghiệm CF = 1. Xem felixcloutier.com/x86/jcc (hoặc cmovcc hoặc setcc)
Từ hướng dẫn sử dụng của Intel - Tham chiếu Bộ hướng dẫn , JE
và JZ
có cùng một opcode ( 74
cho rel8 / 0F 84
cho rel 16/32) JNE
và JNZ
( 75
cho rel8 / 0F 85
cho rel 16/32) cũng chia sẻ các opcode.
JE
và JZ
cả hai đều kiểm tra ZF
cờ (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 JE
và rel8 đầu tiên , nhưng về cơ bản chúng giống nhau.JZ
ZF
Đâ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).