2010-06-19 20 views
7

मैं एआरएम असेंबलर कोड में बाहरी परिभाषा जैसे LONG_MIN और LONG_MAX का उपयोग कैसे कर सकता हूं?एआरएम असेंबलर में सी परिभाषा का उपयोग कैसे करें

मान लीजिए कि my_arm.h इस तरह दिखता है:

int my_arm(int foo); 

चलो कहते हैं कि मैं एक my_main.c इस प्रकार करते हैं:

.text 
    .align 2 
    .global my_arm 
    .type my_arm, %function 
my_arm: 
    ... 
    ADDS r1, r1, r2 
    BVS overflow 
    ... 
overflow: 
    LDR r0, LONG_MAX @ this is probably wrong, how to do it correctly? 
    BX lr @ return with max value 
:

... 
#include <limits.h> 
#include "my_arm.h" 
... 
int main (int argc, char *argv[]) 
{ 
    int foo=0; 
... 
    printf("My arm assembler function returns (%d)\n", my_arm(foo)); 
... 
} 

और my_arm.s इस तरह दिखता है

दूसरी पंक्ति के लिए दूसरा, मुझे यकीन नहीं है कि सही तरीके से लोड कैसे किया जाए, मुझे अस्पष्ट रूप से कहीं पढ़ना याद है, मुझे परिभाषित करना था .global में LONG_MAX, लेकिन अब एक कामकाजी उदाहरण के लिंक नहीं मिल रहा है।

मैं के साथ हाथ-linux-gnueabi-जीसीसी संस्करण 4.3.2

==================

अद्यतन संकलन कर रहा हूँ: सुझाव की सराहना ! दुर्भाग्य से, मुझे अभी भी वाक्यविन्यास के साथ परेशानी हो रही है।

पहले, मैं

#define MY_LONG_MIN 0x80000000 

my_arm.S में मैं जोड़ा (एस के रूप में ही निर्देशिका में अब के लिए) एक छोटे से हेडर फाइल mylimits.h बनाया निम्नलिखित:

... 
.include "mylimits.h" 
... 
ldr r7, =MY_LONG_MIN @ when it was working it was ldr r7, =0x80000000 
... 

दो समस्याओं इस दृष्टिकोण के साथ।

सबसे पहले सबसे बड़ी समस्या: .include मुझे शामिल <limits.h>, मैं जोड़ने के लिए है कि mylimits में होता नहीं करता है के लिए वाक्य रचना: प्रतीक MY_LONG_MIN मान्यता प्राप्त नहीं है ... इसलिए कुछ अभी भी ठीक नहीं है

दूसरा। एच, थोड़ा सा लगता है, लेकिन मुझे लगता है, यह ठीक है :)

कोई बात नहीं?

मैं करने के लिए एआरएम सिस्टम डेवलपर की मार्गदर्शिका डिजाइनिंग और अनुकूलन सिस्टम सॉफ्टवेयर [2004] और एआरएम वास्तुकला संदर्भ मैनुअल [2000] उपयोग कर सकते है, मेरे लक्ष्य X स्केल-IXP42x परिवार फिरना 2 (v5l), हालांकि है।

+4

न एआरएम के बारे में पता है, लेकिन अगर आप MIPS में, एस के लिए विस्तार करने के लिए का नाम बदलकर सी preprocess फ़ाइल बनाता है। – Tom

+0

का उपयोग # शामिल नहीं है। शामिल करें, और। नहीं, जैसा कि उत्तर में कहा गया है। इस तरह आप एक जीसीसी फीचर का फायदा उठाते हैं, और सबकुछ x86 में मेरे परीक्षणों के लिए जाना चाहिए, असेंबली अलग-अलग – ShinTakezou

उत्तर

11

अक्सर लोअरकेस फ़ाइल एक्सटेंशन .s का तात्पर्य है कि असेंबलर को सी प्रीप्रोसेसर के माध्यम से पारित नहीं किया जाना चाहिए, जबकि अपरकेस एक्सटेंशन .S का तात्पर्य है कि इसे करना चाहिए। हालांकि इस सम्मेलन का पालन करने के लिए यह आपके कंपाइलर पर निर्भर है (जीसीसी बंदरगाह सामान्य रूप से करते हैं), इसलिए इसके दस्तावेज़ों की जांच करें।

(संपादित करें: ध्यान दें कि इसका मतलब है कि आप # अंतर्निहित निर्देशों का उपयोग कर सकते हैं - लेकिन याद रखें कि आप जिन फ़ाइलों को शामिल करेंगे उनमें से अधिकांश सामान्य रूप से मान्य असेंबलर नहीं होंगे (जब तक वे पूरी तरह #define इयनियंस नहीं होते), तो आपको लिखना पड़ सकता है अपने स्वयं के शीर्षक है कि)


संपादित 5 साल बाद:

ध्यान दें कि armcc v5 संकलक linux के तहत इस व्यवहार का अनुसरण करता है ... लेकिन खिड़कियों पर नहीं।

+4

यदि जीसीसी टूलचैन का उपयोग किया जा रहा है, तो '__ASSEMBLER__' मैक्रो को परिभाषित किया जाता है जब प्रीप्रोसेसिंग असेंबली फाइलें होती हैं। इसका उपयोग किसी भी दुनिया (एएसएम और सी) में आवश्यक होने पर .h फ़ाइल काम में मदद के लिए किया जा सकता है। लेकिन यदि संभव हो तो दोनों दुनिया में अलग-अलग शीर्षकों में काम करने की ज़रूरत वाले सामानों को अलग करना अभी भी सबसे अच्छा हो सकता है। हालांकि मानक शीर्षलेख में परिभाषित 'LONG_MAX' जैसे कुछ के लिए, आपके पास अधिक नियंत्रण नहीं है ... –

+0

हां, यह मानक शीर्षलेखों के साथ अधिक उपयोग नहीं है! (कभी-कभी आर्किटेक्चर हेडर के लिए छोड़कर जो स्मृति मैप किए गए आईओ पते जैसी चीजों को परिभाषित करता है, जो उद्देश्य के लिए डिज़ाइन किए गए हैं) – James

0

मैंने केवल जीसीसी को खिलाया है जो असेंबलर स्रोत बनाम गैस आपको असेंबलर में चीजों की तरह सी करने की अनुमति देगा। यह वास्तव में थोड़ा डरावना है जब आप परिस्थितियों में आते हैं जहां आपको कुछ काम करने के लिए गैस के सामने के अंत के रूप में जीसीसी का उपयोग करना चाहिए, लेकिन यह एक और कहानी है।

1

यह क्या मैं कर रहा समाप्त हो गया है:

my_main.c में

#include <limits.h> 
... 
int my_LONG_MAX=LONG_MAX; 

तो my_arm.S

ldr r8, =my_LONG_MAX 
ldr r10, [r8] 

यह convuluted लग रहा है और यह है (प्लस पोर्टेबिलिटी लाभ में इस दृष्टिकोण में संदिग्ध हैं)।

सीधे विधानसभा में LONG_MAX तक पहुंचने का एक तरीका होना चाहिए। इस तरह से मैं खुशी से पूरा जवाब के रूप में स्वीकार करेंगे।

+0

यदि कोई बेहतर समाधान जोड़ना चाहता है, तो मैं खुशी से उस उत्तर को स्वीकार करूंगा – Sint

+0

यह बहुत बदसूरत है। आप असेंबलर के साथ टाइप-साइज से संबंधित परिभाषाओं का उपयोग करने की कोशिश क्यों कर रहे हैं? यदि आपके पास एक एकल आर्किटेक्चर (एएसएम के लिए निहित) है तो बस अक्षरशः निरंतर लिखें। यह बदलने वाला नहीं है! –

+0

ओह, यह भयानक है, मैं मानता हूं। :) यह एक लाइब्रेरी फ़ंक्शन का कार्यान्वयन है। अगर मेरे पास रास्ता था, तो मैं इसे लगातार स्थिर के रूप में लिखता। – Sint

2

यदि आप जीसीसी और उसके असेंबलर का उपयोग कर रहे हैं, तो यह सीधा है: फ़ाइल को अंतिम .S के साथ नाम दें, फिर शुरुआत में #include <limits.h> जोड़ें और जहां भी आपको निरंतर आवश्यकता हो, उदाहरण दें। ldr r0, SOMETHING; मैंने x86 के साथ परीक्षण किया क्योंकि यह मेरे पास है, लेकिन यह वही काम करता है क्योंकि यह एक जीसीसी सुविधा है। armasm विकल्प के लिए

0

उपयोग --cpreproc और my_arm.s में

#include "my_arm.h" 

जोड़ें।

यह Keil एआरएम के लिए काम करता