#assembly #x86
# #сборка #x86
Вопрос:
Итак, у меня есть байтовый массив из 5 элементов, подобных этому:
00000000 00000000 10000001 00000001 10000010
Предположим, что адрес массива находится в esi.
Итак, я выполняю эту команду: shr dword ptr [esi 1],1
и я хочу получить этот результат:
00000000 00000000 01000000 10000000 11000001
Но я получаю такой результат:
00000000 10000000 11000000 00000000 01000001
Итак, может ли кто-нибудь объяснить мне, как я могу получить то, что я хочу получить, и что я делаю не так?
Комментарии:
1. Вместо этого используйте RCR.
2. X86 имеет младший порядковый номер, но вы хотите обрабатывать байты как порядковый номер. Таким образом, у вас есть два варианта: сдвигать каждый байт по одному за раз в цикле, используя RCR, как предложил @Hans, или использовать MOVBE для загрузки больших конечных данных в регистр, сдвигать его и использовать MOVBE для записи его обратно в память. (Обязательно проверьте CPUID, чтобы узнать, есть ли у вашего процессора инструкция MOVBE.)
3. Лучшим предложением было бы определить данные в порядке младших байтов, как и ожидалось на процессоре x86, если только не существует какого-либо внешнего ограничения на формат данных, который требует, чтобы он был определен таким образом.
4. Чтобы обработать 5 байт, выполните первые 4 в качестве dword, затем последний 1.
rcl
or betteradc reg,reg
более эффективен на современных процессорах для сдвига CF в нижнее положение.5. Или , конечно , вы можете загрузить обе части (с
mov
помощью иmovzx
) иshld
/shl
.