كيفية استخدام يا 32 تعليمات 'فابس' في فس ج??
-
21-12-2019 - |
سؤال
هذه هي محاولتي الأولى في استخدام التجميع وأنا أحاول فقط استخدام تعليمات بنية إنتل 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
سوف تأخذ القيمة المطلقة للمعامل في الجزء العلوي من كومة النقطة العائمة وإيداع النتيجة مرة أخرى في نفس المكان.