यहाँ कोडांतरक कोड है:

.386
.model flat, stdcall

_asmFunc proto arg1: dword, arg2: dword

.data
.code

_asmFunc proc, arg1: dword, arg2:dword
    mov eax, arg1
    add eax, arg2
    ret
_asmFunc endp

end

और यहां सी ++ कोड है:

#include <iostream>

extern "C" int asmFunc(int, int);

int main()
{
    std::cout << asmFunc(5, 6);

    char a;
    std::cin >> a;
    return 0;
}

बात यह है: यदि मैं फ़ंक्शन से सभी तर्क हटा देता हूं, एएसएम में मॉडल से stdcall हटा देता हूं और प्रोटो लाइन को हटा देता हूं - मैं इसे सी ++ से कॉल कर सकता हूं, लेकिन अगर मैं कुछ तर्क पारित करना चाहता हूं, तो मुझे प्रक्रिया शीर्षलेख के बाद उन्हें जोड़ना होगा, जो इसका मतलब है कि मुझे stdcall जोड़ने की जरूरत है, इस मामले में सी ++ मुझे बताता है कि प्रोग्राम मेरा फ़ंक्शन नहीं ढूंढ सकता (अनसुलझे बाहरी प्रतीक _asmFunc), मुझे वास्तव में कोई सामान्य संयोजन नहीं मिल रहा है (क्योंकि मैं रजिस्टरों के माध्यम से हाथ से तर्क पारित नहीं करना चाहता हूं या मैन्युअल रूप से उन्हें स्टैक में रखें और उन्हें मेरे फ़ंक्शन में निकालें, बहुत अधिक अतिरिक्त कोड) जो मुझे c++ से तर्कों के साथ asm फ़ंक्शन को कॉल करने की अनुमति देता है, या तो इसमें तर्क नहीं हो सकते हैं या c++ कोड इसे नहीं ढूंढ सकता है

1
Notrum666 7 अक्टूबर 2020, 15:05

2 जवाब

सबसे बढ़िया उत्तर
  1. .model निर्देश में कॉलिंग कन्वेंशन को C फंक्शन डिक्लेरेशन में कॉलिंग कन्वेंशन से मेल खाना चाहिए। डिफ़ॉल्ट cdecl कॉलिंग कन्वेंशन के लिए, बस .model flat, c का उपयोग करें

  2. .model निर्देश, नाम सजावट स्वचालित रूप से की जाती है। इसका मतलब है कि आपको नामों में _ जैसी कोई नाम सजावट नहीं जोड़नी चाहिए, जिन्हें नाम मैंगलिंग नियम

2
rustyx 7 अक्टूबर 2020, 16:07

एएसएम कोड में फ़ंक्शन का नाम शुरुआत में _ के बिना होना चाहिए, एएसएम अंडरस्कोर ही जोड़ता है

0
Notrum666 7 अक्टूबर 2020, 15:42