इस विधानसभा में एक समारोह को परिभाषित करने के लिए अपने रास्ते है, यह एक अलग कोडांतरक-फ़ाइल है की जरूरत नहीं है और न ही आप हर न्यू लाइन से बचने के लिए की जरूरत है। आप असेंबली फ़ाइलों की सामग्री स्ट्रिंग-शाब्दिक में कॉपी कर सकते हैं। नोट:raw multiline string literal एक सी ++ 11 सुविधा है (आपने सी ++ भी टैग की है)। यह उपयोगी है, अगर आप एक ही .c
-/.cpp
-file में सबकुछ संकलित करना चाहते हैं।
extern"C" int rand_byte(void);
asm (R"(
.globl rand_byte
rand_byte:
call rand
and eax, 255
ret
)");
आप वैश्विक दायरे में अतिरिक्त पैरामीटर के बिना केवल मूल असेंबली-स्टेटमेंट का उपयोग कर सकते हैं। जीसीसी या क्लैंग और एक आर्म प्रोसेसर का उपयोग करते समय, आप [[gnu::naked]]
/__attribute__((naked))
का उपयोग करने में सक्षम हैं।
[[gnu::naked]]
int rand_byte(void) {
asm volatile (R"(
push {lr}
bl rand
and r0, #255
pop {pc}
)");
};
पहला तरीका हमेशा नग्न कार्यों को परिभाषित करने की अनुमति देता है। यह और अधिक पोर्टेबल कोड बनाने में भी मदद करता है।
extern"C" int _cdecl rand_byte(void);
#if defined __x86__
// NOTE: the names are decorated with a '_' on windows 32-bit
// You can use extern"C" int _cdecl rand_byte() asm("rand_byte");
// to make the asm symbol name always be rand_byte, without an _
asm volatile (R"(
.globl _rand_byte
_rand_byte:
call rand
and eax, 255
ret
)");
#elif defined __x86_64__
asm volatile (R"(
.globl rand_byte
rand_byte:
call rand
and rax, 255 # eax works here, too. x86-32 and -64 could share the same source.
ret
)");
#elif defined __arm__
asm (R"(
.global rand_byte
rand_byte:
push {lr}
bl rand
and r0, #255
pop {pc}
)");
#else
#error There is no code for your platform yet...
#endif
कोशिश करें और इसे और अधिक विशिष्ट बनाएं - यह अपेक्षाकृत व्यापक और अस्पष्ट है - अन्यथा यह शायद "वास्तविक प्रश्न नहीं" के रूप में बंद हो जाएगा। एएसएम टेम्पलेट इत्यादि बनाने के लिए 'gcc -S ...' का उपयोग करने के बारे में आपके पिछले प्रश्नों में पहले की सलाह को भी याद रखें। –
जीसीसी में एक ही नस में '__attribute __ ((नग्न)) है, लेकिन x86 :( –