كيفية BSWAP انخفاض 32 بت من 64 بت التسجيل؟
-
05-07-2019 - |
سؤال
ولقد كنت أبحث عن إجابة لكيفية استخدام 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-بت بشكل افتراضي عندما لا تكون موجهة صراحة إلى خلاف ذلك، لذلك قد يكون هذا (جزء من) المشكلة.