2017-02-28 5 views
5

मैं विधानसभा के बराबर करने के लिए एसी समारोह कोड तुलना करने के लिए और तरह सशर्त पर उलझन के कूदतासशर्त छलांग - विधानसभा

enter image description here

मैं jl अनुदेश देखा और कोशिश कर रहा हूँ करने के लिए ग कोड की तुलना में यह < पर कूदो अगर सवाल का जवाब >= कोई बता सकता है कि वह क्यों है?

+0

फाउ किस प्रोसेसर प्रकार इस असेंबली भाषा है? मोटोरोला 68000? – Codor

+1

'<' and '> =' एक दूसरे के विचलन हैं। पूर्व ('<') के साथ शायद कम या तेज़ निर्देश हैं, इसलिए यह एक अनुकूलन समस्या है। –

+0

यह x86 असेंबली इंटेल है? – user2584325

उत्तर

4

मेरी समझ के लिए, स्थिति उलटा है, लेकिन तर्क समान है; सी स्रोत को परिभाषित करता है

अगर शर्त पूरी होने के लिए, निम्न ब्लॉक

निष्पादित जबकि विधानसभा स्रोत को परिभाषित करता है

अगर हालत का उल्लंघन किया है, तो निम्न ब्लॉक छोड़

जिसका अर्थ है कि निष्पादन का प्रवाह दोनों कार्यान्वयन में समान होगा।

+0

पर्याप्त मजाकिया, इस मामले में स्थिति बदल नहीं है। लेकिन ऑपरेटरों का आदेश। दोनों स्थितियां "यदि कम है", जैसे कि यह "jl" (सी कोड में "if <" जैसा ही है), लेकिन 'a Tommylee2k

2

संक्षेप में, यह असेंबली क्या कर रही है, आप इसे सेट करते समय अपनी स्थिति को निष्पादित कर रहे हैं, लेकिन नकारात्मक तर्क का उपयोग कर रहे हैं।

आपकी हालत का कहना है:

तो एक छोटे तो ख है, लौटने एक्स। अन्यथा, वापस वाई। बफर में

ले जाएँ y लौटने के लिए:

क्या विधानसभा कोड का कहना है (सरलीकृत)। बी को एक अलग बफर में ले जाएं। यदि बड़ा है तो बी, वापसी चरण पर आगे बढ़ें। फिर वाई लौटा है। यदि कोई बड़ा नहीं है तो बी, कार्यक्रम में जारी रखें। अगला चरण वापसी बफर को x असाइन करता है। उसके बाद चरण सामान्य के रूप में लौटाता है।

परिणाम एक ही है, लेकिन इस प्रक्रिया थोड़ी अलग है।

+0

के साथ% edx (होल्डिंग बी) है आपके स्पष्टीकरण में 'ए' खो गया –

+0

@ MichałWalenciak धन्यवाद। मैंने जवाब में संशोधन किया। मैंने एक्स के लिए गलत लिखा है। – Magisch

1

विधानसभा, लाइन द्वारा लाइन (कोड, शामिल नहीं क्योंकि आप इसे छवि के रूप में तैनात) करता है:

foo: 
    return_value (eax) = y; // !!! 
    temporary_edx = b;  // x86 can't compare memory with memory, so "b" goes to register 
    set_flags_by(a-b);  // cmp does subtraction and discards result, except flags 
    "jump less to return" // so when a < b => return y (see first line) 
    return_value (eax) = x; 
    return 

ताकि सी कोड एक ही बात करते हैं बनाने के लिए, आप की जरूरत:

if (a >= b) { return x; } else { return y; } 

Btw, देखना कितना आसान है फ्लिप करने के लिए है:

if (a < b) { return y; } else { return x; } 

तो वहाँ jl अनुवाद करने के लिए कोई मतलब नहीं है सी में "कम" में, आपको प्रत्येक शाखा को ट्रैक करना होगा, वास्तव में क्या होता है, और गणना की प्रत्येक शाखा को सही सी-साइड गणना के लिए ढूंढें, और फिर दोनों पक्षों पर समान गणना प्राप्त करने के लिए सी में स्थिति बनाएं " , इसलिए यह कार्य असेंबली को "अनुवाद" करने के बारे में नहीं है, लेकिन एएसएम तर्क को समझने के बारे में + इसे वापस सी में पुनः लिखना है।ऐसा लगता है कि आप पूरी तरह से इस बिंदु को याद करते हैं और उम्मीद करते हैं कि आप कुछ सरल "मिलान पैटर्न" अनुवाद से दूर हो सकते हैं, जबकि आपको इसे पूरी तरह से बाहर करना होगा।

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