2013-02-12 17 views
15

अगर मैं गलत हूं तो मुझे सही करें।जेएनजेड और सीएमपी असेंबली निर्देश

यह मेरी JNZ और CMP की समझ है।

JNZ - कूद होगी अगर Z करें नहीं है शून्य (1)

CMP - दो मानों बराबर हैं, Z करें सेट किया गया है (1) अन्यथा यह सेट नहीं है (0)

Olly DBG

यह एक फ्लैश ट्यूटोरियल मैं देख रहा हूँ है। यह एक सरल क्रैक के समाधान को पढ़ रहा है।

जैसा कि आप देख सकते हैं, पिछले निर्देश AL47h के साथ तुलना की गई थी। वे बराबर थे जो Z ध्वज सेट करते थे। (आप इसे दाईं ओर रजिस्टर्स विंडो में देख सकते हैं)

अगला निर्देश JNZ है। मेरी समझ यह थी कि Z ध्वज सेट होने पर कूद तब होगी। Z ध्वज सेट है, लेकिन कूद नहीं होता है!

क्यों?

+1

@nrz पर न कूदें आपकी टिप्पणी बहुत स्पष्ट नहीं है - क्या ओपी वास्तव में कथन को देखकर गलती का एहसास करने की उम्मीद है, वास्तव में मुश्किल है? –

+0

@nrz जीज़ आदमी क्या आप मुझे और भी भ्रमित करने की कोशिश कर रहे हैं?!? अन्य उत्तरों से, अब मुझे पता है कि जेएनजेड के साथ, कूद केवल तब होता है जब शून्य ध्वज सेट नहीं होता है (0) –

+1

@ 43.52.4 डी। क्षमा करें, मैंने वाक्य को गलत तरीके से पढ़ा है "जेएनजेड - यदि आपके प्रश्न में ज़ेड फ्लैग शून्य नहीं है (1)" तो कूद जाएगा, और नतीजतन मेरी टिप्पणी संभवतः भ्रमित हो रही थी, इसलिए मैंने इसे अभी हटा दिया। [इंटेल x86 जंप त्वरित संदर्भ] (http://www.unixwiz.net/techtips/x86-jumps.html) में विभिन्न x86 सशर्त कूदों की शाखाओं की शर्तों की जांच करने के लिए एक उपयोगी तालिका है। – nrz

उत्तर

24

जेएनजेड "जंप यदि शून्य नहीं है (ZF = 0)", और "ज़ेडफ़ सेट होने पर कूदें" के लिए छोटा है।

यदि यह याद रखना आसान है, तो जेएनजेड और जेएनई (अगर बराबर नहीं है तो) बराबर हैं। इसलिए, जब आप cmp al, 47 कर रहे हैं और AL की सामग्री 47 के बराबर है, तो ZF सेट है, कूदो (यदि बराबर नहीं है - जेएनई) नहीं लिया जाना चाहिए।

11

मैं यहां थोड़ा सा जवाब दूंगा।

वहाँ आम तौर पर सशर्त छलांग के दो प्रकार बात कर रहे हैं 86 में:

  1. अंकगणित कूदता - JZ की तरह (कूद शून्य है), जे.सी. (कूद अगर कैरी), JNC (कूद नहीं तो पाया जाता है), आदि ।

  2. तुलना कूदता - जेई (कूद बराबर है), जेबी (कूद नीचे हैं), जॅ (कूद ऊपर या बराबर है), आदि

तो, केवल गणित के बाद पहली प्रकार का उपयोग करें या तार्किक instruc माहौल:

sub eax, ebx 
jnz .result_is_not_zero 

and ecx, edx 
jz .the_bit_is_not_set 

केवल सीएमपी निर्देश के बाद दूसरे समूह का उपयोग करें: इस तरह

cmp eax, ebx 
jne .eax_is_not_equal_to_ebx 

cmp ecx, edx 
ja .ecx_is_above_than_edx 

, कार्यक्रम अधिक पठनीय हो जाता है और आप भ्रमित हो कभी नहीं होगा।

नोट, कि कभी-कभी ये निर्देश वास्तव में समानार्थी हैं। जेड == जेई; जेसी == जेबी; जेएनसी == जेएई और इतने पर। पूर्ण तालिका का पालन कर रहा है।जैसा कि आप देख सकते हैं, वहाँ केवल 16 सशर्त कूद निर्देश है, लेकिन 30 स्मृति सहायकों हैं - वे और अधिक पठनीय स्रोत कोड के निर्माण की अनुमति के लिए प्रदान की जाती हैं:

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

पहले तो ऐसा लगता है मानो JNZ कूद का मतलब नहीं शून्य (0 अगर), कूदने के रूप में अगर शून्य ध्वज 1/सेट है।

लेकिन हकीकत में इसका मतलब है कि कूदो (अगर) शून्य नहीं है (सेट है)।

हैं 0 = सेट नहीं और 1 = तो सेट सिर्फ याद रखें:
JNZ कूद अगर शून्य ध्वज सेट नहीं है सही (0)

0
JNZ  Jump if Not Zero ZF=0 

दरअसल, इस भ्रामक है।

यह समझने में अधिक आसान बनाने के लिए, की जगह नहीं शून्य साथ सेट नहीं है।

JNZ  Jump if Not Set  ZF=0 

इसलिए (कृपया ध्यान दें यह अपनी खुद की समझ के लिए है लेने के लिए), सेट नहीं का मतलब है झंडा जेड = 0. तो कूद (कूद अगर सेट नहीं)

सेट झंडा जेड का मतलब = 1 तो,

संबंधित मुद्दे