سؤال

يحدد MIPS32 ISA التنسيق التالي لـ المزامنة تعليمات:

SYNC (stype = 0 implied)
SYNC stype

هنا ، قد يكون STYPE SYNC_WMB (SYNC 4) ، SYNC_MB (SYNC 16) ، إلخ __asm__ volatile ("sync" ::);.

ولكن ، إذا كتبت شيئًا مثل __asm__ volatile ("sync 0x10" ::), ، لا يجمع:

Error: illegal operands 'sync 0x10'

نفس الشيء إذا مر -mips32r2 خيار إلى GCC.

لذا ، فإن السؤال هو: كيفية استخدام Sync_* (Wync_wmb ، sync_mb ، sync_acquire ، ...) تعليمات من مجموعة GCC المضمنة؟

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

المحلول

أظن أن binutils قديمة جدًا - يبدو أنه تم إضافة دعم لهذا فقط في الإصدار 2.20.

كحل بديل ، إذا لم تتمكن من ترقية BinuTils بسهولة ، فيمكنك إنشاء رمز opcode باليد.

sync هو تعليمات Opcode 0 مع رمز وظيفة (بت 5..0) من 0xf, ، وهذا الشكل منه يشفر نوع المزامنة في حقل مبلغ التحول (بت 10..6). لذلك ، على سبيل المثال sync 0x10:

__asm__ volatile(".word (0x0000000f | (0x10 << 6))");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top