Зеркальное отражение нечетных битов регистра - PullRequest
0 голосов
/ 29 марта 2012

Кто-нибудь знает, как отразить биты в NASM / 8086?

Вот пример:

10100001 после зеркалирования => 10000101

Проблема более сложная, потому что я должен отражать ТОЛЬКО нечетные биты регистра:

Это значит:

       10100001 => 00001011
       76543210 => 76543210

т.е. 1 <=> 7 и 3 <=> 5

Ответы [ 2 ]

4 голосов
/ 29 марта 2012

Очевидный алгоритм выглядит так:

  • создать маску из четных битов (mask = 01010101...01010101)
  • извлечение четных бит во временное (temp = src AND mask)
  • маскирует четные биты из исходного регистра (src = src AND NOT mask)
  • обратные биты в регистре источника ( множество существующих алгоритмов для этого )
  • сдвигать обратные биты влево на 1, чтобы они оставались в нечетных местах (src = src SHL 1)
  • вставлять четные биты (src = src OR temp)

Конечно, если это только для 8-битных значений, вы можете просто использовать предварительно вычисленный 256-элементный LUT.

1 голос
/ 30 марта 2012

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

Я думаю, что алгоритм из Стэнфордского университета более оптимизирован, но немного сложен в реализации, или я ошибаюсь?*

Я проверил это решение в NASM / 8086 Ассемблере с различными номерами, и оно работает!: P

...