سؤال

ولقد كنت أبحث عن إجابة لكيفية استخدام BSWAP لانخفاض 32 بت دون تسجيل من تسجيل 64 بت. على سبيل المثال، 0x0123456789abcdef هو داخل السجل RAX، وأريد تغييره إلى 0x01234567efcdab89 مع تعليمة واحدة (بسبب الأداء).

وهكذا حاولت التالي الدالة المضمنة:

#define BSWAP(T) {  \
    __asm__ __volatile__ (  \
            "bswap %k0" \
            : "=q" (T)  \
            : "q" (T)); \
}

وكانت النتيجة 0x00000000efcdab89. أنا لا أفهم لماذا المترجم أعمال مثل هذا. لا أحد يعرف الحل كفاءة؟

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

المحلول

وآه، نعم، وأنا أفهم المشكلة الآن:

والمعالجات إكس86-64 <م> ضمنا عدم تمديد يسجل 32 بت إلى 64 بت عند القيام بعمليات 32-بت (على٪ EAX،٪ EBX، الخ). هذا هو للحفاظ على التوافق مع رمز القديمة التي تتوقع دلالات 32 بت لهذه السجلات، كما أفهمها.

ولذا فإنني أخشى أن هناك على أي وسيلة لقيام ror على مجرد انخفاض 32 بت من تسجيل 64 بت. سيكون لديك لتفعل استخدام سلسلة من عدة تعليمات ...

نصائح أخرى

وتحقق إخراج التجمع الناتجة عن دول مجلس التعاون الخليجي! استخدام العلم gcc -s ترجمة التعليمات البرمجية وتوليد الناتج ASM.

وIIRC، يستخدم إكس86-64 الأعداد الصحيحة 32-بت بشكل افتراضي عندما لا تكون موجهة صراحة إلى خلاف ذلك، لذلك قد يكون هذا (جزء من) المشكلة.

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