/ / पीसी रजिस्टर पर एआरएम एलडीआर निर्देश - विधानसभा, हाथ, पैच, मंकीपैकिंग

पीसी रजिस्टर पर एआरएम एलडीआर निर्देश - असेंबली, हाथ, पैच, बंदरगाह

यहाँ मैं कहानी को कैसे समझ सकता हूँ:

  • पीसी रजिस्टर अगले निर्देश के लिए सूचक रखता है
  • एलडीआर निर्देश दूसरे ऑपरेंड के मूल्य को पहले ऑपरेंड में लोड कर रहा है (उदाहरण के लिए)
    LDR r0, [पीसी, 0x5678]
    इस "C कोड" के बराबर है
    r0 = * (पीसी + 0x5678)
    
    यह बेस ऑफसेट के साथ पॉइंटर डीफ्रेंनिंग है।

और मेरा सवाल:

मुझे यह कोड मिला

LDR PC, [PC, -4]

यह बंदर की पिटाई, आदि जैसी टिप्पणी करता है।

मैं इस कोड को कैसे समझता हूं

पीसी = * (पीसी - ४)

मैं इस मामले में "पीसी" रजिस्टर में हस्तक्षेप करेगापिछले निर्देश का पता और इसमें अनुदेश का "मशीन कोड" होगा (अनुदेश का पता नहीं), और कार्यक्रम निष्पादन को जारी रखने के लिए उस अमान्य पते पर जाएगा और शायद हमें "सेगमेंटेशन फ़ॉल्ट" मिल जाएगा। तो मुझे क्या याद आ रहा है या समझ में नहीं आ रहा है?



जो चीज मुझे सोचने पर मजबूर करती है वह है कोष्ठकएलडीआर अनुदेश में दूसरा संचालन। जैसा कि मुझे पता है कि x86 आर्किटेक्चर ब्रैकेट्स पहले से ही पॉइंफ्रेंसिंग पॉइंटर कर रहे हैं, लेकिन मैं एआरएम आर्किटेक्चर में इसका मतलब नहीं समझ सकता।

Mov r1, 0x5678 आर 1 जोड़ें, पीसी Mov r0, [r1]

इस कोड के बराबर है?

LDR r0, [पीसी, 0x5678]

उत्तर:

उत्तर № 1 के लिए 7

की धारा 4.9.4 से उद्धृत एआरएम निर्देश सेट दस्तावेज़ (एआरएम DDI 0029E):

उपयोग करते समय R15 आधार पंजी के रूप में आपको यह याद रखना चाहिए कि इसमें 8 बाइट का पता है वर्तमान निर्देश के पते से।

ताकि अनुदेश 4 बाइट्स स्थित शब्द को लोड करेगा बाद वर्तमान अनुदेश, जिसमें उम्मीद है कि एक वैध पता है


जवाब के लिए 4 № 2

करने के लिए धन्यवाद एआरएम वास्तुकला का एक क्विक, LDR PC, [PC,-4] की एक शाखा है निम्नलिखित निर्देश (मानकर हम "एआरएम से बात कर रहे हैं, नहीं।"यहाँ अँगूठा), इस प्रकार सामान्य परिस्थितियों में इसका कोई प्रभाव नहीं पड़ता (प्रदर्शन के अलावा)। बिंदु यह है कि एक फ़ंक्शन के प्रारंभ में उस निर्देश को डालकर, यह कोड के लिए वास्तव में सरल है कि नीचे के 12 बिट्स को फिर से लिखकर रनटाइम पर पैच करें LDR ऑफसेट को बदलने का निर्देश, इस प्रकार उस फ़ंक्शन को कहीं और पुनर्निर्देशित करना। निर्देश के तुरंत बाद शब्द में मेमोरी में संग्रहीत पते पर शाखा करना। Herp derp, मुझे मिल गया ADR तथा LDR वहाँ उलझन - ऊपर सच होगा अगर यह थे ADR, लेकिन यह मामला और भी सीधा है।

अब जब कि मैं अपने आप को अपुष्ट कर रहा हूं तो यह केवल एक साधारण फ़ंक्शन कॉल ट्रैम्पोलिन है। फ़ंक्शन पते को तुरंत डेटा शब्द के रूप में संग्रहीत किया जाएगा LDR निर्देश (संभवतः लिंकर द्वारा कुछ प्रारंभिक मूल्य पर सेट) और स्व-संशोधित कोड का सहारा लेने की आवश्यकता के बिना, शाखा को पुनर्निर्देशित करने के लिए रनटाइम पर डेटा के रूप में फिर से लिखा जा सकता है।