Большие двоичные сдвиги в сборке 8086? - PullRequest
2 голосов
/ 09 июля 2010

У меня есть двоичный кусок данных длиной 512 байт, мне было интересно, каким был бы наиболее эффективный способ, если бы я хотел сместить его один раз вправо.

Моя лучшая догадка прямо сейчас (очень плохосборка), я должен был бы сначала проверить блок (вероятно, int), чтобы увидеть, что он сместит, сместит, затем перенесет то, что предыдущий int сместил бы, и продолжит перенос этого смещения вниз по данным.Есть ли более простой способ?Если мне придется использовать эту технику переноса, какой самый большой кусок я могу сдвинуть?DWord?QWORD

Ответы [ 3 ]

2 голосов
/ 09 июля 2010

Если вы просто хотите переключиться один раз, используйте инструкции поворота-переноса.

Сначала убедитесь, что флаг переноса равен нулю. Тогда:

  1. Вставить 4 байта в регистр
  2. RCR
  3. Выпиши обратно
  4. Повторите со следующими 4 байтами
1 голос
/ 09 июля 2010

Сдвиг в x86 очень прост даже для больших структур памяти.

1) Установка или сброс флага переноса зависит от того, что вы будете считать первым битом (LSB) результата.

2) Нет необходимости извлекать данные из регистров, вы можете сразу сдвигать 32 бита в памяти, например:

rcr     dword ptr[edx], 1

или даже лучше

rcr     dword ptr[edx + ecx *4], 1

, где ecx - счетчик цикла и edxуказатель памяти.

2) Сохранить последний сдвинутый бит переноса

РЕДАКТИРОВАТЬ: В памяти вы можете сдвинуть 32 бит и сразу забыть о назначении памяти, сдвинуть 32-битные альтернативные слова, чтобы увеличить скорость выполнения.

0 голосов
/ 09 июля 2010

Процессоры x86 имеют флаг Carry, который прекрасно работает для этой цели.Есть инструкции для переключения с флагом Carry, scr и scl.http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate#Shift_With_Carry_Instructions

...