Assembler GNU لـ MIPS: كيفية تنبعث من تعليمات Sync_*؟
سؤال
يحدد 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))");
لا تنتمي إلى StackOverflow