سؤال

هذه هي محاولتي الأولى في استخدام التجميع وأنا أحاول فقط استخدام تعليمات بنية إنتل FABS.(الرجوع هذه الوثيقة في الصفحة 399).

من المفترض أن يؤدي هذا ببساطة إلى مسح بت الإشارة.

القليل الذي أعرفه عن التجميع يتضمن المصادر والوجهات ولكني لا أرى أي إشارة إلى تدوين هذه التعليمات.

وفيما يلي واحدة من محاولاتي في استخدامه (باستخدام فيسوال ستوديو 2012 ، ج)):

double myabs(double x){
  __asm(fabs(x));
return x;
}

هذه المحاولة بالذات تعطي الخطأ ج2400:خطأ في تركيب المجمع المضمن في 'كود التشغيل';وجدت ' ('


يرجى ملاحظة أنني أريد استخدام تعليمات التجميع ولست مهتما بالخيارات الأخرى / "الأفضل" المتوفرة.

هل كانت مفيدة؟

المحلول

عدة مؤشرات:أولا-كنت تستخدم غك نمط مضمنة التجمع ، في مس نمط يمكنك استخدام -

__asm{ ... }

ثانيا-التعليمات ليست وظائف ، لذا فإن الأقواس هناك خاطئة أيضا.

أخيرا ولكن الأهم - fabs لا يأخذ حجة ، فإنه يعمل فقط على الجزء العلوي من كومة فب.تحتاج إلى تحميل المتغير الخاص بك بشكل صريح هناك أولا.جرب هذا:

__asm {
    fld x
    fabs
    fstp x
}

على أي حال ، وذلك باستخدام تعليمات ز87 القديمة وربما ليس شيئا جيدا ، وربما انها غير فعالة تماما - يجب عليك أن تنظر في التحول إلى حل سس ، انظر - كيفية المطلق 2 مزدوج أو 4 يطفو باستخدام مجموعة التعليمات سس?(حتى سس 4)

نصائح أخرى

مع فك++ ، لا ترفق لغة التجميع بين قوسين.بناء الجملة الصحيح سيكون أشبه:

__asm fabs

أو:

__asm { 
    fabs
    // possibly more instructions here
}

في حالتك المحددة ، ربما تريد شيئا مثل:

__asm { 
    fload x // load x onto F.P. stack
    fabs    // take absolute value
    fstp x  // store back to x and pop from F.P. stack.
}

بقدر ما يذهب المصدر والوجهة ، النقطة العائمة على س 86 يستخدم كومة.ما لم تحدد خلاف ذلك ، فإن معظم التعليمات (بخلاف التحميل/المتجر) تأخذ المعاملات من أعلى المكدس ونتائج الإيداع في الجزء العلوي من المكدس أيضا.على سبيل المثال ، مع عدم وجود معامل معين, fabs سوف تأخذ القيمة المطلقة للمعامل في الجزء العلوي من كومة النقطة العائمة وإيداع النتيجة مرة أخرى في نفس المكان.

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