سؤال

لدي سؤال بشأن 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top