وسيطات NASM/YASM ، الارتباط بـ C ++
-
21-09-2019 - |
سؤال
لدي سؤال بشأن NASM وربطه بـ C ++. أعلن وظيفة اختبار litte كـ
extern "C" void __cdecl myTest( byte i1, byte i2, int stride, int *width );
وأنا أسميها هكذا:
byte i1 = 1, i2 = 2;
int stride = 3, width = 4;
myTest( i1, i2, stride, &width );
تعمل الطريقة فقط على تصحيح التجميع وإلقاء نظرة على كيفية استخدام مؤشر المكدس للحصول على الوسائط. علاوة على ذلك ، يجب ضبط قيمة وسائط المؤشر على 7 ، لمعرفة كيفية عمل ذلك. يتم تنفيذ هذا مثل هذا:
global _myTest
_myTest:
mov eax, [esp+4] ; 1
mov ebx, [esp+8] ; 2
mov ecx, dword [esp+16] ; width
mov edx, dword [esp+12] ; stride
mov eax, dword [esp+16]
mov dword [eax], 7
ret
وتجميعها عبر
yasm -f win32 -g cv8 -m x86 -o "$(IntDir)\$(InputName).obj" "$(InputPath)"
, ، ثم مرتبط بتطبيق C ++. في وضع التصحيح ، كل شيء يعمل بشكل جيد. تسمى الوظيفة عدة مرات وتعمل كما هو متوقع ، بينما في وضع الإصدار تعمل الوظيفة مرة واحدة ، لكن عمليات البرامج اللاحقة تفشل. يبدو لي أن هناك خطأ ما في مؤشرات Stack/Frame ، بالقرب/بعيدًا ، لكنني جديد تمامًا على هذا الموضوع وأحتاج إلى القليل من المساعدة. شكرا لك مقدما! أ.
المحلول
حسنًا ، يبدو أنني يجب أن أحافظ ebx
عبر الدفع/البوب.
نصائح أخرى
قد يكون هذا يساعد: flac يستخدم بعض المصادر في المجمع التي تهدف إلى تجميعها بواسطة NASM.