Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как BSWAP нижнего 32-битного 64-битного регистра?

Автор вопроса: user25683Ответов: 2

Я искал ответ о том, как использовать BSWAP для нижнего 32-битного подрегистра 64-битного регистра. Например, 0x0123456789abcdef находится внутри регистра RAX, и я хочу изменить его на 0x01234567efcdab89 с помощью одной инструкции (из-за производительности).

Итак, я попробовал следующую встроенную функцию:

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

И результат был 0x00000000efcdab89. Я не понимаю, почему компилятор так себя ведет. Кто-нибудь знает эффективное решение?

  • Голосование против чрезмерного использования вопросительных знаков davr 07.10.2008
  • Тег 64-bit заменен на 64bit, потому что вопросов с тегом 64bit больше. Brad Gilbert 17.10.2008

gccc64-bitendianness

Ответы

Ответ 1 · рейтинг 5 · Dan Lenski

Ах, да, теперь я понимаю проблему:

процессоры x86-64 неявно расширяют нулем 32-битные регистры преобразуются в 64-битные при выполнении 32-битных операций (на %eax, %ebx и т. д.). Это сделано для обеспечения совместимости с устаревшим кодом, который, насколько я понимаю, ожидает 32-битную семантику для этих регистров.

Поэтому я боюсь, что невозможно выполнить ror только для младших 32 бит 64-битного регистра. Вам придется использовать серию из нескольких инструкций...

Ответ 2 · рейтинг -1 · Dan Lenski

Проверьте вывод сборки, сгенерированный gcc! Используйте флаг gcc -s для компиляции кода и генерации ассемблерного вывода.

IIRC, x86-64 по умолчанию использует 32-битные целые числа, если явно не указано иное, поэтому это может быть (частью) проблемы.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы