2013-02-12 41 views
15

Sửa lỗi nếu tôi sai.Hướng dẫn Lắp ráp JNZ & CMP

Đây là hiểu biết của tôi về JNZCMP.

JNZ - Các bước nhảy sẽ diễn ra nếu Z Flag là KHÔNG zero (1)

CMP - Nếu hai giá trị đều bình đẳng, các Z Cờ được thiết lập (1) nếu không nó không được thiết lập (0)

Olly DBG

Đây là hướng dẫn flash tôi đang xem. Nó đang dạy giải pháp cho một CrackMe đơn giản.

Như bạn có thể thấy, hướng dẫn trước đây so sánh AL với 47h. Chúng bằng nhau, đặt cờ Z. (Bạn có thể thấy nó trong cửa sổ Đăng ký ở bên phải)

Hướng dẫn tiếp theo là JNZ. Sự hiểu biết của tôi là bước nhảy sẽ diễn ra nếu cờ Z được đặt. Đã đặt cờ Z, nhưng bước nhảy không diễn ra!

Tại sao?

+1

@nrz Lời nhận xét của bạn không rõ ràng - OP có phải là người mong đợi nhận ra sai lầm bằng cách nhìn vào tuyên bố thực sự, thực sự khó khăn? –

+0

@nrz Jeez người đàn ông là bạn đang cố gắng để gây nhầm lẫn cho tôi nhiều hơn?!?! Từ các câu trả lời khác, bây giờ tôi biết rằng với JNZ, bước nhảy chỉ diễn ra nếu cờ zero không được thiết lập (0) –

+1

@ 43.52.4D. Xin lỗi, tôi đã đọc sai câu "JNZ - Bước nhảy sẽ diễn ra nếu cờ Z không phải là số không (1)" trong câu hỏi của bạn và kết quả là nhận xét của tôi có thể gây nhầm lẫn, vì vậy tôi đã xóa nó ngay bây giờ. [Tham khảo nhanh Intel x86 JUMP] (http://www.unixwiz.net/techtips/x86-jumps.html) có một bảng hữu ích để kiểm tra các điều kiện phân nhánh của các bước nhảy có điều kiện x86 khác nhau. – nrz

Trả lời

24

JNZ viết tắt của "Nhảy nếu không phải số không (ZF = 0)" và NOT "Nhảy nếu ZF được đặt".

Nếu dễ nhớ hơn, hãy xem xét JNZ và JNE (nhảy nếu không bằng nhau) là tương đương. Do đó, khi bạn đang thực hiện cmp al, 47 và nội dung của AL bằng 47, ZF được đặt, không thể thực hiện bước nhảy (nếu không bằng - JNE).

11

Tôi sẽ trả lời một chút rộng hơn ở đây.

Có nói chung hai loại nhảy có điều kiện trong x86:

  1. số học nhảy - như JZ (nhảy nếu không), JC (nhảy nếu carry), JNC (nhảy nếu không mang theo), vv .

  2. So sánh nhảy - JE (nhảy nếu bằng), JB (nhảy nếu dưới đây), JAE (nhảy nếu trên hoặc bằng) vv

Vì vậy, sử dụng các loại đầu tiên chỉ sau khi số học hoặc hướng dẫn hợp lý tions:

sub eax, ebx 
jnz .result_is_not_zero 

and ecx, edx 
jz .the_bit_is_not_set 

Sử dụng nhóm thứ hai chỉ sau khi hướng dẫn CMP:

cmp eax, ebx 
jne .eax_is_not_equal_to_ebx 

cmp ecx, edx 
ja .ecx_is_above_than_edx 

Bằng cách này, chương trình trở nên dễ đọc hơn và bạn sẽ không bao giờ bị nhầm lẫn.

Lưu ý rằng đôi khi các hướng dẫn này thực sự là từ đồng nghĩa. JZ == JE; JC == JB; JNC == JAE và vân vân. Toàn bộ bảng đang theo dõi.Như bạn có thể thấy, chỉ có 16 hướng dẫn nhảy có điều kiện, nhưng 30 việc nhớ mật khẩu - họ được cung cấp để cho phép tạo ra các mã nguồn dễ đọc hơn:

Mnemonic  Condition tested Description 

jo    OF = 1   overflow 
jno    OF = 0   not overflow 
jc, jb, jnae CF = 1   carry/below/not above nor equal 
jnc, jae, jnb CF = 0   not carry/above or equal/not below 
je, jz   ZF = 1   equal/zero 
jne, jnz  ZF = 0   not equal/not zero 
jbe, jna  CF or ZF = 1  below or equal/not above 
ja, jnbe  CF or ZF = 0  above/not below or equal 
js    SF = 1   sign 
jns    SF = 0   not sign 
jp, jpe   PF = 1   parity/parity even 
jnp, jpo  PF = 0   not parity/parity odd 
jl, jnge  SF xor OF = 1  less/not greater nor equal 
jge, jnl  SF xor OF = 0  greater or equal/not less 
jle, jng (SF xor OF) or ZF = 1 less or equal/not greater 
jg, jnle (SF xor OF) or ZF = 0 greater/not less nor equal 
2

Lúc đầu, nó có vẻ như nếu JNZ nghĩa nhảy nếu không Zero (0), như trong nhảy nếu cờ zero là 1/set.

Nhưng thực tế nó có nghĩa là Nhảy (nếu) không phải là số 0 (được đặt).

Nếu 0 = không được thiết lập và 1 = thiết lập sau đó chỉ cần nhớ:
JNZ Nhảy nếu cờ zero không được thiết lập (0)

0
JNZ  Jump if Not Zero ZF=0 

Thật vậy, đây là khó hiểu đúng.

Để dễ hiểu hơn, hãy thay thế Không Zero bằng Không đặt. (Xin lưu ý này là dành cho sự hiểu biết của riêng bạn)

Do đó,

JNZ  Jump if Not Set  ZF=0 

Không Đặt nghĩa cờ Z = 0. Vì vậy, Jump (Nhảy nếu không thiết lập)

Set nghĩa cờ Z = 1 Vì vậy, đừng nhảy

Các vấn đề liên quan