2010-07-14 14 views
5

से स्क्रैच पैड स्मृति यही कारण है कि एक छोटा सा एक विदेशी समस्या हो सकती है, लेकिन मुझे आशा है कि किसी को अभी भी मुझे बाहर एक सा मदद कर सकते हैं;)। मैं फिर भी एक मानक सी कार्यक्रम पर अमल करने, , प्रोग्राम निष्पादन के दौरान कुछ बिंदु मैं चाहते हैं पर चाहते हैं कि निर्देश है, जो एक स्थानीय स्क्रैच पैड रैम में संग्रहित कर रहे हैं की एक निश्चित संख्या, मार डाला। स्क्रैचपैड मेमोरी सभी प्रक्रियाओं के लिए पहुंच योग्य है। मान देता है इस स्थानीय स्मृति पता 0x80000000 पर शुरू होता है और मैं निम्नलिखित सी कोड fragementप्रवेश सी

int main { 
int a=1; 
int b=2; 
int c=3;  

c = a + b; 

%goto address 0x80000000 and execute three instructions before continuing 
%program execution here 

return(0); 

}

कार्यक्रम काउंटर निम्नलिखित चरणों के माध्यम से जाना होगा में इस एकीकृत होगा, मुख्य संभालने में भरी हुई है 0x40000000

0x40000000 a=5; 
0x40000004 b=2; 
0x40000008 c=1; 
0x4000000C c=a+b; 
0x80000000 first instruction in the local scratch pad 
0x80000004 second instruction in the local scratch pad 
0x80000008 third instruction in the local scratch pad 
0x40000010 return(0); 

कोई भी यह विचार करता है कि यह कैसे करें? क्या मुझे असेंबलर कूद निर्देशों का उपयोग करने की आवश्यकता है या क्या कुछ और सुरुचिपूर्ण है।

बहुत धन्यवाद, Andi

+2

क्या 0x80000000 पर प्रोग्राम एक समारोह की तरह व्यवहार करता है? अर्थात। क्या यह ढेर को ठीक से बचाएगा और कॉलर पर वापस कूद जाएगा? – bstpierre

उत्तर

0

एक निश्चित स्थान के लिए कूद करने के लिए, आप एक प्रकार एक समारोह के लिए एक सूचक है कि घोषणा कर सकते हैं, तो उस प्रकार अपना पता डाल सकते हैं और एक समारोह के रूप में यह कहते हैं।

यदि आप चाहते हैं कि यह मेमोरी क्षेत्र आपके प्रोग्राम के अलावा अन्य प्रक्रियाओं के लिए सुलभ हो, तो आपको अपने चुने हुए पते पर स्मृति के एक हिस्से को मैप करने के लिए अपने ऑपरेटिंग सिस्टम (विंडोज/लिनक्स/ओएस एक्स) साझा स्मृति प्राइमेटिव का उपयोग करना होगा ।

एक पागल विचार की तरह लगता है, लेकिन यह काम करने के लिए बनाया जा सकता है। सौभाग्य!

+0

ठीक है, एम्बेडेड प्रोसेसर हैं जो स्क्रैच पैड मेमोरी के साथ आते हैं, इसलिए इसे करने योग्य होना चाहिए। दुर्भाग्य से, मैंने ऐसा कोई उदाहरण नहीं देखा है जो ऐसी स्थानीय यादों का उपयोग प्रदर्शित करता है। आपके इनपुट के लिए धन्यवाद, मैं इसे देख लूंगा। – Rob

6

यह मानते हुए कि निर्देश एक सामान्य समारोह की तरह व्यवहार करते हैं, तो आप कर सकते हैं:

#include <stdio.h> 

void (*scratchpad_func)(void) = (void(*)(void))0x80000000; 

int main() 
{ 
    printf("before\n"); 
    scratchpad_func(); 
    printf("after\n"); 
    return 0; 
} 

जाहिर है, आप एक असली मोड ऑपरेटिंग सिस्टम का उपयोग किया होगा, या जो कुछ भी हुप्स अपने ओएस/प्रोसेसर संयोजन के माध्यम से कूद उस पता स्थान तक सीधे पहुंच की आवश्यकता है।

खैर एक जोड़े (कुछ आर्किटेक्चर पर "एक सामान्य समारोह की तरह व्यवहार" अंत में अगर आप कॉल प्राप्त करने वाला: सहेजे गए रजिस्टरों को स्पर्श नहीं करते एक "कूद $ रा" के रूप में सरल है। उदाहरण के लिए MIPS।)

+0

यह डरावना लगता है लेकिन मैं इसे जाने दूंगा। उसके लिए धन्यवाद! – Rob

+0

-1 ऐसा कुछ भी नहीं है जो गारंटी देता है कि पते पर स्थित निर्देश फ़ंक्शन के रूप में व्यवहार करते हैं। ओपी वहां स्थित निर्देशों की एक निश्चित संख्या निष्पादित करना चाहता है। –

+1

@Jens Gusted: इस प्रकार मेरा उत्तर में योग्यता ... – bstpierre

0

संकेतों का

  1. आपको यह सुनिश्चित करने की आवश्यकता है कि "स्क्रैच पैड" में स्मृति पता योग्य और निष्पादन योग्य है।
  2. सुनिश्चित करें कि स्मृति स्थान निर्देश के अनुक्रम एक ret अनुदेश
  3. call कोड के बजाय यह करने के लिए कूद के साथ समाप्त होता बनाओ।
1

न तो एक समारोह सूचक है और न ही इनलाइन कोडांतरक को पता कास्टिंग सामान्यीकृत है, इस बात का तो कुछ भी नहीं करने के लिए फिर से पोर्टेबल होगा ;-)

तय पते का मिलान के रूप में कार्ल उल्लेख POSIX के साथ संभव है, लेकिन फिर इसे निष्पादित करें, कोई आसान तरीका नहीं है।

क्या पिछले पोस्ट जवाब में से कोई भी या तो, कैसे ठीक तीन निर्देश के बाद वापस कूदने के लिए है ...

एक ही रास्ता मैं के बारे में सोच सकते हैं वास्तव में कहीं सिर्फ तीन निर्देश को कॉपी करें और तुरंत बाद बिना शर्त कूद जगह होगा। फिर उस स्थान पर कूदने के लिए एक इनलाइन असेंबलर निर्देश का उपयोग करें।

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