Trong mã hợp ngữ x86, có JEvà JNEchính xác giống với JZvà JNZkhông?
Trong mã hợp ngữ x86, có JEvà JNEchính xác giống với JZvà JNZkhông?
Câu trả lời:
JEvà JZchỉ 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ự, JNEvà JNZchỉ 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
JEvà JNEthí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 .)
jb/ jc/ jnaetấ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 , JEvà JZcó cùng một opcode ( 74cho rel8 / 0F 84cho rel 16/32) JNEvà JNZ( 75cho rel8 / 0F 85cho rel 16/32) cũng chia sẻ các opcode.
JEvà JZcả 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).